天天看点

java基础知识整理——多态(二)

1.必要条件:

  • 满足继承关系
  • 父类引用指向子类对象。

2.多态的实现:

  • 多态可由向上转型和动态绑定机制实现。
  • 向上转型:子类对象向上转型为父类类型。
  • 动态绑定:在程序运行期间,JVM根据对象的类型自动的判断应该调用哪个方法,也叫后期绑定。(静态绑定也叫前期绑定,指在程序运行之前进行绑定,由编译器和链接程序完成)
  • 动态绑定例子:
设有一个类Pen,它有三个子类penA,penB,penC;
三个子类都重写了父类中的writing()方法。

静态绑定: 这种调用是在代码中指定的,编译时编译器就知道a调用的是penA类中的writing()方法,b调用的是penB类中的writing()方法。
penA a = new penA();
a.writing();
penB b = new penB();
b.writing();
penC c = new penC();
c.writing();
           
动态绑定:
Pen[] pens = new Pen[5];
int n;
for(int i = 0; i < pens.length; i++){
	n = (int)(Math.random()*3);
	switch(n){
		case 0: pens[i] = new penA(); break;
		case 1: pens[i] = new penB(); break;
		case 2: pens[i] = new penC(); break;
	}
}
for(int i = 0; i < pens.length; i++){
	pens[i].writing();
}
直到运行时才能根据产生的随机数n的值来确定pens[i]到底代表哪一个子类的对象,这样才能最终确定来调用哪一个类的writing()方法,这就是动态绑定。
           

3.向上转型:

问1:这个父类引用能不能调用子类独有的方法?

答:不能,只能调用继承或者重写父类的方法。

java基础知识整理——多态(二)
java基础知识整理——多态(二)
java基础知识整理——多态(二)

问2: 向上转型有什么好处,直接创建子类对象不是更方便吗?

答:向上转型多适用于有多个同父子类的应用场景,此时可借用父类引用,根据需要转为特定的子类对象。

java基础知识整理——多态(二)
java基础知识整理——多态(二)
  • 父类静态方法无法被子类重写,所以向上转型之后,只能调用到父类原有的静态方法。

4.向下转型:

问1:为什么要有向下转型?

答:向下转型一般是为了重新获取向上转型而丢失的子类的特性而存在的,因此,通常向下转型前先进行向上转型,向下转型通常会和instanceof一起使用。

例如:

java基础知识整理——多态(二)
java基础知识整理——多态(二)

5.向下转型易错点:

  • 向下转型需满足向上转型的前提下进行。
  • 类型转换时的括号应用,如上面的例子中的注释部分。

6.关于抽象类:

定义抽象类的意义在于

  • 为其子类提供一个公共的类型(父类指向子类对象)
  • 封装子类中的重复内容(成员变量和方法)
  • 将父类设计为抽象类后,即可借由父类继承关系限制子类的设计随意性,在一定程度上避免了无意义父类的实例化。
  • 一个类继承抽象类后,必须实现其所有的抽象方法,否则也是本身也得定义为抽象类。
  • abstract方法不能用static和private修饰,对于类,不能同时用final和abstract修饰;因为final关键字使得类不能继承,而abstract修饰的类如果不可以继承将没有任何意义。两者放在一起,也会引发编译异常。