1 public class Test { 2 public static void main(String[] args) { 3 Parent p = new Son(); 4 p.show(); 5 System.out.println("a的值为:"+p.a); 6 } 7 } 8 9 class Parent { 10 int a=10; 11 public Parent() { 12 System.out.println("父类无参构造,a的值为:"+a); 13 } 14 public void show() { 15 System.out.println("父类方法"); 16 } 17 } 18 19 class Son extends Parent { 20 int a=20; 21 public Son() { 22 System.out.println("子类无参构造,a的值为:"+a); 23 } 24 public void show() { 25 System.out.println("子类方法"); 26 } 27 }
运行结果:
1 父类无参构造,a的值为:10 2 子类无参构造,a的值为:20 3 子类方法 4 a的值为:10
【结论】
多态存在的三个必要条件 一、要有继承; 二、要有重写; 三、父类引用指向子类对象。
-----------------------------------------------------------------------------------------------------
1)Parent p = new Son(); //多态必须符合右侧类(Son)包含于左侧类(Parent),例如 动物 d = new 猫(),猫是动物。
2)构造方法:创造子类对象时,一定会先访问父类构造方法,对父类数据进行初始化。
3)成员变量:通过多态调用的成员变量仍是父类的成员变量,因为成员变量不存在override(覆盖)问题。
4)成员方法:通过多态调用的成员方法一般仍是父类中的方法,若在相应子类中被override(覆盖),则调用子类重写的方法。
5)静态方法:通过多态调用的静态方法仍是父类的静态方法,因为静态方法虽然能被子类的静态方法“重写”,但严格来讲算不上是override(覆盖)。