Java继承和多态的底层原理

当子类继承父类以后,子类的对象为什么可以访问到父类中定义的方法?当子类Override了父类中的方法以后,访问的是子类Override以后的方法,这是怎么实现的?当子类Override了父类的方法以后,还有办法得到父类的方法吗?博客:重写(overwrite)、重载(overload)和覆盖(override)三者之间的区别

  • 子类已经覆盖了父类,并且重写了父类的方法, 一般来说, 就没有必要用子类调用父类中被覆盖的方法了.(否则就不要覆盖了啊)
  • 要实现也是可以的 ,我们 需要为子类提供一个其他的方法,用于去调用父类中被覆盖的方法
class A {//父类
    public void print() {
        System.out.println("父类的print方法");
    }
}
 
class B extends A {//子类
    @Override
    public void print() {
        System.out.println("子类的print方法");
    }
     
    // 在子类里创造一个方法去调用父类的方法
    public void fuLeiPrint() {
        super.print(); //super指向父类
    }
}
 
public class Test {
 
    public static void main(String[] args) {
        B b = new B();
        b.print();
        b.fuLeiPrint();
         
//      A a =(A)b; // 这样强转还是打印的子类的方法,因为内存中还是子类
//      a.print();
 
    }
}

为什么下面代码

public class Main {
    public static void main(String[] args) {
        Father father = new Child();
        father.say();
    }
}

的输出为:

Hello From Child

呢? 明明是用的Father的引用去访问的子类的对象,按照多态的字面理解,应该表现出Father的方法。
我的解释如下:Father的引用指向的是Child的对象,而Child中又把Father中的方法给覆盖了,所有表现出来的还是Child中被覆盖的方法,不是Father中的方法。Father只是提供了一个View Port(视口)来访问Child对象。
博客:Java中方法的继承以及父类未被子类覆盖的方法调用的问题
下面博客讲解的更加深入:
java:方法的虚分派(virtual dispatch)和方法表(method table)
自制Java虚拟机(五)实现继承、多态、invokevirtual
Java语言的动态性-invokedynamic
Java编程的逻辑 (17) - 继承实现的基本原理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值