8.多态

来源:互联网 发布:网络推手阿建讲诚信 编辑:程序博客网 时间:2024/05/17 08:14
1.多态实现机制:动态绑定
方法调用机制将方法和方法主体绑定在一起,即确定哪个对象调用哪个方法。
前期绑定:
后期绑定(运行时绑定、动态绑定):参数类型设置父类类型,运行时设置参数等于子类类型对象,子类类型对象向上转型为父类类型,进而使程序正确执行。
对象的实际类型到运行时才能确定,编译器编译时不知道对象的实际类型。

2.多态的可扩展性
对父类添加新的子类不会影响之前已经存在的子类。

3.多态缺陷:覆盖私有方法
public class execrise06 {
  private void method5(){
  System.out.println("execrise06 private method5");
  }
}

public class execrise07 extends execrise06{
  public void method5(){
  System.out.println("execrise07 public method5");
  }
}
//调用:
execrise07 e7=new execrise07();
e7.method5();
execrise06 e6=new execrise07();
// e6.method5(); //报错,不能调用父类私有的方法
运行结果:调用子类的方法method5.
execrise07 public method5

4.多态缺陷:域与静态方法
继承,子类不能重写父类的域。
子类和父类拥有相同的域(类型形同 名字相同 public权限修饰符相同)
编译时:编译器会为父类的域和子类的域分别分配存储空间。这样子类对象包含两个域,子类自己的域和父类的域。默认调用子类自己的域,通过super调用父类的域。


5.初始化和清理
清理的顺序和初始化的顺序相反。

6.协变返回类型
父类类A拥有子类类B
父类类C拥有子类类D
类C中有方法1返回类型是类A
类D中重写父类C的方法1返回类型可以是类A也可以是类D
这就是协变返回类型。
public class exercise02 {
  exercise02(){
  System.out.println("exercise02");
  }
}
public class execrise03 extends exercise02{
  execrise03(){
  System.out.println("execrise03");
  }
}
public class execrise06 {
  public exercise02 method1(){
  return new exercise02();
  }
}
public class execrise07 extends execrise06{
  public execrise03 method1(){
  return new execrise03();
  }
}

//调用:
execrise07 ee=new execrise07();
ee.method1();
//执行结果:生成execrise03的对象,先调用其父类的构造函数,在调用其自己的构造函数
exercise02
execrise03

总结:
子类重写父类方法时,返回类型是可以设置成父类方法返回类型的子类的。

7.纯继承与扩展
纯继承:子类完全重写父类的方法,没有任何扩展方法
子类继承父类的方法后又添加了一些属于自己的扩展方法,这些方法是不能被基类访问的。一旦向上转型,基类对象不能调用这些扩展方法。

父类方法被子类重写,子类对象向上转型为父类类型,此时父类类型对象访问已经被子类重写的方法,访问的不是父类定义的方法而是已经被子类重写的方法。

8.向下转型与运行时类型识别





0 0
原创粉丝点击