CoreJava(第五章)继承-03

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]访问元素。

发布了90 篇原创文章 · 获赞 284 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41293896/article/details/103995413