8

我对在继承中使用私有方法感到困惑,例如:

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);

    }
}

基于上面的代码,我对私有方法的继承感到困惑,私有方法是从class Ato继承的B吗?还是两个类中的 say 方法完全不相关?由于代码在 main() 方法中运行时出现错误,似乎class B无法从class A.

4

6 回答 6

20

如果您希望子类能够访问需要保留的超类方法private,那么protected就是您要查找的关键字。

  • Private只允许包含该成员的类访问该成员。
  • Protected允许在类及其所有子类中访问成员。
  • Public允许任何人访问该成员。
于 2013-10-19T03:01:33.490 回答
2

这里有两件事。

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

当你说

A a = 新 B();

引用是a类型A,但对象是类型B。所以当你调用时a.say(12);,你是BAAPI/interface/perspective 来看的。

其次,因为你是B从这个A角度来看的,你会得到一个错误,因为A没有调用 public 方法say()。当然B可以,但请记住您将B其视为A. 当您这样做时,您将失去任何引用那些不知道的B方法的能力(除非您稍后施放,但暂时不要担心) 。A

最后,B实际上从来没有继承say()自,A因为它首先看不到它,并且A没有say()任何人可以访问的公共方法。

现在,如果您想真正获得一些乐趣,请在say()受保护A和私密的情况下B,看看会发生什么。

于 2013-10-19T03:14:49.843 回答
1

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

要回答您的继承问题,这B.say()是一种不同的方法 - 它甚至不是覆盖方法A.say(),因为派生类不能从其基类继承私有方法。只有protectedpublic方法/变量可以被继承和/或覆盖。

于 2013-10-19T03:00:07.873 回答
0

私有意味着您只能在该类中访问它,而不能在其他任何地方访问它。

于 2013-10-19T03:00:13.420 回答
0

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

于 2013-10-19T03:00:36.360 回答
-1

私有方法在子类中继承,这意味着私有方法在子类中可用,但不能从子类访问,因为这里我们必须记住可用性和可访问性的概念。

于 2020-08-30T09:43:46.377 回答