Java中inheritance的私有方法
我对在inheritance中使用私有方法感到困惑,例如:
public class A { private void say(int number){ System.out.print("A:"+number); } } public class B extends A{ public void say(int number){ System.out.print("Over:"+number); } } public class Tester { public static void main(String[] args) { A a=new B(); a.say(12); } }
基于上面的代码,我对私有方法的inheritance感到困惑,是从class A
inheritance到B
的私有方法吗? 或者两个类中的say方法完全不相关? 由于代码在main()方法中运行时出错,似乎class B
无法从class A
调用私有方法。
如果您希望子类可以访问需要保持private
的超类方法,那么protected
是您正在寻找的关键字。
-
Private
仅允许包含该成员的类访问该成员。 -
Protected
允许在类及其所有子类中访问该成员。 -
Public
允许任何人访问该成员。
您收到错误的原因是因为say(int)
是私有的。 这与inheritance无关。 您只能在其定义类中调用私有成员方法。
要回答你的inheritance问题, B.say()
是一个不同的方法 – 它甚至不会重写方法A.say()
因为派生类不能从其基类inheritance私有方法。 只能inheritance和/或覆盖protected
和public
方法/变量。
私有意味着你只能在那个类中访问它而在其他地方访问它。
子类只能从超类中调用或覆盖protected
或public
方法(或没有访问修饰符的方法,如果超类位于同一个包中)。 private
方法保留在它们声明的类中,并且对于任何其他类都不可见,无论它们如何相关。
这里有两件事。
首先,请记住引用类型和对象类型之间的区别。
当你说
A =新B();
引用是A
类型,但对象是B
类型。 所以当你打电话给a.say(12);
,您正在从A
API /接口/透视图中查看B
其次,因为你从A
角度看B
,你会得到一个错误,因为A
没有名为say()
公共方法。 当然B
确实如此,但记住你将B
视为A
当你这样做时,你将失去任何能力(除非你后来投射,但现在不要担心)引用A
不知道的那些B
方法。
最后, B
实际上从未从A
inheritancesay()
,因为它首先看不到它,并且A
没有公共方法say()
供任何人访问。
现在,如果你想真正享受一些乐趣,请在A
保护say()
,在B
保护私人,看看会发生什么。