类的继承
1、概念和语法
概念
根据已有类来设计新类,新类具有已有类的所有功能(属性和行为)。
Java中只支持类的单继承,每个子类只能拥有一个直接超类。
超类是所有子类的公共属性和方法的集合;子类是超类的特殊化。
继承机制可以提高程序的抽象程度,提高代码的可重用性。
超类和子类
子类对象和超类对象的关系:是一种(个)……
子类对象
从外部看它应该包括
与超类相同的接口
可以就有更多的方法和数据成员
其内部包含着超类的所有属性和方法
语法
1
2
3
[ClassModifier] class ClassName extends SuperClassName {
//类体
}
子类不能直接访问从超类继承来的私有属性和方法,但可以使用公有(或保护)方法来访问(如果超类定义了的话)。
2、隐藏和覆盖
属性的隐藏
子类中声明了与超类中相同的成员变量名(实例变量)(静态属性不影响,因为他们都是一个)——从超类继承的变量将隐藏。这时子类中将有两个名字相同的变量,一个继承自超类,一个由自己声明。
当子类执行继承自超类的操作时,处理的时继承来的超类的变量
当子类执行自己声明的方法时,操作的是它自己声明的变量
访问被隐藏的属性
调用从超类继承来的方法
在本类中声明的方法访问需要使用 super.属性 访问
方法覆盖
如果子类不需要使用从超类继承来的方法,可以声明自己的同名方法,称为方法覆盖。
覆盖方法的返回类型、方法名称、参数个数必须和被覆盖的方法完全一致。访问权限可以更宽松,但不能更严格。
区分覆盖方法和被覆盖方法:在方法名前面使用不同的类名或不同的对象名即可区分。
方法覆盖的应用场合
子类中实现与超类相同的功能,但算法或公式不一样;
名字相同的方法中,要做比超类方法更多的事情;
子类中要取消从超类继承过来的方法。
注意事项
必须覆盖的方法:派生类必须覆盖基类中的抽象方法,否则派生类自身将成为抽象类
不能覆盖覆盖的方法:终结方法(final)、静态方法(static)
调用被覆盖的方法:super.被覆盖的方法名();
3、Object类
Object类是所有类的直接或间接超类,处于类层次的最高点,包含了所有Java类的公共属性和行为。
(1) getClass方法
获取当前对象所属类的信息,返回Class对象:
1
public final Class getClass()
返回的Class对象用来代表所属类,可以查询类的各种信息:名字、超类、实现接口的名字等等。
(2) toString方法
返回表示当前对象本身有关信息的字符串对象:
1
2
3
4
//Object类中实现的toString方法
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
(3) equals方法
比较两个对象引用是否指向同一个对象:
1
2
3
4
//Object类中实现的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
相等和同一
相等(equal):两个对象类型相同,属性值相同。
同一(identical):两个引用变量指向的是同一对象。
同一肯定相等,相等不一定同一。
比较运算符 == 判断两个对象是否同一。
equals方法:判断两个对象引用是否同一(this == obj)
String类覆盖了equals方法:可以比较两个字符串对象是否相等。
覆盖equals方法实现对象相等比较
原型必须和Object类中的一样,即:
1
public boolean equals(Object obj)
注意到形参为Object对象,并不知道其具体类型,方法体中首先要比较两者类型是否相同:
1
2
if (this.getClass() != obj.getClass())
return false;
在类型相同的情况下,将obj强制转换成当前类型,之后初始化当前类型的引用:
1
ClassName b = (ClassName) obj;
最后分别比较两者的属性值。
或者使用 instanceof 运算符:
1
2
3
4
5
if(obj instanceof ClassName) {
ClassName b = (ClassName) obj;
//分别比较两者的属性值
}
return false;
(4) clone方法
复制当前对象,并返回副本:
1
protected Object clone()
使用clone方法复制对象
覆盖为public方法:在Object类中被定义为了protected方法(类外不能访问),需要覆盖为public。
实现 Cloneable 接口,赋予一个对象被复制的能力(cloneability)。
1
2
3
4
5
6
class ClassName implements Cloneable {
//……
public Object clone() {
//……
}
}