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


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,那么为什么要从基类中查看访问修饰符呢?

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

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

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

有关访问修饰符的更多信息:

控制对类成员的访问

or is it a redefinition?

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

重新定义方法和重写方法有什么区别?

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

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

仅仅因为您尝试调用不属于开放类接口的方法。

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

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

所以,我不能理解的是,如果它必须向公众打电话 从派生类中说你好,那为什么要看访问修饰符 来自基类?

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

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

在 Java 中重写私有方法

可能对您有用:

重写和隐藏方法

希望它能帮助你。

因为下面的行只是将对象Derived分配为变量引用

Base b = d;

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

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

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

相关内容

  • 没有找到相关文章

最新更新