• 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  
  • 相关阅读:
    UML和序列图
    MVC超链接
    《Flink SQL任务自动生成与提交》后续:修改flink源码实现kafka connector BatchMode
    分布式条件下Integer大小比值的问题
    distribute by在spark中的一些应用
    桌面秀
    结构体sizeof的问题
    Android开发:View中调用自定义dialog出现的异常
    获取Android的源码
    【原创】VS2010中水晶报表与VS2008水晶报表版本冲突问题
  • 原文地址:https://www.cnblogs.com/Yxxxxx/p/6853672.html
Copyright © 2020-2023  润新知