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,那么为什么要从基类中查看访问修饰符呢?
另外,如果你能指出一些简明的资源,可以帮助我更深入地理解这一点,我真的很感激。谢谢!
答案 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
课程来调用sayHello
对Derived
类的引用。
所以,我无法理解的是,如果必须打电话给公众 sayHello来自派生类,那么为什么要查看访问修饰符 来自基类?
因为您使用了对Base
类的引用,并且Base
类的接口中没有sayHello
方法。
我在这里找到了一个很好的讨论:
Overriding private methods in Java
对您也有用:
希望它能帮到你。
答案 1 :(得分:1)
因为下面的行只是指定为对象Derived
Base b = d;
并且private
方法对于对象是私有的,并且在类外部不可见。
答案 2 :(得分:0)
b.sayHello()无效,因为当你调用方法sayHello()时,计算机开始在基类中查找方法,当它找到方法时,它会看到它是一个私有方法,所以它会告诉你,你不能使用它。
另一方面,d.sayHello()正在工作,因为计算机将开始在派生的子类中查找sayHello(),当计算机找到它时,它会让你使用它,因为它是公共的。