【发布时间】:2011-12-01 16:47:15
【问题描述】:
我可以在java中的抽象基类A中实现抽象方法吗?
如果答案是肯定的,并且在基类 A 中有实现的抽象方法,并且有从 A 派生的类 B(B 不是抽象的)。 B 是否仍然必须实现该基本抽象方法?
【问题讨论】:
标签: java methods abstraction base derived
我可以在java中的抽象基类A中实现抽象方法吗?
如果答案是肯定的,并且在基类 A 中有实现的抽象方法,并且有从 A 派生的类 B(B 不是抽象的)。 B 是否仍然必须实现该基本抽象方法?
【问题讨论】:
标签: java methods abstraction base derived
否。抽象方法是由子类定义的。有关详细信息,请参阅Abstract Methods and Classes。但是,如果需要,您可以在基类中定义一个方法并让子类覆盖它。
【讨论】:
是的,但它不能再抽象了。抽象意味着没有实现。
你可以做的是:
interface I {
void meth();
}
//and
abstract class A implements I {
public void meth() {
//implementation
}
}
或者:
abstract class A {
public abstract void meth();
}
//and
abstract class B extends A {
public void meth() {
}
}
如果 A 已经有一个实现,您可以在 B 中覆盖它(如果 B 是具体的),因为 B 从 A 继承了该默认实现。
【讨论】:
你可以有两个抽象类,X 和 Y,其中 Y 扩展了 X。在这种情况下,Y 实现 X 的抽象方法是有意义的,同时仍然是抽象的。另一个非抽象类 Z 可以扩展 Y。但是,在您的示例中,A 实现自己的抽象方法是矛盾的,将它们抽象化的目的是它不提供实现,它只是指定方法签名应该是这样的。
【讨论】:
如果你实现了一个抽象方法,它就不再是真正抽象的了,所以不会。
【讨论】:
抽象类可以有常规方法。如果您想实现类 A 的一些方法,而将其余方法保留为抽象,则可以这样做。但是,抽象方法不能有主体,因此如果将方法标记为抽象,则必须由子类实现,不能在抽象类中实现。但是,你可以有一个没有抽象方法的抽象类,然后子类只需要扩展它。
【讨论】:
如果我正确理解你的问题,是的。
public abstract class TopClass {
public abstract void methodA();
public abstract void methodB();
}
public abstract class ClassA extends TopClass {
@Override
public void methodA() {
// Implementation
}
}
public class ClassB extends ClassA {
@Override
public void methodB() {
// Implementation
}
}
在本例中,ClassB 将编译。它将使用它自己的methodB() 实现,以及ClassA 的methodA() 实现。如果需要,您还可以覆盖 ClassB 中的 methodA()。
【讨论】:
是的,您可以在声明为抽象的类中实现抽象方法。如果一个类被声明为抽象,并不意味着它的所有方法都必须是抽象的。
对于一个具体的子类,实现其超类之一已经实现的抽象方法不是强制性的。
【讨论】: