多态的概念:
父类的引用 | 接口的引用 指向不同的 子类 | 实现类 对象,调用同一个方法存在不同的实现方法 | 表现形式。(数组也可以实现多态)
多态的实现效果:
配合方法的重写,当父类引用指向不同的子类对象,同一个方法具有不同的实现方式--->行为多态
要点:
1,多态是方法的多态,不是属性的多态(多态和属性无关)
2,多态的存在要有3个必要的条件:继承 | 接口的实现,方法重写,父类引用指向子类对象。
3,父类引用指向子类对象后,用该父类引用调用子类重写的方法( 父类类型 引用名 = new 子类类型(); ),此时多态就出现了。
多态调用成员的特点:
父类引用调用:
成员变量:
编译运行看父类 | 类型 | 左边
成员方法:
编译看父类 | 类型 | 左边
运行找子类 | 右边 | 对象
注意:
父类引用对 子类 | 实现类 新增内容不可见(要调用新增内容时,需要向下转型)。
多态不配合方法的重写就没有意义
多态是行为的多态
多态练习题
/*
* 做题四大原则:
* 一、继承链:自己没有找父
* A
* |
* B
* / \
* C D
* 二、 ------------------编译看类型、确定方法,运行找对象----------------------------------------------
*
* 三、就近最优原则(没有刚好匹配的形参数据类型就找能兼容的最优(子类找父类)的)
*
* 四、父类引用对子类新增方法不可见
*
* 编译期间能够确定所调用的方法
*/
public class Class003_PolyTest {
public static void main(String[] args) {
A a1=new A(); // A and D A and A
//多态调用
A a2=new B(); // A and D B and A
B b =new B(); // B and B B and A A and D
C c=new C();
D d =new D();
System.out.println(a1.show(b)); //A and A
System.out.println(a1.show(c)); //A and A
System.out.println(a1.show(d)); //A and D
System.out.println(a2.show(b)); //B and A
System.out.println(a2.show(c)); //B and A
System.out.println(a2.show(d)); //A and D
System.out.println(b.show(b)); //B and B
System.out.println(b.show(c)); //B and B
System.out.println(b.show(d)); //A and D
}
}
class A{
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A{
//新增方法
public String show(B obj){
return ("B and B");
}
//重写方法
@Override
public String show(A obj){
return ("B and A");
}
}
class C extends B{
}
class D extends B{
}