0

是否有可能:

public abstract void someMethod();
...
public void someMethod() {
    // ...
}

在同一个班?还是定义必须在子类中?

4

4 回答 4

6
public abstract void someMethod();

public void someMethod() {
   // ...
}

在同一个类中,即重复方法定义。不可能。方法是基于方法签名而不是基于修饰符来区分的abstract。来自官方Java 教程

方法声明的两个组成部分包括方法签名——方法的名称和参数类型。Java 编程语言支持重载方法,Java 可以区分具有不同方法签名的方法。

问题:

Or does the definition have to be in the child classes?

可以是子类,但必须是层次结构中的具体子类。因此,第一个非抽象子类应该为抽象方法提供实现。同样,来自Java 教程

当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现。但是,如果不是,则子类也必须声明为抽象的。

于 2013-05-14T17:42:04.967 回答
1

您可以在类中有定义,但不能实例化该类,只能实例化子类。

于 2013-05-14T17:38:44.667 回答
0

如果你想强制一个子类实现某些东西,那么你应该这样做:

public abstract void someMethodHelper();

public final void someMethod()
{
    //Stuff
    someMethodHelper();
}

否则,java 默认情况下所有方法都是虚拟的(可覆盖的)。

于 2013-05-14T17:40:25.180 回答
0

简而言之,是的,定义必须在子类中。但是,这引出了一个问题:如果您打算在父类中实现抽象方法,为什么还要使用它呢?我不太确定您要在这里做什么,但这里有一个一般准则:

  • 如果超类具有该方法的行为,则只需使用普通方法(无需抽象)。该方法仍然可以被子类覆盖。

  • 如果超类没有该方法的行为,则使其抽象。所有非抽象子类都将被迫用非抽象子类覆盖此方法。

  • 如果您将抽象方法放在一个类中,那么它就是一个抽象类,并且无法创建该类型的对象(因为它们具有不完整的行为)。

希望这可以帮助。

于 2013-05-14T17:43:19.707 回答