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((,当计算机找到它时,它会让你使用它,因为它是公共的。