【问题标题】:Can a class which extends an abstract class be non abstract if it does not implement the methods of the abstract class it extends? [closed]如果扩展抽象类的类不实现它扩展的抽象类的方法,它可以是非抽象的吗? [关闭]
【发布时间】:2020-09-15 00:51:07
【问题描述】:

我已经好几年没有用 Java 编码了,之前也没有正确地修改这个概念。最近,我在某处读到,如果一个实现了抽象类但没有实现其中单个方法的类必须是抽象的。这是真的还是有别的意思?我自己没有尝试过,因为目前我的 PC 无法正常工作,并且在线编译器在加载时卡住了。这是真的吗?提前致谢。

【问题讨论】:

  • 任何有效的最终类都必须实现所有方法。
  • 是的,但是如果有一个类没有实现抽象类的任何方法但扩展它应该被声明为抽象?
  • 只有当抽象类包含或继承抽象方法时,派生类才必须是抽象的。如果抽象基类中的所有方法都已经是具体的,则派生类不必是抽象的。
  • 是的,但我什至尝试使用基类中存在的单个抽象方法。然后派生类也不需要被声明为抽象的并且它工作。我创建了一个抽象类,其中包含一个抽象方法。那么没有实现其方法的派生类就不需要声明为abstract了。
  • 顺便谢谢你指出错误

标签: java oop


【解决方案1】:

根据 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 中已经变得相当陈旧

【讨论】:

  • 你已经实现了示例中抽象类的方法,所以需要它。我的问题是我是否需要声明一个抽象方法,即使它没有从它扩展的抽象类中实现单个方法。例如:如果情况是这样的: abstract class A{ abstract void draw();抽象的无效油漆(); } class B extends A{ public void blah(){ ... } 所以 B 没有实现抽象类 A 的任何方法,而是扩展了它。它应该被声明为抽象的吗?
  • 我相信是的,正如我们在第一个代码块中看到的那样;如果 B 扩展了抽象的 A 并且它没有定义这些方法,那么它必须被标记为抽象的。至少从我可以看到的基于文档并尝试在在线编译器中运行代码。另外,据我记得,implements 关键字是为接口而不是抽象类保留的。
  • 当然,“implement”关键字是用于实现接口而不是扩展抽象类。我也阅读了文档。但是,我在它可以工作的在线编译器上进行了尝试。如果它没有从它扩展的抽象类中实现任何方法,则不需要将其声明为抽象。
  • @user47 只有在没有需要实现的抽象方法的情况下才如此。在您的问题下查看我的评论。
【解决方案2】:

没有。

规则是:

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

【讨论】:

    【解决方案3】:

    当然可以。抽象类 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();
        }
    }
    

    【讨论】:

    • 当A类没有方法时,不作为回答问题的例子。请在您的抽象类中使用至少一种方法来扩展您的答案。
    【解决方案4】:
    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 的更多信息。

    【讨论】:

    • 编译不出来吧?
    • 没错。
    • “不好”和“好的”陈述是否指的是遵循?你的答案不清楚。
    • 没有比以前更清楚了。通常代码在它上面的 cmets 之前。你甚至没有提供一个明确的冒号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    相关资源
    最近更新 更多