Java继承中的私有方法

Java继承中的私有方法,java,inheritance,private-methods,Java,Inheritance,Private Methods,我对在继承中使用私有方法感到困惑,例如: 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 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()方法中运行时出错,因此类B似乎无法从类A调用私有方法,因此出现错误的原因是
say(int)
是私有的。这与继承无关。只能在其定义类中调用私有成员方法


为了回答您的继承问题,
B.say()
是一个不同的方法-它甚至不是重写方法
a.say()
,因为派生类不能从其基类继承私有方法。只有受保护的和公共的方法/变量可以被继承和/或重写。

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

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

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

  • Private
    仅允许包含成员的类访问该类 成员
  • Protected
    允许在类和 所有这些都是子类
  • Public
    允许任何人访问该成员

    • 这里发生了两件事

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

      当你说

      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
      中设置为private,看看会发生什么。

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

      您不能覆盖私有方法。受保护的方法是继承的。私有方法不会被继承
      A
      没有公共的
      say()
      方法,因此该程序不应编译。如果你用
      ((B)a)强制它,比如说(12)
      ,那么它会的。嗨,路易斯,谢谢你的回答,我想如果我们在一个超类中有私有实例,我们可以使用getter方法在它的子类中调用它,所以如果我们在一个超类中有私有方法,在子类中是否有调用它们的解决方案?子类可以访问
      protected
      public
      成员。您可以使用
      public
      protected
      setter和getter创建
      private
      变量,子类可以使用这些setter和getter访问
      private
      变量。如果它们是私有方法/实例,则不应该有理由在其类之外调用该方法。试图这样做是代码的气味。但是,您可以在基类中创建公共getter和setter来调用私有方法。。但是封装之所以被发明,还有一个原因。谢谢你的回答,现在我知道如果我需要在子类中保持私有,那么protected是解决方案,但是当我们在超类中有私有实例时,我们可以使用getter方法在子类中调用它,为什么私有方法不能以同样的方式执行?如果您有一个
      private
      成员具有
      protected
      public
      getter,则可以使用getter访问
      private
      方法。为什么?因为getter具有
      protected
      public
      可见性。但是对于上述代码,我无法为类A生成getter和Setter方法,因为没有私有实例,
      getter
      Setter
      通常指允许访问私有变量的公共方法。在本例中,您有一个
      private
      方法。如果要调用此方法,可以做两件事。您可以将该方法的可见性更改为
      protected
      public
      ,或者您可以执行类似于
      getter
      的操作,例如:
      public void getSayMethod(int-someNum){say(someNum);}
      对我来说没有意义。。。但是你可以做到。嗨,nhgrif,通过使用getter方法,我尝试了A.A=newa();A.A=新的B();他们都有指纹,A:12。这是否意味着无论我使用哪个对象(新的A或新的B),它总是打印相同的内容?既然say()是这里的一个实例方法,A不应该=新的B();由于多态性(后期绑定),是否在B中调用say()方法?