我有一个B类,它从A类延伸,B类覆盖了A类的方法:
public class ClassB extends ClassA {
@Overrides
protected void DoSomething() {
super.DoSomething();
// Some ClassB code here, called WorkB
}
}
之后,我创建了一个B类对象,除了DoSomething()中的A版本之外,我还需要做一些额外的事情:
ClassB objB = new ClassB() {
@Overrides
protected void DoSomething() {
// I need to do something more here
}
}
我需要知道我是否可以完成所有ClassA
个工作,ClassB
有效,然后在此方法中为objB添加一些其他代码?我有一个解决方案:在public method
中创建一个ClassB
,WorkB
,然后在objB
中,只需调用该方法。但我想知道是否有另一种方式(无论是更糟糕还是更好我的解决方案!)。
编辑:我将总结这个问题,以便您轻松理解:
Class A
的{{1}}方法可以完成一项名为WorksA的工作。doSomething
会覆盖Class B
,调用super.doSomething()和一些额外的代码,这意味着它会doSomething
和一个名为WorksA
的额外代码。 / LI>
WorksB
objB
方法必须执行doSomething()
,WorksA
以及另一个额外的WorksB
。就是这样。
答案 0 :(得分:4)
是的,只需先打电话给super.doSomething()
然后它会一直打到A级,然后再打到B级。之后你可以做特定的事情。
public class A {
public void doSomething() {
System.out.println("A, ");
}
}
public class B extends A {
public void doSomething() {
super.doSomething();
System.out.println("B, ");
}
}
public static void main(String[] args) {
B b = new B() {
@Override
public void doSomething() {
super.doSomething();
System.out.println("new B");
}
};
b.doSomething();
}
输出A,B,新B
答案 1 :(得分:2)
您的对象是ClassB的匿名子类的实例,您可以完全相同的方式覆盖:
ClassB objB = new ClassB() {
@Override
protected void DoSomething() {
super.DoSomething();
// do something more here just for this object.
}
}
此代码将首先调用ClassB
DoSomething()
版ClassA
,该版本调用ClassA
版本。所以净效果首先是ClassB
的东西,然后是@Override
的东西,然后是特定于匿名子类的东西。
我认为你的注释错了。它是DoSomething()
没有“s”。可能只是一个错字。
另请注意,您的doSomething()
是非标准命名。根据Java中通常命名的方法,你最好调用它{{1}}。