5.2Object:所有类的超类
1)Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的。
2)我们可以使用Object类型的变量引用任何类型的对象。
如:
Object obj = new Employee("张三",5000); // 说明我们可以使用Object类型来作为Employee类型的对象
3)Object类型的变量只能用于作为各类值的通用持有者,如果想对里面的内容进行具体操作,还需要进行相应的类型转换。
如:
Employee e = (Employee) obj; // 如果我们想对Employee里面的内容进行操作,则需要进行类型转换
4)Java中,只有基本类型不是对象;不管是对象数组还是基本类型的数组,它们都扩展了Object类。
如:
Employee[] staff = new Employee[10]; obj = staff; // ok;对象数组 obj = new int[10]; // ok;基本类型数组
5.2.1equals方法
1)Object类中的equals方法用于检测一个对象是否等于另一个对象。
2)Object类中,equals这个方法将判断两个对象是否具有相同的引用。
如:两个员工的姓名、身份证、薪水和入职日期都是一样的,我们就认为他们是相等的。
public boolean equals(Object otherObject) { // 如果当前和传入的值一致,返回true if (this == otherObject) return true; // 如果传入的值为null,返回false if (otherObject == null) return false; // 如果getClass不等于传入值的getClass,返回false if (getClass() != otherObject.getClass()) return false; // 现在我们可以知道otherObject是一个非空参数 Employee other = (Employee) otherObject; // 测试是否有相同的值 return name.equals(other.name) && salary == other.salary && hireday.equals(other.hireday); }
其中:getClass方法将返回一个对象所属的类。
5.2.2相等测试与继承
Java语言规范要求equals方法具有以下特性:
1 ) 自反性 : 对于任何非空引用 x , x.equals(x)应该返回 true。
2 ) 对称性 : 对于任何引用 x 和 y , 当且仅当 y.equals ( x ) 返回 true , x.equals ( y ) 也应该返
回 true。
3 ) 传递性 : 对于任何引用 x 、 y 和 z , 如果 x . equals ( y ) 返 N true, y . equals ( z ) 返回 true ,
x . equals ( z ) 也应该返回 true 。
4 ) 一致性 : 如果 x 和 y 引用的对象没有发生变化, 反复调用 x . eqimIS ( y ) 应该返回同样
的结果。
5 ) 对于任意非空引用 x , x . equals ( null ) 应该返回 false
5.2.3hashCode方法
hashCode叫散列码,是由对象导出的一个整型值。
如:
String s = "OK"; System.out.println(s.hashCode()); // 散列码是2524 String t = new String("OK"); System.out.println(t.hashCode()); // 散列码是2524 System.out.println(s.equals(t)); // true
5.2.4toString方法
toString方法:表示对象值的字符串。
例:一个普通的toString方法
public String toString() { return "Employee [name=" + name + ", salary=" + salary + ", hireday=" + hireday + "]"; }
我们可以将以上代码通过getClass().getName()获得类名的字符串,而不用将类名硬加到toString方法中。
public String toString() { return getClass().getName() + "[name=" + name + ", salary=" + salary + ", hireday=" + hireday + "]"; }
如果父类中使用了getClass().getName(),那么子类只要调用super.toString()就可以了。
public class ObjectTostring extends Employee{ public String toString() { return super.toString() + "[salary=" +salary +"]"; } }
我这里之所以可以访问Employee的salary域,是因为我将salary声明为了protected类型,这样子类ObjectTostring就可以直接访问父类里面的域了。
protected double salary;
Java中规定:在调用如x.toString()的地方可以用""+x替代。
x.toString(); // 可以用""+x替代
表示:这条语句将一个空串与x的字符串表示相连接。
5.3泛型数组列表
1.一旦我们确定了数组的大小,想要改变它就不是很容易的?
解决这个问题最简单的就是:ArrayList类。
2.ArrayList是一个采用类型参数的泛型类,如
ArrayList<Employee>
3.JDK1.7之后省去了右边的类型参数,如
// 1.7以前的写法 ArrayList<Employee> staff = new ArrayList<Employee>(); // 1.7之后的写法,省去了右边的类型参数 ArrayList<Employee> staff = new ArrayList<>();
4.数组列表的操作魅力:
如果我们在调用ArrayList中的add方法时,内部数组已经满了,这时数组就会自动地创建出一个更大的数据,并将所有的对象从较小的数组中拷贝到较大的数组中。
其中size()方法将返回数组列表中包含的实际元素数目。等价于数组的length。
5.3.1访问数组列表元素
1.数组列表自动扩展容器的便利的同时,增加了访问元素语法的复杂程度。
2.小技巧:
既可以灵活扩展数组,又可以方便的访问数组的元素。
1)首先,创建一个数组,并添加所有的元素。
ArrayList<X> list = new ArrayList<>(); while(...) { x= ...; list.add(x); }
2)使用toArray方法将数组元素拷贝到另一个数组中。
X[] a = new X[list.size()]; list.toArray(a);
3.注意事项
不必指出数组的大小 。
• 使用 add将任意多的元素添加到数组中。
• 使用 size ()替代 length 计算元素的数目。
• 使用 a.get(i)替代 a[i]访问元素。