0

我真的希望我只是缺少一些简单的东西,但我正在阅读以下内容: http: //docs.oracle.com/javase/tutorial/java/IandI/override.html

我有两个类和一个接口。从字面上看,这个 Oracle 文档页面中显示的“用例”。但是,当我运行 JUnit 测试时 -只有超类中的方法被调用 ,并且该方法具有我不想调用的简单默认值:

该接口包含此方法签名:

public interface RecordServiceInterface {
    List<String> searchRecords(String id) throws ServiceException;
}

实现该接口的超类包含此方法并具有默认值 - 当 Eclipse IDE 发现实现类未实现的缺失方法时,它会插入此方法。

public class RecordService implements RecordServiceInterface {
    public List<String> searchRecords(String id) throws ServiceException {
        // TODO Auto-generated method stub
        return null;
    }
}

在运行时,当我逐步通过调试器时,只调用上述内容......每次。

然后子类扩展超类并具有想要覆盖的真实实现:

public class MyRecordService extends RecordService {
    @Override
    public List<String> searchRecords(String id) throws ServiceException {  
        List<String> myList = new ArrayList<String>();

        // ...

        return myList;
    }
}

我一定完全错过了@Override. 在执行期间,它反复无法进入带有@Override注释的方法。

4

4 回答 4

2

@Override 注解所做的只是让编译器在类继承中没有可以被覆盖的任何对应方法时生成错误。因此,它旨在确保您覆盖的方法实际上覆盖了某些东西。

如果未调用 MyRecordService 中的方法,而是调用 RecordService 类中的方法,那么我猜想实例化了错误的对象。因此,您面前的是一个 RecordService 类型的对象,而不是 MyRecordService 类型的对象。

由于您没有提供那部分代码,这只是一个猜测,基于您的继承看起来不错的事实。

于 2013-07-05T23:12:09.377 回答
0

@Override是一个编译时注解,用于验证被注解的方法实际上是否覆盖了超类/接口中的某些内容。它不影响运行时行为。

发布您的测试代码,以便我们更清楚地了解您要做什么。

于 2013-07-05T23:13:59.273 回答
0

正如您在@Override's javadoc中看到的,的保留策略@Override是 SOURCE。换句话说:它在编译时使用但不会生成生成的二进制代码(类文件)。

特别是,SOURCE 保留策略定义为:

注释将被编译器丢弃。

于 2013-07-05T23:15:34.093 回答
0

@Override实际上只是一种在尝试覆盖super class' 或instance' 方法时捕获拼写错误的方法,以及偶尔尝试覆盖final方法(按设计不可覆盖)。

The act of overriding enables a fall-thru approach to overriding method when given a choice of what to call.

例如:

RecordServiceInterface service = new RecordService();
RecordService service2 = new RecordService();

使用serviceand ,将调用service2from 的实现。RecordService现在考虑:

RecordServiceInterface service3 = new MyRecordService();
RecordService service4 = new MyRecordService();
MyRecordService service5 = new MyRecordService();

使用service3service4和,将调用service5from 的实现。MyRecordService

覆盖不会替换父类型的方法,除非它是链的一部分(例如,在最后一个块中创建的所有三个实例,3通过5)。如果您的实例Object不是类型(MyRecordService在这种情况下),则该方法不会以其行为覆盖该实例。 service并且service2仍然会调用RecordService' 的实现。

再举一个例子可能会更清楚:

public interface Runnable {
    void run();
}

public class RunnableA implements Runnable {
    @Override
    public void run() { System.out.println("A"); }
}

public class RunnableB extends RunnableA {
    @Override
    public void run() { System.out.println("B"); }
}

public class RunnableC implements Runnable {
    @Override
    public void run() { System.out.println("C"); }
}

您只能拥有其中任何一个的实例,因此每次调用instance.run(). 它取决于实例的实现,而不是类路径中存在的内容。

于 2013-07-05T23:27:58.123 回答