了解Java中抽象类的目的

假设我有两个类,A和B。A类定义为抽象类,而B扩展了这个抽象类,最后我测试了结果,两个类都属于同一包。

public abstract class A {

protected abstract void method1();

protected void method2() {

System.out.println("This is Class A's method");

}

}

public class B extends A {

@Override

protected void method1() {

System.out.println("This is B's implementaiton of A's method");

}

}

现在,当我测试它们时:

B b = new B();

b.method1();

b.method2();

我得到预期的输出:

This is B's implementaiton of A's method

This is Class A's method

  • @Override关键字的目的是什么,因为如果我省略它,它仍然可以正常工作。
  • 如果我没有实现抽象方法,则会出现编译错误。那么与实现接口有什么区别?
  • 另外,我也可以method2()在B中实现。然后输出更改为B中的用法。这是否还会覆盖父类方法?那么在A类中将方法显式定义为 抽象 的目的是什么?

回答:

@Override在Java 5中引入(在Java 6中进行了扩展)。这只是提供信息。它说:“我想重写父类或接口中已经存在的内容。

IDE就像Eclipse可以在没有此类父方法的情况下警告您(例如,如果您拼写错误的名称)。在那种情况下,您的方法将不会被调用(因为拼写错误)。

但是,不必对此太担心。

抽象类允许您定义基本功能,而未定义的部分将保留。接口不允许您执行任何操作。您可以对所有情况进行编程,除了在每种情况下真正改变的部分。因此,在需要时,您可以继承并实现缺少的部分。

是。在Java中,您可以覆盖所有未在父类中显式声明为final的方法。没关系。如果要使其不可修改,则可以将其声明为final。例如,如果要声明订单,则可以:

public abstract class Ordering<X>

{

abstract boolean isLower(X a, X b);

abstract boolean isEquals(X a, X b);

final boolean isGreater(X a, X b) {

return !isLower(a, b) && !isEquals(a, b);

}

}

当然,覆盖isGreater以另一种更有效的方式实现它可能是有道理的(想象一下比较起来会很昂贵)。但是在某些情况下,您想提供基本的已经实现的功能(然后是抽象类比接口更好的情况),或者想要强制执行某些实现(然后,当final关键字显示有用时)。

以上是 了解Java中抽象类的目的 的全部内容, 来源链接: utcz.com/qa/405634.html

回到顶部