Java 如何在子类的超类的超类中调用方法
继承的层次结构是这样的Java 如何在子类的超类的超类中调用方法,java,oop,object,Java,Oop,Object,继承的层次结构是这样的 A --> B --> C Class A{ public void method(){ // implement your code here. } } Class B extends A{ public void method(){ super.method(); // will call method of A } } Class C extends B{ public void method(){ supe
A --> B --> C
Class A{
public void method(){
// implement your code here.
}
}
Class B extends A{
public void method(){
super.method(); // will call method of A
}
}
Class C extends B{
public void method(){
super.method(); // will call method of B
}
}
及
示例代码如下所示
Class A{
public void method(){....}
}
Class B extends A{
public void method(){.....}
}
Class C extends B{
public void method(){......}
}
要从C类访问A的方法(),我可以在C的方法()中编写如下代码
此代码是否适用于我的场景?。如果错误,请告诉我您的答案。否,
A
中的method()
将在B中被method()
覆盖,然后B中的method()
将在C中被method()
覆盖,那么您就不能调用method()AfromC
中的不,这不能在java中完成。您将得到一个编译器错误,如:“super.super.method();”行中有错误。在Java中,类不能直接访问祖父母的成员。尽管它在C++中是允许的。在C++中,我们可以使用范围解析运算符(::)访问继承层次结构中的任何祖先成员。在Java中,我们只能通过父类访问祖父母的成员。如何在类B和类C的方法()中实现这一点:
void method(){
// method of class B
super.method(); // calls method() of class A
}
void method(){
// method of class C
super.method(); // calls method() of class B
}
希望这有帮助 在Java中不能这样做。首先,super.super()
没有意义。(super();
在构造函数内部很有用,但在构造函数外部它并不意味着什么。)其次,如果您有一个C
类型的对象,您不能创建一个“同一个对象,但类型为a
”的对象变量,这正是您要做的。对象的运行时类型始终为C
。因此,尽管这是合法的:
public void method() {
A obj = this;
obj.method();
}
尽管obj
被声明为类型A
,但它在运行时的“真实”类型始终是C
,并且上面的代码将调用C
中的方法()
,这是无限递归
您可以在C
中调用method()
在B
中调用method()
,如下所示:
public void method() {
super.method(); // calls the method in B
}
但是,没有办法跳过这一步,在以下情况下调用方法
:
public void method() {
super.super.method(); // illegal
}
如果你认为你想这样做,那么你可能需要重新考虑你的设计。重写方法通常要么调用父方法并向其添加新的内容,要么执行全新的内容;在祖父母方法中添加一些新内容通常没有多大意义,但是跳过在父方法中添加的一些新内容。如果在所有这些之后,您真的仍然想这样做,那么您可以通过在一个具有不同名称的中添加一个新的protected
方法来实现 我建议你这样做
A --> B --> C
Class A{
public void method(){
// implement your code here.
}
}
Class B extends A{
public void method(){
super.method(); // will call method of A
}
}
Class C extends B{
public void method(){
super.method(); // will call method of B
}
}
我不确定这是否是Java语言设计者的意图,但我可以理解这一点:只有单继承,当C从B继承时,C应该只关心它的直接父级,即B。如果B决定对其子级隐藏A的任何内容,C应该看不到这一点
有很多解决方法,例如:
假设在A的设计中,您预见到了这种情况,并希望任何级别的子类都能够使用您的方法
,您可以创建一个受保护的子类供其使用:
class A {
protected void methodInternal() {...}
public void method() { methodInternal(); }
}
class B extends A {
public void method() {
someOtherLogic();
}
}
class C extends B {
public void method() {
methodInternal();
somethingElse();
}
}
如果是B的开发人员决定更改方法的impl,但它仍然希望保留让孩子使用A的方法的灵活性,他可以做如下操作:
class A {
public void method() { }
}
class B extends A {
public void method() {
someOtherLogic();
}
protected void originalMethod() {
super.method();
}
}
class C extends B {
public void method() {
originalMethod();
somethingElse();
}
}
你试过运行它吗?用一些容易识别的东西,比如类名的println
,填写A
和B
方法的实现。然后测试它,看看自己会发生什么。如果它甚至没有编译,很明显你的问题的答案是“不”。尽管如此,我还是建议如果C
需要使用A
的实现,那么它可能更适合直接作为A
的子类。如果它同时使用A
和B
中的内容,那么类可能太少,应该将常见的功能分解为它自己的结构。super.super();--编译错误首先,修复方法声明(没有返回类型,并且它们不是空的)。其次,我认为您需要super.super.method()代码>谢谢Frisch,但是super.super.method()将无法工作。这将是一个错误,因为它违反了JAVA的封装属性。但是,只要成员字段不是私有的,它总是可以访问这些字段。如果不能使用超级.field
,则可以使用((A)this).field
)。但这对方法不起作用。如果您想使用super关键字调用父类方法,则此代码将起作用,否则您可以创建父类的类对象,然后调用父类的方法。@iamygish您实现的方法没有任何返回类型。在Java中,任何类型的方法/函数都必须返回。@Qadir我刚才提到了如何解决这个问题。是的,我知道返回类型是必须的。这是很酷的Qadir,但根据我的要求,我不应该更改a类和B类中的任何代码。只有在C类中,我可以做编码。还有一件事,我不应该直接为类A创建对象。