第一章:初识Windows程序

1.1:第一个wondows程序

1.1.1:认识windows程序

Form1.cs:窗体文件:程序对窗体编写的代码一般都存放在这个文件(还有拖动控件时的操作和布局,还有设置一般的属性)      F4:跳到设置属性的界面  F7:跳到逻辑代码文件

From.Designer.cs:窗体设计文件:一般拖动控件自动生成的文件(很少修改)

From.resx:资源文件:配置图片等资源。

Program.cs: 主程序文件:包含main方法的程序入口,如果要改执行的窗体直接run后面的文件名

Public  partial   class  Form1:Form

{

//这个相当于partial是部分意思,,他继承了Form文件的所有属性和方法(:表示继承)

}

属性

说明

Name

窗体对象的名称,用来在代码中标识

BackColor

窗体的背景颜色

BackgroundImage

窗体的背景图片

FormBorderStyle

窗体边框的样式

MaximinzeBox

窗体是否最大化

ShowIntaskBar

窗体是否出现Windows任务栏

StartPosition

窗体第一次出先的位置

Text

窗体标题栏显示的文本

TopMost

Xz显示在某个窗体之上

WindowState

窗体的初始化状态  包括MaxMinzed(最大化) Minmized(最小化)

方法

说明

Close()

关闭窗体

Show()

显示窗体

ShowDiaLog()

模式化窗体    (如果打开了,只有关闭了此窗体,其他窗体才能操作)

Hide()

隐藏窗体

1.1.3:基本控件

标签(label):用于显示不能编辑的文本或图像 ,常用来在窗体上的其他控件做标注或说明

属性

说明

Image

在标签上显示的图片

Text

在标签上显示的文本

文本框(TextBox)用于获得用户输入的信息和用户显示的文本

MaxLength

指定可以在文本框输入的最大字符

Multiline

表示是否可以在文本框输入多行文本

PasswordChar

输入的字符可以用一个符号或者什么来替换(属性值可以是*,输入实际的就可以隐藏)

ReadOnly

指定是否可以编辑(只读)

Text

与文本框关联的文本

组合框(ComboBox):先当于下拉框和文本框的结合体。可以输入文本或进行选择

Items

组合框的项

DropDownStyle

组合框的风格  一般(DropDownList)只能下拉

Text

与组合框关联的文本

SelectedIndex

当前选中的索引(下标),从0开始 (返回int类型)

SelectedItem

获取选中的项,返回object类型,返回选中项的值

事件

说明

Click

单击事件

SelectedIndexChanged

选中项后发生的事件

按钮(button):用户通过点击来进行操作

Endable

返回bool类型的值,控件是否可用

Text

按钮上显示的文本值

TextAlign

按钮上文本的对齐方式

事件

说明

Click

点击事件

1.2:事件的处理

1.单击要创建处理的控件(双击直接完成,然后跳转,直接写代码)

2:在属性找到事件的标志(闪电)

3:双击要处理的事件

4:编写处理的逻辑代码        (This:代表当前窗体)

1.3:增强窗体的友好性

1.3.1:Messagebox消息框(返回的是一个DiaLogresult类型的值)

语法:MessageBox.Show(显示的提示字符串,消息的标题,消息框的按钮,消息框图片)

例子:

  • ·DiaLogResult result=MessageBox.Show( “确定要退出吗?”,”操作提示”,messageBoxButtons.YesNo,   MessageBoxIcon.Question  );

If(result==DialogResult.yes)

{

This.Close();

}

1.3.3:窗体体的跳转

语法:

按钮下的事件

先确定即将跳转的窗体的名字:

FrmADminMain(跳转的窗体) frmAmdin =new  FrmADminMain();    //创建一个窗体对象

FrmAmdin.Show();       //显示此窗体

This.Hide();      //隐藏当前窗体

1.3.4:窗体间的数据传递

在即将跳转的(下一个)窗体申明一个空的字符串   String name=string.Empty

在(本)窗体的 代码

FrmADminMain(跳转的窗体) frmAmdin =new  FrmADminMain();    //创建一个窗体对象

frmAmdin.name=textuserName.text,trim();    //把这边的文本的值传递给下一个窗体的name属性

