【问题标题】:Why does a child object call private method of the super class having main method?为什么子对象调用具有主方法的超类的私有方法?
【发布时间】:2020-09-17 18:45:44
【问题描述】:

在下面的代码中,子类对象调用了它的getBankName()方法,而是调用了父类的私有方法getBankName()。

public class Bank {
    private void getBankName() {
        System.out.println("Bank");
    }
    public static void main(String[] args) {
        Bank bank = new MyBank();
        bank.getBankName();
    }
}

class MyBank extends Bank {
    public void getBankName() {
        System.out.println("MyBank");
    }
}

此外,如果我将父方法的访问说明符更改为 public,则它可以正常工作(子对象调用自己的方法并打印“MyBank”)。为什么调用会因为父方法的访问说明符而受到影响??

【问题讨论】:

  • 请注意,Java 约定是get 方法返回 一个值;而不是void,类型应该是String,你应该是return "Bank"
  • Java 因为安全和封装问题不支持私有方法覆盖,检查:stackoverflow.com/questions/2000137/…
  • 非常糟糕的设计。超类永远不应该知道子类
  • 设计不是我关心的问题,只是想弄清楚为什么会发生。

标签: java inheritance super superclass access-specifier


【解决方案1】:

私有方法不能被覆盖;它们是完全不同的项目,例如重新声明(阴影)字段。

当方法的可见性不是私有的时,编译器使用invokevirtual 指令,该指令负责找到合适的覆盖并执行它。但是,对于私有方法,编译器使用 invokespecial(请参阅“注释”),它明确不允许覆盖。

【讨论】:

  • 非常感谢!这回答了我的疑问。 :)
猜你喜欢
  • 1970-01-01
  • 2015-09-16
  • 2010-10-27
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
相关资源
最近更新 更多