10. 继承和多态:
1) 关键字super:
子类调用父类的构造函数的语法:
super();和super(参数);
且必须出现在子类构造函数的第一行。
2) 函数覆盖:
子类定义的方法必须与父类方法具有相同的投标制和相同的返回值类型。
实例方法仅当能访问时才能够覆盖。 静态方法也可以继承,但是不能被覆盖,
如果父类中定义的静态方法在子类重新被定义,那么父类中的方法将会被隐藏。
3) 多态性和动态绑定:
为父类设计的任何代码都可以应用于子类,这个特性称为多态性。
假设o为C1、C2、C3……Cn的实例,且C1是C2的子类,C2 是C3的子类Cn-1是Cn的子类,
则在o调用方法p时Java虚拟机会在C1、C2、C3……Cn中查找p的实例,直到找到为止,
且一旦找到一个实现,停止查找并调用这个第一次找到的实例。
发生动态绑定的条件:
1>要有继承。
2>要有重写。
3>要有父类对象指向子类对象。
4>要有父类对象调用重写的方法。
4) 对象类型的转换:
子类对象可以隐式的转换为父类对象:
object o = new sonObject();
父类对象必须显示的转换为子类对象:
sonClass sonObject = (sonObject) object;
转化规则:
1>一个父类对象可以指向其任意的子类对象。
2>一个父类对象不可以访问其子类新增加的成员。
3>可以使用“对象变量名 instanceof 类名(或接口名)”来判断
该变量所指向的对象是否属于该类,即判断子类是否是相应父类的子类。
5) clone方法:
对象、数组都可以实现clone方法:
newObject = oldObject.clone();
newArray[] = oldArray.clone();
复制后newObject和newArray会有单独的内存和空间,并且内 容与oldObject和oldArray相同。
6) getClass方法:
对象调用getClass方法可以显示:
object.getClass();
7)Java中多态的实现:
· 方法的重载overloading:
方法重载主要用于在同一个类中有多个具有相同名称的方法,
包括构造方法的重载,方法具有不同的参数列表如:
public class JavaBeanTest {
// 构造方法的重载
public JavaBeanTest() {
}
public JavaBeanTest(int i) {
}
public JavaBeanTest(String str) {
}
// 自定义方法的重载
public void display() {
}
public String display(int i, int j) {
return i + " " + j;
}
}
· 方法的重写overrride:
方法的重写主要用于当子类和父类具有形同的名称、返回值类型和型参列表,即三者完全相同。
例如:
class Father{
String name = "FaLaLi";
String color = "red";
public void speed(){
System.out.println("The Father name");
}
}
class Son extends Father(){
public void speed(){
System.out.println("The Son name");
}
}
注:方法重写不能使用比被重写方法更严格的访问权限。
在重新定义方法时可以重新定义返回值类型:
public class Bird{
protected String name;
public Bird(String name){
this.name= name;
}
public Bird getCopid(){
return new Bird(name);
}
}
class Chicken extends Bird{
protected String crest;
public Chicken(String name, String crest) {
super(name);
this.crest = crest;
}
//重新定义返回值类型为Chicken
public Chicken getCopied(){
return new Chicken(name,crest);
}
}
注:重新定义的返回值类型必须是父类中同一方法返回值类型的子类型,并且无法重新定义static方法。
多态实现的可以按如下步骤:
1> 子类重写父类的方法。
2> 编写方法时,使用父类定义的方法。
3> 运行时,根据实际创建的对象类型动态决定是用那个方法。