【问题标题】:private method in inheritance in JavaJava继承中的私有方法
【发布时间】:2013-10-19 02:57:28
【问题描述】:

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

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

【问题讨论】:

  • 你不能覆盖私有方法。
  • 受保护的方法被继承。私有方法不被继承。 A 没有公共的 say() 方法,因此该程序不应编译。如果你用((B)a).say(12) 强制它,那么它会。

标签: java inheritance private-methods


【解决方案1】:

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

  • Private 只允许包含该成员的类访问该成员 成员。
  • Protected 允许在类中访问成员,并且 它的所有子类。
  • Public 允许任何人访问该成员。

【讨论】:

  • 感谢您的回答,现在我知道如果我需要在子类中保持私有,protected 是解决方案,但是当我们在超类中有私有实例时,我们可以使用 getter 方法在子类,为什么私有方法不能这样做?
  • 如果您的private 成员具有protectedpublic getter,则该getter 可用于访问private 方法。为什么?因为 getter 具有 protectedpublic 可见性。
  • 但是对于上面的代码,我无法为A类生成Getter和Setter方法,因为没有私有实例
  • 通常,gettersetter 指的是允许访问私有变量的公共方法。在这种情况下,您有一个 private 方法。如果你想调用这个方法,你可以做两件事。您可以将方法的可见性更改为protectedpublic,或者您可以执行类似于getter 的操作,如下所示:public void getSayMethod(int someNum) { say(someNum); } 这对我来说毫无意义……但您可以这样做。跨度>
  • 嗨 nhgrif,通过使用 getter 方法,我尝试了 A.a=new A();和 A.a=new B();他们都打印,A:12。这是否意味着无论我使用哪个对象(新 A 或新 B),它总是打印相同的东西
【解决方案2】:

这里发生了两件事。

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

当你说

A a = 新 B();

引用是a 类型A,但对象是B 类型。因此,当您调用a.say(12); 时,您正在从A API/接口/视角查看B

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

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

现在,如果您想真正获得一些乐趣,请将 say() 设置为 A 中的受保护和 B 中的私有,看看会发生什么。

【讨论】:

  • 既然 say() 在这里是一个实例方法,不应该 A a = new B();由于多态性(后期绑定)而在 B 中调用 say() 方法?
【解决方案3】:

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

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

【讨论】:

  • 嗨 Lews,谢谢你的回复,我想如果我们在超类中有私有实例,我们可以使用 getter 方法在其子类中调用它,所以如果我们在超类中有私有方法,有没有办法在子类中调用它们?
  • 子类可以访问protectedpublic 成员。您可以使用 publicprotected setter 和 getter 创建 private 变量,子类可以使用这些变量来访问 private 变量。
  • 如果它们是私有方法/实例,那么不应有理由在其类之外调用该方法。试图这样做是代码异味。但是话虽如此,您总是可以在基类中创建公共 getter 和 setter 来调用私有方法.. 但是发明封装是有原因的。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      私有方法在子类中被继承,也就是说私有方法在子类中可用,但不能从子类中访问,因为这里我们要记住可用性和可访问性的概念。

      【讨论】:

        猜你喜欢
        • 2013-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        • 2011-09-26
        • 2013-01-09
        • 2015-03-19
        • 2015-03-07
        相关资源
        最近更新 更多