FrmAmdin.Show();       //显示此窗体

This.Hide();      //隐藏当前窗体

第二章:构建良好的windows程序

2.1:使用菜单栏和工具栏

2.1.1:菜单栏的控件MenuStrip

属性

说明

Name

代码中菜单对象的名称

Items

在菜单中显示的集合

Text

与菜单相关的文本

菜单项的主要属性

属性

说明

Name

代码中菜单项的名称

DropDownItems

在子菜单中显示的项的集合

text

与菜单项相关的文本

事件

说明

Click

点击事件

Application   Exit();    //退出程序方法

This.close()     //退出当前窗体方法

分割线的做法:减号(-),回车

快捷键:(&A-Z)

2.1.3:使用工具栏控件ToolStrip

工具栏的属性

属性

说明

ImageScalingsize

工具栏显示图片的大小

Items

工具栏的项的集合

工具栏上面的按钮和标签的主要属性和事件

DisplayStyle

图像和文本的显示方式,包括文本,图片,和什么都不显示

Image

按钮或标签的图片

Imagescaling

是否调整按钮或标签上的图片大小

text

显示的文本

TextImageRelation

按钮和图片的显示相对位置

Click

点击事件

2.2:使用windows的基本控件

2.2.1:使用窗体的基本控件

单选按钮(radiobutton):选择的项的集合

Checked

指示是否被选中(Radio.checked==true)表示已选中

Text

按钮上的文本

事件

Click

点击事件

分组框(GroupBox)和panel容器

GroupBox

Panel

用于逻辑上一组控件

为了易于操作,把多个控件放在一起

日期控件(DataTimePicker):功选择日期的控件

属性

说明

Maxdate

取得的最大日期

Mindate

取得的最小日期

Value

日期的值(相当于Text)

Format

用于设置格式

2.2.2:排列窗体的控件

Anchor:如果锚定了 ,各边距就会不会改变(选中深灰),一直保持此距离,与某条边

Dock:停靠   在那一边   (Fill是填充窗体的空余部分)

2.2.3:创建MDI应用程序

概念:同时打开多个窗体,但是不会打开多个程序    有一个父窗体,几个子窗体

步骤:

在父窗体的IsMdiContaner设置为true,    表示他是一个父窗体了

在(按钮)跳转的时候

FrmEdit   frm = new  FrmEdit();

frm.MdiParent=this;             //他的父窗体就是这个窗体

frm.show();

2.3:组合框comboBox控件

Count

获得集合中的数目

DropDownStyle

设置组合框的样式   一般:GropDownlist(只能下拉)

IsreadOnly

H获取指定能够修改集合的值

Item

集合中指定的索引项

Add()

向组合框添加项

Clear()

清除所有项

Remove()

从组合框中移除指定项

例:CboGrade.items.Add(“一年级”);  //添加

CboGrade.selectedIndex=0;    //默认选择第一项(坐标为0)

第三章:使用listview控件展示数据

3.1:图像列表控件

3.1.1:图像列表控件Imagelist

使用场景:为多个控件或则窗体提供的一部分图片

属性

说明

Images

储存的所有图片的复数

ImageSize

图片的大小

transparentColor

被视为透视的颜色

ColorDepth

获取图片列表的颜色深度

3.2:列表视图控件(listView控件)

说明:用于创建项windows资源管理器的用户界面,有大图标(LargeIcon)小图标:(smallIcon)

列表(List)详细信息(Detail)平铺(Tile)

Columns

详细信息中显示的   列头(上面)

FullRowselect

当选择一项时,他的子项全部一起选中(一行)

Items

Listview的项的集合

MuiliSelect

是否允许选泽多项

Selected Intems

选中项的集合

View

指定listview的显示模式

LargeimageList

绑定设置显示大图标时的图片

SmallImageList

绑定设置显示小图标时的图片

事件

说明

MouseDoubleClick

双击事件

方法

Clear()

清除listview项

设置大小图表模式的代码:大:this.lvcomputer.view=view.largeIcon

小:this.lvcomputer.view=view.smallIcon

3.3:contextMenuStrip控件

说名:快捷菜单:又叫上下文菜单

属性

说明

DisPlayStyle

指定是否显示图片和文本

