Java方法:@Override vs abstract

时间:2013-01-03 02:31:00

标签: java oop

使用以下某个样式而不是从抽象父类声明方法有哪些优点/缺点:

选项1:

父类:

protected Object retrieve(String id, Object model){
        return null;
}

儿童班:

@Override
public String retrieve(Object model) {
    if (model instanceof Car)
        // ... somehow get id ...
        return getInfo(id, (Car)model);
    return null;
}

...或

选项2:

父类:

protected abstract Object retrieve(String id, Object model);

儿童班:

public String retrieve(String id, Object model) {
    if (model instanceof Car)
        return getInfo(id, (Car)model);
    return null;
}

4 个答案:

答案 0 :(得分:4)

使用抽象类,可以保证子项将覆盖抽象方法(如果有的话)(或者本身是抽象的)。它们也不能被实例化,这很重要,因为它们缺少功能(抽象方法)。

另见http://wiki.answers.com/Q/Use_of_abstract_class_in_java

  

Abstract类与接口类似。你无法实例化   他们,但你可以扩展它们。任何扩展抽象的类   class必须为抽象方法提供实现。于是   这些类可以用作类似类的骨架   可能需要通用功能。这样的功能也可以   嵌入这些类。与接口不同,抽象类可以   也有方法代码。所以它们非常有用。

这可能也会有所帮助:https://softwareengineering.stackexchange.com/questions/96947/why-should-i-declare-a-class-as-an-abstract-class

答案 1 :(得分:3)

在我看来,只有当所有子类都没有实现这个函数时才需要第一个样式(想想可能用接口更好地表达)。如果它是必要的函数,那么更清楚地说抽象更不容易出错,因为编译器会唠叨你实现它。

答案 2 :(得分:1)

你在这里混合苹果和橘子,可能还有一点:

  • @Override是编译时(@Retention(value=SOURCE)),方法级(@Target(value=METHOD))注释,编译器使用它来检查给定方法:
    • interface(注:JDK 1.6+)或
    • 实现方法
    • abstract类或
    • 实现abstract方法
    • 从父类覆盖非final方法(该父类是否为abstract );
  • abstract是一个语言关键字,可以在类级别或方法级别声明:
    • 如果在类级别,这意味着此类无法直接实例化,因此必须将其子类化(例如abstract可以,但是,承担static工厂方法返回其自身的子类;;
    • 如果在方法级别,该方法只有一个原型(见下文),子类必须实现此方法;

请注意,如果类本身不是abstract,则将方法声明为abstract是违法的。

另请注意,这是可能的:

public abstract class MustHaveToString
{
    // .toString() is implemented in Object, here we FORCE children of that class
    // to re-implement it. As the method is abstract, we only declare its 
    // prototype (its return type and method arguments, in this case, none).
    // As the method originates from one of our parents (Object), 
    // we can also @Override it!
    @Override
    public abstract String toString();
}

答案 3 :(得分:1)

首先,您的选项'1'是方法重载的示例。其次,假设你的意思是方法覆盖,在选项'1'中你总是可以从重写方法中调用'super.method'。这在技术上不允许在选项'2'中。因此,这两种技术没有“优点”或“缺点”。

更接近你的'选项2'(不声明'抽象')如下:

public abstract class Parent {
  protected Object retrieve(String id, Object model) {
    throw new UnsupportedOperationException(...);
  }
}