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 Ainheritance到B的私有方法吗? 或者两个类中的say方法完全不相关? 由于代码在main()方法中运行时出错,似乎class B无法从class A调用私有方法。

如果您希望子类可以访问需要保持private的超类方法,那么protected是您正在寻找的关键字。

  • Private仅允许包含该成员的类访问该成员。
  • Protected允许在类及其所有子类中访问该成员。
  • Public允许任何人访问该成员。

您收到错误的原因是因为say(int)是私有的。 这与inheritance无关。 您只能在其定义类中调用私有成员方法。

要回答你的inheritance问题, B.say()是一个不同的方法 – 它甚至不会重写方法A.say()因为派生类不能从其基类inheritance私有方法。 只能inheritance和/或覆盖protectedpublic方法/变量。

私有意味着你只能在那个类中访问它而在其他地方访问它。

子类只能从超类中调用或覆盖protectedpublic方法(或没有访问修饰符的方法,如果超类位于同一个包中)。 private方法保留在它们声明的类中,并且对于任何其他类都不可见,无论它们如何相关。

这里有两件事。

首先,请记住引用类型和对象类型之间的区别。

当你说

A =新B();

引用是A类型,但对象是B类型。 所以当你打电话给a.say(12); ,您正在从A API /接口/透视图中查看B

其次,因为你从A角度看B ,你会得到一个错误,因为A没有名为say()公共方法。 当然B确实如此,但记住你将B视为A 当你这样做时,你将失去任何能力(除非你后来投射,但现在不要担心)引用A不知道的那些B方法。

最后, B实际上从未从Ainheritancesay() ,因为它首先看不到它,并且A没有公共方法say()供任何人访问。

现在,如果你想真正享受一些乐趣,请在A保护say() ,在B保护私人,看看会发生什么。