--------------------------------------------------------------------------------
1)比较方式角度:
= =是面向过程的操作符;equals是面向对象的操作符
= =不属于任何类,equals则是任何类(在Java中)的一个方法;
我们可以1)Primitive1 (基本类型)= = Primitive2(基本类型);
2)Object Reference1(对象引用)= = Object Reference2(对象引用)
3)Object Reference1 (对象引用) .equals(Object Reference2 (对象引用))
这三种比较
但却不能Primitive1 (基本类型).equals( Primitive2(基本类型));
对于基本类型,没有面向对象中发送消息一说,自然也不会有
方法成员。
2)比较目的角度:
1) 如果要比较两个基本类型是否相等,请用= =;
2) 如果要比较两个对象引用是否相等,请用= =;
3) 如果要比较两个对象(逻辑上)是否一致,请用equals;
第二节:对两个对象(逻辑上)是否一致的阐释:
有人会问:在C++中, 比较两个对象相等不是也可以用==吗?我知道您是指运算符重载,但是很遗憾,Java中不支持运算符重载(java中亦有重载过运算符,他们是“+”,“+=”,不过也仅此两个,而且是内置实现的);所以,对象的是否相等的比较这份责任就交由 equals()来实现 。
这个“逻辑上”其实就取决于人类的看法,实际开发中,就取决于用户的需求;
有人会有看法:“取决于人类的看法”太过宽泛和不严肃,如果某人要两件
风牛马不相及的事物也相等,equals是否也能作出这样的比较呢?我们说可以的
下面这个例子说明了这一点:
class Horse {
String Type;
int Legs;
//相等的标准:腿的数目相等
public boolean equals(Object o){
if(this.Legs==((Cattle)o).Legs){
return true;
}
return false;
}
public Horse(String Type,int legs){
this.Type=Type;
this.Legs=legs;
}
l equals()與==:
比較物件內容 比較是否同一物件
equals() ==
String str1 = new String(“abc”);
String str2 = new String(“abc”);
String str3 = str1;
String str4 = “abc”;
String str5 = “abc”;
str1 / str2 str1 / str3 str4 / str5 str1 / str4
Equals true true true true
== false true true False
l String str = "abc" 跟 String str = new String("abc")在做”==”得到的結果不同。
l long i = 1; double j = 1; // i == j 為true。(因為primitive data type,值相等即為true)
l Long a = new Long(3L); Long b = new Long(3L); Double x = new Double(3.0); //a == b為false(因為reference type,非同一個物件了)。//a == x為compile err(因a與x無繼承關係無法convertible)
l ==的左右兩邊若為不相容的型別轉換,則會發生compiler errors,但若是equals,當物件不相同時equal()會回傳false,不會造成編譯錯誤(equals Float object and Double object will always return false)。
l compares(equals) a Float object and a Double object which will always return false。
l 每個java class都有一個”equals()”method,這個method是使用”==”來比較兩個reference var所存的值(即是否指向一物件)若要比較content是否相同,必須override equals() method,同時也必須override定義於Object class的”hashcode()”method,否則java collection API操作這個class的object時會錯。
l String、Date、File及8個wrapper classes都已override equals() method。
如果hashCode值相同,那object”可能”相同(equal);如果hashCode值不相同,那object”一定”不相同。
1. new 关键字用法 (1)new 运算符 用于创建对象和调用构造函数。 (2)new 修饰符 用于向基类成员隐藏继承成员。 (3)new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。 2.如何把一个Array复制到ArrayList里 (1) 实现1 string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(); list.AddRange(s); (2)实现2 string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(s); 3.DataGrid的Datasouse可以连接什么数据源 l DataTable l DataView l DataSet l DataViewManager l 任何实现IListSource接口的组件 l 任何实现IList接口的组件 4.概述反射和序列化反射 公共语言运行库加载器管理应用程序域。这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。 序列化 序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。 5.概述O/R Mapping 的原理利用反射,配置将对象和数据库表映射。 6. 可访问性级别有哪几种 l public 访问不受限制。 l protected 访问仅限于包含类或从包含类派生的类型。 l internal 访问仅限于当前程序集。 l protected internal 访问仅限于从包含类派生的当前程序集或类型。 l private 访问仅限于包含类型。 7. sealed 修饰符有什么特点 sealed 修饰符可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与 override一起使用。 8.列举ADO.NET中的共享类和数据库特定类共享类 DataSet DataTable DataRow DataColumn DataRelation Constraint DataColumnMapping DataTableMapping 特定类 (x)Connection (x)Command (x)CommandBuilder (x)DataAdapter (x)DataReader (x)Parameter (x)Transaction 9.执行下面代码后: String strTemp ="abcdefg 某某某"; Int i=System.Text.Encoding.Default.GetBytes(strTemp).Length; Int j=strTemp.Length; 问: i=? j=? i=(14 ) ;j=(11 ) 中文两个字节 10.C#中,string str = null 与 string str ="",请尽量用文字说明区别。 string str =""初始化对象分配空间 而string str=null初始化对象 11.详述.NET里class和struct的异同结构与类共享几乎所有相同的语法,但结构比类受到的限制更多: 尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。 结构不能声明默认构造函数(没有参数的构造函数)或析构函数。 结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。结构不能从类或其他结构继承。 结构是值类型 -- 如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。由于结构不使用引用,因此结构没有标识 -- 具有相同数据的两个值类型实例是无法区分的。C# 中的所有值类型本质上都继承自 valueType,后者继承自 Object。 编译器可以在一个称为装箱的过程中将值类型转换为引用类型。 结构具有以下特点: l 结构是值类型,而类是引用类型。 l 向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。 l 与类不同,结构的实例化可以不使用 new 运算符。 l 结构可以声明构造函数,但它们必须带参数。 l 一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.valueType,后者继承自 System.Object。 l 结构可以实现接口。 l 在结构中初始化实例字段是错误的。 12.什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?应用程序域 应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建,运行库宿主负责在运行应用程序之前引导公共语言运行库。应用程序域提供了一个更安全、用途更广的处理单元,公共语言运行库可使用该单元提供应用程序之间的隔离。 托管代码 使用基于公共语言运行库的语言编译器开发的代码称为托管代码;托管代码具有许多优点,例如:跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。 装箱和拆箱 装箱和拆箱使值类型能够被视为对象。对值类型装箱将把该值类型打包到 Object 引用类型的一个实例中。这使得值类型可以存储于垃圾回收堆中。拆箱将从对象中提取值类型。 重载 每个类型成员都有一个唯一的签名。方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。只要签名不同,就可以在一种类型内定义具有相同名称的多种方法。当定义两种或多种具有相同名称的方法时,就称作重载。 CTS通用类型系统 (common type system) 一种确定公共语言运行库如何定义、使用和管理类型的规范。 CLR公共语言运行库 .NET Framework 提供了一个称为公共语言运行库的运行时环境,它运行代码并提供使开发过程更轻松的服务。 CLS公共语言规范 要和其他对象完全交互,而不管这些对象是以何种语言实现的,对象必须只向调用方公开那些它们必须与之互用的所有语言的通用功能。为此定义了公共语言规范 (CLS),它是许多应用程序所需的一套基本语言功能。 强类型 C# 是强类型语言;因此每个变量和对象都必须具有声明类型。 13.值类型和引用类型的区别? 基于值类型的变量直接包含值。将一个值类型变量赋给另