Image

显示在菜单项的图片

Text

显示 在菜单项的文本

Click

单击事件

向listView中添加数据

ListviewItms   Items=new listviewitems(new stirng[] { “主项(第一个项)”, “子项“, “子项”, },图片的坐标(2)   );.   //添加图片的坐标

第四章:实现windows程序的数据更新

4.1:枚举

4.1.1:使用枚举的好处:可以避免不合理的赋值

定义枚举类型:访问修饰符  enum  枚举名{ 值1,值2 }

1:枚举的类

例:public  enum  Genders

{

男,女       //定义枚举类

}

2:另一个类

Public  class  Student

{

public   Genders   studentGender;   //定义枚举属性

Pubicl  void  Show( “我的性别是:“+ studentGender );   //显示方法

}

3:有main方法的类

Student   student=new Student();    //创建对象

Student.studentGender=Genders.男;

Stuent.Show();   //调用显示方法

4.3:使用windows高级控件

4.3.1:图片框控件(PictureBox)

用于显示一张图片的控件

属性

说明

Image

图片框显示的图片

SizeMode

指定如何处理图片的位置和大小

4.3.1:计时器(Timer)控件

可以控制每隔一定的事件触发一次事情   事件(Tick事件)

属性

说明

InterVal

事情触发的频率,一般以毫秒为单位

Endabled

是否启用事件

事件

Tick

指每隔一段时间发生的事情

Start()

启用计时器

Stop()

停止计时器

Int index=0;

例子:Tmrabout_Tick

{

If(index<this.ilimages.images.count-1)

{

Index++;

}else

{

Index=0;

}

This.pbAbout(此图片框控件).Image=this.ilimages.images[index];

}

模式窗体:FrmAbout,frmAbout=new FmAbout();

frmABout.ShowLog();

第五章:实现windows的数据绑定

5.1:DataSet对象

5.1.1:DataSet(数据集)对象

说明:相当于一个零时仓库,吧程序要用的数据零时存放在数据集里面,。不需要与数据库连接,可以直接在数据集里面读取数据,也可以先对数据集的数据进行修改,然后提交到数据库里面           (数据集独立于任何数据库,不会直接和数据库打交道)

5.1.2:创建DataSet数据集

位置:位于System.Data包下面

语法:DataSet   dataset=new   DataSet();         //创建对象

5.2:DataAdapter(适配器):对象

(相当于货车):

DataAdapter:属性和方法

SelectCommand

从数据库检索Command对象

方法

说明

FILL()       填充数据集

向DataSet中的表填充数据

UPDate()    修改后提交到数据集

向DataSet中的数据提交数据库

语法:

DataSet   dataset=new   DataSet();

sqlDataApater  对象  =new SqlDataApater  ( sql语句,数据库连接的connection对象   );

调用dataAdapter的对象Fill方法填充数据到数据集。

语法:dataApter.Fill( 数据集对象(dataSet),“数据表的名称(table)” );

整体步骤:

DataSet   dataset=new   DataSet();

String  str=“select   *  from   Student”;

SqlConnection   connection=new   sqlCOnnection( 连接的字符串 );

sqlDataApater  对象  =new SqlDataApater  ( sql语句,数据库连接的connection对象   );

dataApter.Fill( 数据集对象(dataSet),“数据表的名称(table)” );

绑定(网格视图):this.dataGridView.DataSoure  = ds.tables[“table”];   //绑定是的是网格视图

绑定(下拉框):this.cboGrade.DataSoure=ds.table[“table”];    //下拉框的数据源

This.CboGrade.ValueMember=”GradeId”;     //绑定隐藏的值(可能会做后续处理)

This.cboGrade.DispiayMember=”GradeName”;      / /绑定显示出来的值(用户选择)

5.3:数据绑定

5.3.1:comboBox数据绑定

属性

说明

DataSource

数据源

DisplayMember (选中显示值,Cbo.Text==?)

获取显示在用户界面的值

ValueMember  (选中隐藏值,(cbo.selectedValue==?))

隐藏的值(实际值),查找时可以做为条件,应为是主键

绑定(下拉框(comboBox)):this.cboGrade.DataSoure=ds.table[“table”];    //下拉框的数据源

