java多态的理解

class PrivateOverride {
  private void f() { System.out.println("private f()"); }
  public static void main(String[] args) {
    PrivateOverride po = new Derived();
    po.f();
  }
}

class Derived extends PrivateOverride {
  public void f() { System.out.println("public f()"); }
}

public class Test {
  public static void main(String[] args) {
    PrivateOverride.main(args);
  }
}

这个程序的输出是:private f(),我个人理解的原因如下:
1.父类中的private方法、属性对于子类是不可见的,因此也就谈不上什么重写覆盖这些。在重写这个概念中,子类不想要父类方法达到的效果或值,就会去修改,或者覆盖这个方法。如果方法不可见,那子类就不会产生修改父类方法的念头,所以父类中的private方法也就谈不上重写了。

2.再来看看形成动多态的条件:
1)继承

2)继承中必须有方法覆盖

3)必须由父类的引用指向派生类的实例,并且通过父类的引用调用被覆盖的方法

3.可以发现,我们这个例子中的子类和父类并没有满足条件2)。而且原来父类就是通过方法覆盖知道子类修改了自己的方法,现在子类没有重写父类方法,那么子类其实是相当于写了一个f()方法,它只是恰好名字和父类的方法同名一样而已。现在向上转型,我们来联想一下,向上转型后,父类只有被重写后的方法内容和原来的不一样而已,属性、静态方法都一样,也就是说,向上转型后,我们得到的是一个非静态非private方法被修改了,其余部分都没变的父类。这个例子中并没有发生重写,所以所谓的向上转型,其实得到的还是一个原封不动的基类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值