今天复习了java多态,感觉收获颇多。多态的实现方式有两种,继承父类和实现接口。本质体现在重写上,不同的类重写时体现出不同的特征。编译时和运行时的不同上。编译时只能调用父类的方法,如果调用了子类独有的方法,如果是在notepad++上不会报错,但是javac时会编译错误。运行时可以调用父类的方法,如果子类中有和父类方法重名的方法,优先执行子类重写的方法除非调用super,只要编译时为父类了,就不能访问子类独有的方法。如果要访问子类独有的方法,要进行向下转型。
向下转型只能强制转换,子类引用变量指向父类实例,如果父类实例不是同一个子类向上转型得到的,在编译时不会报错,但在运行时会报java.lang.ClassCastException。所以向下转型只有在向上转型后才能用。
向上转型时,父类引用变量指向子类实例,这时可以调用子类中重写父类的方法,但不能调用子类独有的方法,否则在编译时就会报错。
方法中的成员变量不具备多态性,因为变量不会被重写,在编译时有两块存储堆内存,并取决于编译时所声明变量类型。和运行时对象的变量不是一块内存区域。简洁得来说,不能重写就没法表现出多态。
下面两道小练习
1 public static void main(String[] args) { 2 A a1 = new A(); 3 A a2 = new B(); 4 B b = new B(); 5 C c = new C(); 6 D d = new D(); 7 System.out.println("(1)" + a1.show(b)); 8 System.out.println("(2)" + a2.show(d)); 9 System.out.println("(3)" + b.show(c)); 10 System.out.println("(4)" + b.show(d)); 11 } 12 13 class A{ 14 public String show(D obj){ 15 return ("A and D"); 16 } 17 public String show(A obj){ 18 return "A and A"; 19 } 20 } 21 class B extends A{ 22 public String show(B obj){ 23 return "B and B"; 24 } 25 public String show(A obj){ 26 return "B and A"; 27 } 28 } 29 class C extends B{ 30 31 } 32 class D extends B{ 33 34 }
结果如下:
(1)A and A (2)A and D (3)B and B (4)A and D
1 public static void main(String[] args) { 2 A a1 = new A(); 3 A a2 = new B(); 4 B b = new B(); 5 C c = new C(); 6 D d = new D(); 7 System.out.println("(1)" + a1.show(b)); 8 System.out.println("(2)" + a2.show(d)); 9 System.out.println("(3)" + b.show(c)); 10 System.out.println("(4)" + b.show(d)); 11 } 12 } 13 14 class A { 15 public String show(C obj) { 16 return ("A and C"); 17 } 18 19 public String show(A obj) { 20 return "A and A"; 21 } 22 } 23 24 class B extends A { 25 public String show(B obj) { 26 return "B and B"; 27 } 28 29 public String show(A obj) { 30 return "B and A"; 31 } 32 } 33 34 class C extends B { 35 36 } 37 38 class D extends B { 39 40 }
结果如下:
(1)A and A (2)B and A (3)A and C (4)B and B
还有一点,属性是没有多态性的,因为属性不会被重写
1 public class Test03 { 2 public static void main(String[] args) { 3 Base b1 = new Base(); 4 Base b2 = new Sub(); 5 } 6 } 7 8 class Base { 9 Base() { 10 method(100); 11 } 12 13 public void method(int i) { 14 System.out.println("base : " + i); 15 } 16 } 17 18 class Sub extends Base { 19 Sub() { 20 super.method(70); 21 } 22 23 public void method(int j) { 24 System.out.println("sub : " + j); 25 } 26 }
运行结果:
base : 100 sub : 100 base : 70