继承的层次结构就是这样。
A --> B --> C
和 示例代码如下所示
Class A{
public void method(){....}
}
Class B extends A{
public void method(){.....}
}
Class C extends B{
public void method(){......}
}
要从C类访问A的方法(),我可以在C的方法()中编写像This这样的代码;
public method(){ //To call method() of A, when we call method() in C.
Object obj=super.super();
obj.method();
}
此代码是否适用于我的场景?如果是错的,请告诉我你的答案。
答案 0 :(得分:1)
你不能用Java做到这一点。首先,super.super()
没有意义。 (super();
在构造函数中很有用,但在构造函数之外它并不意味着什么。)其次,如果你有一个C
类型的对象,你就不能创建一个对象变量“同一个对象,但类型A
“,这是你要做的。对象的运行时类型始终为C
。所以即使这是合法的:
public void method() {
A obj = this;
obj.method();
}
即使obj
被声明为A
类型,其运行时的“真实”类型也始终为C
,上述代码将调用method()
{ {1}},这是无限递归。
您可以C
method()
C
之内method()
B
public void method() {
super.method(); // calls the method in B
}
:{/ 1>
method
但是没有办法跳过这个并在A:
中拨打public void method() {
super.super.method(); // illegal
}
protected
如果您认为自己想要这样做,那么您可能需要重新考虑您的设计。一个重写方法通常要么调用父方法,要么添加一些新方法,要么它做一些全新的事情;它通常没有多大意义为它添加一些新的祖父素方法,但跳过在父方法中添加的新东西。毕竟,如果你真的想要这样做,你可以通过在A中添加一个具有不同名称的新{{1}}方法来实现它。
答案 1 :(得分:0)
不,method()
中的A
将覆盖在B中的method()
,然后method()
中的B
会覆盖method()
中的C
1}}然后您无法从method()
拨打A
中的C
。
答案 2 :(得分:0)
这不能在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
}
希望这会有所帮助..
答案 3 :(得分:0)
我建议你做这样的事情。
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
}
}
答案 4 :(得分:0)
我不确定它是否是Java语言设计者的意图,但我会理解:只有单一继承,当C继承自B时,C应该只关心它的直接父级,即B. B决定从孩子身上隐藏A的任何东西,C不应该看到它。
有很多方法可以解决它,例如:
假设在A的设计中,你预见到这种情况,并希望任何级别的儿童班能够使用你的method
,你可以创建一个受保护的儿童使用:
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的开发者决定更改method
的impl但是仍然希望让孩子使用A method
的灵活性,他可以做类似的事情:
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();
}
}