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()方法?