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、成员变量的多态性
与成员方法不同,成员变量不具有多态性。通过引用变量来访问它包含的成员变量时,系统总是试图访问它编译时类型所定义的成员变量,而不是它运行时类型所定义的成员变量。