假设我有两个类,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
@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关键字显示有用时)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句