了解Java中抽象类的目的

911涡轮增压:

假设我有两个类,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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章