如果扩展抽象类的类未实现其扩展的抽象类的方法,则它可以是非抽象的吗?

时间:2020-09-15 00:51:07

标签: java oop

我已经有好几年没有用Java编码了,以前也没有适当地修改这个概念。最近,我在某处读到,如果一个实现抽象类但不从中实现单个方法的类必须是抽象的。是真的还是其他意思?我自己尚未尝试过此操作,因为当前我的PC无法正常工作,并且在线编译器在加载时卡住了。是这样吗预先感谢。

4 个答案:

答案 0 :(得分:2)

根据oracle文档https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html#:~:text=An%20abstract%20class%20is%20a,may%20not%20include%20abstract%20methods.&text=When%20an%20abstract%20class%20is,must%20also%20be%20declared%20abstract%20

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

如果我们要尝试执行以下操作:

abstract class A {
  abstract void draw();
  abstract void paint();
}

class B extends A {
  public void draw() {
    System.out.print("B implements A draw");
  }

  public void paint() {
    Systemout.print("B implements A paint");

  }
}

class C extends A {
  public void draw() {
    System.out.print("B implements A draw");
  }
}

public class Main {

  public static void main(String[] args) {
    System.out.println("Hello world!");
    B b = new B();
    C c = new C();

    b.draw();
    b.paint();
    c.draw();
    c.paint();
  }
}

然后我们将收到以下编译器错误C is not abstract and does not override abstract method paint() in A

但是,如果我们将C定义为抽象类,然后创建一个具体的类D,则该类将简单地扩展C如下:

abstract class C extends A {
  public void draw() {
    System.out.print("C implements A draw");
  }
}

class D extends C {
   public void paint() {
      System.out.print("D implements A paint");
   }
}

并且当然将我们的main方法更新到现在实例化类D而不是C的位置(因为我们无法实例化抽象类),然后我们获得了成功的编译和运行时间。因此,作为答案,是的,如果您拥有一个extends抽象类的类,但是没有实现所有方法,那么它也必须是抽象的。我希望我能回答你的问题;我的经验主要是.NET,而我在Java方面已经过时了

答案 1 :(得分:2)

否。

规则是:

  1. 如果类包含任何抽象方法(通过扩展抽象类或本身具有抽象方法),则必须将其声明为抽象。
  2. 如果将一个类声明为抽象的,则无论该类是否实现了所有抽象方法,都将其视为抽象的。

答案 2 :(得分:1)

当然可以。抽象类A没有任何方法,子类B扩展了A并且未声明为抽象。

abstract class A {
//empty
}

class B extends A {
    public void draw() {
        System.out.print("B implements A draw");
    }
}

public class Main {
    public static void main(String[] args) {
        B b = new B();
        b.draw();
    }
}

答案 3 :(得分:0)

abstract class Class1 {
    int val = 0;   
    abstract public int doit();
       
    public int done() {
           return val;
    }
}

以下内容不会编译。所有抽象方法都必须实现。

class Child1 extends Class1 {
}

以下内容将编译。继承的抽象方法和子类中的方法不必实现。

abstract class Child2 extends Class1 {
}

您可以在Java语言规范中阅读有关Abstract classes的更多信息。

相关问题