【问题标题】:How does dynamic binding work for private methods in base class in Java?Java 基类中的私有方法如何动态绑定?
【发布时间】:2015-11-29 13:25:47
【问题描述】:
class Base {
    private void SayHello(){ //PRIVATE
        System.out.println("Hello from Base");
    }
}

class Derived extends Base {
    public void sayHello(){ //PUBLIC
        System.out.println("Hello from Derived");
    }
}

public class TestHello{

    public static void main(String[] args) {
        Derived d = new Derived();
        Base b = d;

        d.sayHello(); //works as expected
        b.sayHello(); //Why does this not work?
    }
}

我想了解:基类的私有 sayHello 对派生类可见吗?还是重新定义?为什么从基指针对派生的 sayHello 的调用不起作用?我的意思是,如果它是公共的(在 Base 中),那么派生类中的 sayHello 就会被调用。那么,我不能理解的是,如果它必须从派生类中调用公共的sayHello,那为什么还要从基类中查看访问修饰符呢?

另外,如果您能指出一些简明的资源来帮助我更深入地理解这一点,我将不胜感激。谢谢!

【问题讨论】:

  • 当你在子类中提供一个覆盖父实现的实例方法时,这是被调用的方法,而不是父类。

标签: java oop inheritance jvm dynamic-binding


【解决方案1】:

基类的私有sayHello对派生类可见吗?

当然不是,因为它有 private 访问修饰符。

更多关于访问修饰符:

Controlling Access to Members of a Class

or is it a redefinition?

正如您在此问题的已接受答案中看到的那样:

What's the difference between redefining a method and overriding a method?

“重新定义”一词并不常用。我们可以谈论“覆盖”和“重载”,但在您的情况下,来自Derived 类的sayHello 是一种新方法,它不是来自Base 类的sayHello 的重载版本。

以及为什么从基指针调用派生的sayHello 不行吗?

只是因为你试图调用不属于开放类接口的方法。

我的意思是,如果它是公开的(在 Base 中),那么来自 派生类会被调用。

当然,这是一种预期的多态行为。在这种情况下,来自Derived 类的sayHello 将覆盖来自Base 类的sayHello,因此您可以通过对Base 类的引用从Derived 类调用sayHello

所以,我无法理解的是,如果它必须打电话给公众 sayHello 来自派生类,那为什么要看访问修饰符 来自基类?

因为你使用了Base类的引用,而Base类的接口中没有sayHello方法。

我在这里找到了一个很好的讨论:

Overriding private methods in Java

可能对你也有用:

Overriding and Hiding Methods

希望对你有帮助。

【讨论】:

    【解决方案2】:

    因为下面的行只是简单地赋值为对象Derived的变量引用

    Base b = d;
    

    private 方法是对象私有的,在类之外不可见。

    【讨论】:

      【解决方案3】:

      b.sayHello() 不起作用,因为当您调用方法 sayHello() 时,计算机开始在基类中查找该方法,当它找到该方法时,它会看到它是一个私有方法,所以它会告诉你,你不能用它。

      另一方面,d.sayHello() 正在工作,因为计算机将开始在派生的子类中寻找 sayHello(),当计算机找到它时,它会让你使用它,因为它是公共的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-20
        • 2017-01-13
        • 2011-12-06
        • 1970-01-01
        • 2011-04-16
        • 2016-04-02
        • 1970-01-01
        • 2014-01-27
        相关资源
        最近更新 更多