2010-08-20 61 views
1

语法来调用未覆盖方法

public class D extends B 
{ 
    public void method() {} 
} 

public class B 
{ 
    public void method() {} 

    public void anotherMethod() { method(); } 
} 

在上面,如果你持有d的实例,比如D,d.anotherMethod()导致调用D.method。

在Java中有从另一个方法()中调用B.method()的语法吗?

回答

3

不,没有。派生类必须包含对super.method()的调用。

如果B想要防止子类覆盖method(),则应声明method()final

+0

嗯......这样认为,不像在C++中,如果我记得语法正确的话,你可以完成B :: method()。 – Murali 2010-08-20 18:37:20

+0

B不想阻止子类覆盖方法(),因为B中有其他方法想要调用重写的方法()。当然有办法用多种方法解决它,但只是想知道我是否可以避免它。 – Murali 2010-08-20 18:40:35

+1

这样没有直接的方法...解决方法是检查类的类型并相应地调用方法,但事情会变得混乱... – 2010-08-20 18:44:27

0

您仍然可以通过显式使用超喜欢这个这个调用超级方法:

public class D extends B{ 
    public void method() {} 
    public void anotherMethod() { super.method(); } 
} 

所需的唯一的事情是你重写anotherMethod()。

另一种方式是这样想的。你想anotherMethod调用B法()这样:

public class D extends B{ 
    public void methodInternal() {} 
} 
public class B{ 
    public final void method() { 
     //... 
     methodInternal(); 
    } 
    public void methodInternal() {} 
    public void anotherMethod() { method(); } 
} 

在这里,用户可以通过重写methodInternal()创造自己的method()版本,但仍然是原来的method()的行为是否完好。

+0

是的,我是一个正在开发的B,我无法控制D,我不想让我的B.anotherMethod()调用重写的方法(),但是我自己的。 – Murali 2010-08-20 18:34:58

+0

然后,你必须防止子类覆盖与方法()'final' – 2010-08-20 18:36:35

+0

我不能因为我有B中的其他方法应该调用重载方法() – Murali 2010-08-20 18:38:32

0

你可以在Bmethod()静态,然后把它作为B.method()从需要的地方(你可能需要重命名静态方法,如果你想使用的名称为实例方法)的实例方法。

至少这就是我在类似情况下所做的。

也许你应该重新考虑你的设计。