动态绑定如何在Java中用于基类中的私有方法?

时间:2015-11-29 13:25:47

标签: java oop inheritance jvm dynamic-binding

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将被调用。所以,我无法理解的是,如果必须从派生类中调用public sayHello,那么为什么要从基类中查看访问修饰符呢?

另外,如果你能指出一些简明的资源,可以帮助我更深入地理解这一点,我真的很感激。谢谢!

3 个答案:

答案 0 :(得分: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?

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

  

为什么从基指针调用派生的sayHello   不起作用?

只是因为你试图调用不属于open class接口的方法。

  

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

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

  

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

因为您使用了对Base类的引用,并且Base类的接口中没有sayHello方法。

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

Overriding private methods in Java

对您也有用:

Overriding and Hiding Methods

希望它能帮到你。

答案 1 :(得分:1)

因为下面的行只是指定为对象Derived

的变量引用
Base b = d;

并且private方法对于对象是私有的,并且在类外部不可见。

答案 2 :(得分:0)

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

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