This.CboGrade.ValueMember=”GradeId”;     //绑定隐藏的值(可能会做后续处理)

This.cboGrade.DispiayMember=”GradeName”;      / /绑定显示出来的值(用户选择)

插入一行新的:语法:

:DataRow  row=ds.Tables[“Grade”].Newrow();    //创建一行新的

row[“GradeId”]=-1;                           //第一列的值是编号: 为-1

row[“GradeName”]=”全部”;                    //第二列的值是年级名称:为全部

ds. Tables [“Grade”].Rows.InsertAt(row,0);         //把这一行插入到数据集的Grade表的行中     第一行(坐标0)

5.4:DataGridView控件

概念:数据网格视图控件:可以直接删除,修改数据,如果要显示那个表的数据,直接设置DataSource的属性:表示数据源

属性

说明

AutoGeneerrateColumns

设置DataGirdView是否自动创建列

Columns

列的集合(列头集合),网格视图的头部

DataSource

DataGirdView的数据源

ReadOnly

是否只读(可以编辑)

DataGirdView各列的属性

ColumnType

列的类型

DataPropertyName

绑定数据列的名称   (必须与数据库的列名一样)

HeaderText

列的标题文本(列头)

Visible

指定列是否可见

FroZen

指定水平滚动,列是否可以移动

ReadOnly

指定单元格是否可读

Selected

DataGirdView必用属性:

AllowUsertoAddRows

(DataGirdView)可以取消掉默认展示出来的多余一行

AutoSizeColumnSMode       值为:Fill(填满)

选择是否自动调整列的宽度

ColHeaderVisvile

是否显示列头

Cloumns

列的集合

ContextMEnuStirp

绑定快捷菜单

MultiSelect           一般:false

是否可以多行选中

ReadyOnly

只读

RowsHeaderVisible     一般:false

行头是否可见

SelectionMode       一般:FullRowSelect:整行选中

如何选择单元格

Visible

指定改控件是否可见

AutoGenerateColumns

是否自动创建列    默认:true

dgvStudentInfo.SelectedRows.count;

当对网格视图进行操作的时候,需要先判断一下选中的行的个数是否大于0,才进行操作

对数据库进行修改操作()

SqlCommandBuilder:只能操作一个表的内容

接着上面的操作,修改 ,    先直接双击修改表中的内容,然后保存(保存按钮事件中的代码如下:)

SqlCommandBuilder  builder=new   SqlCommandBUilder(adapter);

Adapter.Update(ds.”Student”);

数据网格视图(DataGirdView):的值获取:一般是Value:应为只有网格才有单元格所以:当只能选择一行的时候:         dgvStudent.selectedCells[0] .Value;   获取第一个选择的单元格的内容;

DgvStudent.selectedRows[0].Cells[0].Value;

列表视图(listView):获取值一般:Text结尾:

listView.SelectedItems[0].Text;     //这个是获取主项的值(第一个项的值)

listView.SelectedItems[0].SubItems[0].Text;  // 获取第一个子项的值(也就是第二个,应为主项在第一个)

listView.SelectedItems[0].SubItems[1].Text;   // 获取第二个子项的值(也就是第三个,应为主项在第一个)

第六章:数据的筛选和排序

6.1:TreeView控件

6.1.1:认识Treeview控件

概念:树形控件(TreeView)用于以节点形式显示文本和数据,这些节点按层次结构的顺序排列。

Tree的属性和事件

属性

说明

Nodes

TreeView中的所有根节点

ImagesList

存放TreeView中节点的图像

ImageIndex

节点默认的图片索引

SelectedImagesIndex

节点选中的图像的索引

SelectedNode

当前选中的父节点

事件

说明

AfterSelect

选中节点的事件

TreeNode(节点)的属性和事件

Text

节点上的文字

ImageIndex

节点默认的图像索引,不设置会与Tree一样

SeletedImageIndex

节点选中的图片索引

Level

节点的深度(从0开始)

Nodes

当前节点包含的子节点集合

ParentNode

当前节点的父节点

Tag

当前节点可以设置的隐藏值(可以用来做标记)当做条件判断

SelectNode.parent.Text;

当前的父节点的文本

selecNode.Tag

