覆盖方法

时间:2010-05-27 04:41:59

标签: java

public class Testing extends JDialog {

    public MyClass myClass;

    public Testing() {

    }
}

根据上面的代码,是否可以在Testing类中覆盖myClass中的方法?

说myClass有一个名为computeCode()的方法,我可以覆盖它在Testing中的实现吗?对不起,自从我编码以来已经很久了。

8 个答案:

答案 0 :(得分:2)

是的,通常是可能的(请注意,正如其他人正确提到的那样 - 您需要扩展它以覆盖该方法)。请参阅this sample

public class Animal {
    public void testInstanceMethod() {
        System.out.println("The instance method in Animal.");
    }
}

public class Cat extends Animal {
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat.");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        myAnimal.testInstanceMethod();
    }
}

它不仅可行,而且是多态性和代码可重用性的关键特性。

但请注意,MyClass.computeCode可能是final - 在这种情况下,它无法覆盖。

答案 1 :(得分:2)

您可以覆盖扩展的类的方法。因此,在您的示例中,您的Testing类可以覆盖JDialog的各种现有方法。如果您想覆盖computeCode() MyClass(假设它不是final),则应Testing延长MyClass

public class Testing extends MyClass
{ 
    @Override
    public int computeCode()
    {
        return 1;
    }
} 

答案 2 :(得分:2)

如果要覆盖MyClass中的方法,那么测试类必须扩展它。为了覆盖方法,必须完成IS-A关系,而你的代码属于HAS-A关系。

答案 3 :(得分:1)

您只能在子类(一个类extends您想要覆盖其方法的类的类)中覆盖类的方法。但是,根据您的骨架代码,您可以(在Testing内)具有extends MyClass的嵌套类,并强制将的实例嵌套类转换为myClass实例变量......所以答案必须是“是”。

这是否是最佳选择(而不是使用接口,而不是继承具体类,并依赖依赖注入来获得最适合您测试的实现),这是一个不同的问题(我的答案是,除非你'重新测试你无法认真重构的遗留代码,直到测试覆盖良好......然后,可能不会; - )。

答案 4 :(得分:1)

请参阅,如果要覆盖MyClass的方法,则需要对其进行扩展。 根据您的代码,您似乎想要创建一个包装器MyClass

Wrapper意味着,调用实现的类方法将调用MyClass

的方法

我正在清理包装的工作原理如下。

public class Testing extends JDialog {

    public MyClass myClass;

    public Testing() {

    }

    public void someMethod() {
       //Add some more logic you want...
      ...
      ..
       myClass.computeCode();

    }

}

感谢。

答案 5 :(得分:1)

问题的措辞混淆不清。

以下是一些要点:

  • 你不能@Override一些你没有继承的东西
  • 您不能@Override final

这是一个小例子:

import java.util.*;

public class OverrideExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>(
            Arrays.asList("a", "b", "c")
        ) {
            @Override public String toString() {
                return "I'm a list and here are my things : " + super.toString();
            }
        };
        System.out.println(list);
        // prints "I'm a list and here are my things : [a, b, c]"
    }
}

在这里,我们有一个匿名类,@Override toString()方法继承自java.util.ArrayList

请注意,此处class OverrideExample不会覆盖ArrayList.toString();它是(隐含地)extends ArrayList的匿名类。

答案 6 :(得分:0)

以上所有答案均有效。但是,如果你想扩展JDialog,但如果你想覆盖另一个类的方法,那么通过接口是可能的。接口不具有方法定义,但会有方法声明。有关接口的更多信息,请参阅http://java.sun.com/docs/books/tutorial/java/concepts/interface.html

在您的情况下,您可以使用这样的界面

public interface MyInterface{
     public void myMethod();
}
public class Testing extends javax.swing.JDialog implements MyIterface{
     public void myMethod(){
          // code for your method
     }
}

答案 7 :(得分:0)

由于Testing类已经继承了JDialog,除非实现接口,否则无法再次继承MyClass。你可以做的是使用一些设计模式。然而,这不是重写,因为没有继承。 Adapter是您需要的。你再次失去了多态性的灵活性。

public class Testing extends JDialog {

 MyClass myClass = new MyClass();

 public Testing() {

 }

 public void methodA(){
     myClass.methodA();
 }

}

 class MyClass {
     public void methodA(){}
 }