Java中的继承:父类和子类的关系

一、父类引用指向子类对象时

 

1、若子类覆盖了某方法,则父类引用调用子类重新定义的新方法

2、若子类未覆盖某方法,则父类引用调用父类本身的旧方法

3、若子类覆盖了某属性,但父类引用仍调用父类本身的旧属性

4、若子类未覆盖某属性,则父类引用调用父类本身的旧属性

5、父类引用不能访问子类新定义的方法

 

二、子类引用指向自身对象时

 

 

1、若子类覆盖了某方法,则子类引用调用子类重新定义的新方法

2、若子类未覆盖某方法,则子类引用调用父类本身的旧方法

3、若子类覆盖了某属性,则子类引用调用子类重新定义的新属性

4、若子类未覆盖某属性,则子类引用调用父类本身的旧属性

5、子类引用可以访问子类新定义的方法

 

三、示例代码

 
B.java
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. public class B {  
  2.   
  3.     int a = 1;  
  4.     int b = 2;  
  5.   
  6.     void f1() {  
  7.         System.out.println("B.f1()");  
  8.     }  
  9.   
  10.     void f2() {  
  11.         System.out.println("B.f2()");  
  12.     }  
  13.   
  14. }  

C.java
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. public class C extends B {  
  2.   
  3.     int a = 3;  
  4.   
  5.     @Override  
  6.     void f1() {  
  7.         System.out.println("C.f1()");  
  8.     }  
  9.   
  10.     void f3() {  
  11.         System.out.println("C.f3()");  
  12.     }  
  13.   
  14.     public static void main(String[] args) {  
  15.   
  16.         B b = new C();// 父类引用指向子类对象  
  17.         b.f1();// 子类覆盖了该方法,所以父类引用调用新方法  
  18.         b.f2();// 子类未覆盖该方法,所以父类引用调用旧方法  
  19.         // b.f3();此行去掉注释会报错,父类引用不能访问子类新定义方法  
  20.         System.out.println(b.a);// 子类覆盖了该属性,但父类引用仍旧访问旧属性  
  21.         System.out.println(b.b);// 子类未覆盖该属性,父类访问旧属性  
  22.   
  23.         System.out.println();  
  24.   
  25.         C c = new C();// 子类引用指向自身对象  
  26.         c.f1();// 子类覆盖了父类方法,所以调用新方法  
  27.         c.f2();// 子类未覆盖父类方法,所以调用旧方法  
  28.         c.f3();// 子类调用自己新定义的方法  
  29.         System.out.println(c.a);// 子类覆盖了该属性,所以访问新属性  
  30.         System.out.println(c.b);// 子类未覆盖该属性,所以访问旧属性  
  31.     }  
  32. }  

输出:
[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. C.f1()  
  2. B.f2()  
  3. 1  
  4. 2  
  5.   
  6. C.f1()  
  7. B.f2()  
  8. C.f3()  
  9. 3  
  10. 2  
posted @ 2017-05-14 20:29  Jachin  阅读(4763)  评论(0编辑  收藏  举报