得到选中节点设置的隐藏值

Select.Text

选中的节点的文本

Splitcontainer

拆分器(把一个窗体拆开)

6.2:Dataview

6.2.1:认识DataView

DataView:为我们提供了动态视图,并对动态生成的视图进行排序,筛选,它的主要任务就是运行Windows控件的进行数据绑定。

DataView,DataSet,DataTable:关系

l  一个DataSet中可以有多个DataTable,一个DataTable可以生成多个DataView视图

l  创建DataView对象语法:

DataView 数据视图名=new DataView(DataTable对象)

DataView  dataview=new DataView(dataset.Tables[“Student”])

DataView的常用属性

Table

用于获取设置源的DataTable

Sort

把DataView生成的数据排序(dv.sort=””;)(相当于Oder  by)

RowFilter

获取或设置筛选条件(相当于Where)

只不过要先创建dv.RowFilter=stirng.format(“  ”,num);

Count

在应用RowFilter后,获取DataView的行数

最后别忘记了绑定数据源:dgvStudentInfo.DataSource=dv;

(就是这个数据网格视图的数据源就是用数据表创建的这个数据视图)

6.3:在DataGridView中实现删除操作

步骤:

1:先判断一下选中的行数是否大于0:DgvStudentInfo.SelectedRows.COUNT>0;

2:先获取选中的行的主键列的值(唯一的):SelectedRows[0].Cells[“StudentNo”].values;

3:编写Sql语句实现删除操作  注意:(如果有多表关联,先删子表,再删主表,而且两个sql语句可以写在一起,先删除的在前面,中间用分好隔开 )

DataGirdView必用属性:

AllowUsertoAddRows

(DataGirdView)可以取消掉默认展示出来的多余一行

AutoSizeColumnSMode       值为:Fill(填满)

选择是否自动调整列的宽度

ColHeaderVisvile

是否显示列头

Cloumns

列的集合

ContextMEnuStirp

绑定快捷菜单

MultiSelect           一般:false

是否可以多行选中

ReadyOnly

只读

RowsHeaderVisible     一般:false

行头是否可见

SelectionMode       一般:FullRowSelect:整行选中

如何选择单元格

Visible

指定改控件是否可见

AutoGenerateColumns

是否自动创建列    默认:true

//    考点

String connStr = "Data Source=.;Initial Catalog=MySchool;User ID=sa;Password=sa";

public void BindTeacherInfo()

{

this.dgvTeacherInfo.AutoGenerateColumns = false;    //不自动添加列

this.dgvTeacherInfo.Columns["colGradeId"].Visible = false;  //隐藏列

//0.准备sql语句

StringBuilder sb = new StringBuilder();

sb.Append(" select id,name,age,teachYear,g.gradeId,gradeName from Teacher as T ");

sb.Append(" inner join Grade as G ");

sb.Append(" on G.GradeId=T.gradeId");

//1.获得连接对象

SqlConnection conn = new SqlConnection(connStr);

//2.创建数据适配器

SqlDataAdapter adapter = new SqlDataAdapter(sb.ToString(),conn);

//adapter.SelectCommand = new SqlCommand(sql,conn);

//3.创建数据集

DataSet ds = new DataSet();

//4.填充数据

if(ds.Tables["Teacher"]!=null){

ds.Tables["Teacher"].Clear();

}

adapter.Fill(ds,"Teacher");

//5.绑定数据源

this.dgvTeacherInfo.DataSource = ds.Tables["Teacher"].DefaultView;

}

