1、成员方法的多态性
public class Polymorphism{
public static void main(String[] agrs){
BasePolymorphism b = new SubPolymorphism();
b.method1();
}
}
class BasePolymorphism{
public BasePolymorphism(){
//注意:此处调用的将是子类的method2方法
this.method2();
}
public void method1(){
System.out.println("BasePolymorphism method1");
//注意:此处调用的将是子类的method2方法
this.method2();
//因为父类的method3方法是私有的,在子类中不可见,所以子类无法覆盖该方法。
//即使子类中定义了同名方法,也只能算是重新定义了一个方法,该方法也不具有多态性
//注意:此处调用的是父类的method3方法
this.method3();
}
//此方法会被子类的同名方法覆盖
public void method2(){
System.out.println("BasePolymorphism method2");
}
private void method3(){
System.out.println("BasePolymorphism method3");
}
}
class SubPolymorphism extends BasePolymorphism{
//此方法会覆盖父类中的同名方法
public void method2(){
System.out.println("SubPolymorphism method2");
}
//虽然该方法与父类中的方法完全相同,但由于父类中的该方法是私有的,所以此处的方法无法覆盖父类中的同名方法
//该方法只是子类新定义的一个方法
public void method3(){
System.out.println("SubPolymorphism method3");
}
}
/*
运行结果:
SubPolymorphism method2
BasePolymorphism method1
SubPolymorphism method2
BasePolymorphism method3
*/
/*
分析:
如果子类中的某个方法覆盖父类中的同名方法,那么即使是在父类中调用该同名方法,被调用的方法也是子类中的同名方法、而不是父类中的同名方法。
因此如果要在父类中调用将要被子类重写的方法时,必须格外小心。
父类中的私有方法在子类中是不可见的,所以子类无法覆盖父类中的私有方法。
即使子类定义了和父类的私有方法完全相同的方法,也不会覆盖父类中对应的私有方法,仅仅是在子类中定义了一个新方法。
*/
2、成员变量的多态性
与成员方法不同,成员变量不具有多态性。通过引用变量来访问它包含的成员变量时,系统总是试图访问它编译时类型所定义的成员变量,而不是它运行时类型所定义的成员变量。