java多态需要满足以下条件:
1、子类继承父类
2、方法的覆盖(重写)
3.、父类的引用指向子类的对象(对于父类中的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法)-----归纳起来就是:调用方法时,先看父类是否有该方法,没有编译报错,如果有,去调用子类的重写方法
关于向上转型后的方法调用:向上转型,在运行时,会遗忘子类对象中与父类对象中不同的方法。也会覆盖与父类中相同的方法–重写。(方法名,参数都相同)
当在调用子类中的非重写方法时,会转向父类中寻找,父类也没有向更高一级寻找;
经典实例,一看便知:
public class Testmm{
public static void main(String[] args){
A a = new A();
B b = new B();
C c = new C();
A a2 = new C();
System.out.println("第一组------------------");
b.m1();
c.m2();
a.m3();
System.out.println();
System.out.println("第二组------------------");
c.m1();
c.m2();
c.m3();
System.out.println();
System.out.println("第三组------------------");
a.m1();
b.m2();
c.m3();
System.out.println();
System.out.println("第四组------------------");
a2.m1();
a2.m2();
a2.m3();
}
}
class A{
int ivar = 7;
void m1(){
System.out.print("A's m1, ");
}
void m2(){
System.out.print("A's m2, ");
}
void m3(){
System.out.print("A's m3, ");
}
}
class B extends A{
void m1(){
System.out.print("B's m1, ");
}
}
class C extends B{
void m3(){
System.out.print("C's m3, " + (ivar + 6));
}
}
运行结果:
第一组------------------
B's m1, A's m2, A's m3,
第二组------------------
B's m1, A's m2, C's m3, 13
第三组------------------
A's m1, A's m2, C's m3, 13
第四组------------------
B's m1, A's m2, C's m3, 13