.net窗体程序的基础知识及详细笔记的更多相关文章

  1. sql sever 基础知识及详细笔记

    第六章:程序数据集散地:数据库 6.1:当今最常用的数据库 sql  server:是微软公司的产品 oracle:是甲骨文公司的产品 DB2:数据核心又称DB2通用服务器 Mysql:是一种开发源代 ...

  2. java基础知识及详细笔记

    第一章:初识java 1.1.java的概述 ü  什么是计算机程序:计算机按照某种顺序而完成的一系列有序指令的集合. ü  Java的作用:1:安装和运行本机上的桌面程序.2:通过浏览器访问面向in ...

  3. 【Demo 0004】屏幕、窗体及视图基础知识

    本章学习要点       1.  了解iOS中应用程序(UIApplication)与屏幕.窗体以及视图相关基础知识:       2.  掌握应用程序常用的属性与方法:        3.  掌握窗 ...

  4. 《Python编程:从入门到实践》基础知识部分学习笔记整理

    简介 此笔记为<Python编程:从入门到实践>中前 11 章的基础知识部分的学习笔记,不包含后面的项目部分. 书籍评价 从系统学习 Python 的角度,不推荐此书,个人更推荐使用< ...

  5. 【学习笔记】:JavaScript基础知识超详细总结!

    目录 一.JavaScript的实现 二.JavaScript语言的特点 三.JS与HTML如何结合 四.JS中的数据类型 四.JS的原始数据类型 2.JS的引用数据类型 五.JS引用数据类型之函数 ...

  6. 微信小程序开发基础知识总结

    微信小程序在无论在功能.文档及相关支持方面,都是优于前面几种微信账号类型,它提供了很多原生程序才有的接口,使得我们的小程序在很多方面突破H5页面应用的限制,更加接近原生程序的功能,因此微信小程序具有很 ...

  7. 滚动条实现RGB颜色的调制(窗体程序)--JAVA基础

    1.用到的JFrame类的对象frame的方法: frame.setLayout(); 设置框架布局格式,有frame.setLayout(new GridLayout(5,1));为网格布局格式 f ...

  8. php对文件操作(读、写、)的基础知识(详细)

    文件位置如下图所示: 1.判断是文件还是目录 var_dump(filetype("./aa/bb/cc.txt")); 输出: string(4) "file" ...

  9. JavaScript基础知识(学习笔记)

    1.    在JavaScript中所有事物都是对象:字符串.数字.数组.日期等等2.    在JavaScript中,对象是拥有属性和方法的数据3.    属性是与对象相关的值,方法是能够在对象上执 ...

随机推荐

  1. postman 第2节 数据同步和创建测试集(转)

    启动postman 后在右上角可以登录账号,登录后就可以同步自己的api测试脚本,连上网在办公区在家都可以同步. 创建测试集 1.点击collections,点击add folder 2.create ...

  2. 高阶自定义View --- 粒子变幻、隧道散列、组合文字

    高阶自定义View --- 粒子变幻.隧道散列.组合文字 作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:h ...

  3. 垃圾收集器Serial 、Parallel、CMS、G1

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt378 这里介绍4个垃圾收集器,如果进行了错误的选择将会大大的影响程序的性能. ...

  4. MacOS下免密码ssh登陆

       由于配置过程中需要频繁的进行ssh连接到开发服务器执行命令以及通过scp命令向服务器拷贝文件等依赖ssh连接的操作.所以,配置本地环境跟服务器之间的ssh免密码连接可以有效的提升工作效率.    ...

  5. 团队作业4----第一次项目冲刺(Alpha版本)4.25

    a.提供当天站立式会议照片 会议内容: ①:对有的接口编写遇到的困难,由于基础问题,建议百度,谷歌现成的接口 ②:课程较多,时间不够,任务的调整以及进度的调整 b. 每个人的工作 每个人在尽量完成自己 ...

  6. 团队作业8——Beta 阶段冲刺7th day

    一.当天站立式会议 二.每个人的工作 (1)昨天已完成的工作(具体在表格中) 完善支付功能 (2)今天计划完成的工作(具体如下) 测试与正式发布 (3) 工作中遇到的困难(在表格中) 成员 昨天已完成 ...

  7. 201521123016 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过? ...

  8. java课程设计-表达式运算(团队博客)

    1 团队课程设计博客 1 团队名称.团队成员介绍 团队名称 奔跑吧土拨鼠 团队成员 洪亚文 201521123065 网络1513 郑晓丽 201521123066 网络1513 2 项目git地址 ...

  9. 201521123074 《Java程序设计》第1周学习总结

    1. 本章学习总结第一周学习总结: 学习了java语言的历史与发展,运行过程,安装了eclipse编程平台,试着编写了java程序. 2. 书面作业: Q 1.为什么java程序可以跨平台运行?执行j ...

  10. Java:实现对象的比较 comparable接口和comparator接口

    在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...