请解释抽象class与具体class的区别?

Please explain the difference between abstract class VS concrete class?

我有一个抽象 class 有两个未实现的(抽象)方法,一个实现的方法和一个静态方法,如下面的代码。

public abstract class AbstractClass1 {
  static void test(){
    System.out.println("111");

 }
 public abstract void test2();

 public abstract void test3();

 public void test4(){
    System.out.println("222");
 }

}

我正在将此 class 扩展到其他摘要 class 中,如下面的代码

public abstract class AbstractClassImplementation 
          extends  AbstractClass1 {

  public static void main(String[] args) {
    System.out.println("java abstract doubt");
    }
}

我怀疑是否 AbstractClass1 class 包含抽象方法意味着我们必须在子class 中扩展它时重写;但如果 subclass 是 abstract

则不会显示错误

假设我的子class不是抽象的;这次我必须覆盖 "AbstractClass1" class 中可用的所有未实现的方法,请参见下面的示例

 public  class AbstractClassImplementation extends AbstractClass1{

  public static void main(String[] args) {
    System.out.println("java abstract doubt");
 }

 @Override
 public void test2() {
    System.out.println("overrided here");

 }

 @Override
 public void test3() {
    System.out.println("overrided here");

 }
}

谁能解释一下?

AbstractClassImplementation 本身就是 abstract,因此不必覆盖所有 abstract 方法。只有具体的(非abstract)class必须实现所有abstract方法。

由于你的子 class 也是抽象的(无法初始化)你不必实现这些方法,但在这种情况下子 class (如果不是抽象的) 将必须实现那些抽象方法

不需要检查 AbstractClass2 中抽象方法的实现,因为对象不能实例化为 AbstractClass2

AbstractClass2 派生的任何具体 class 必须实现 AbstractClass1AbstractClass2 中的所有抽象方法。

subclass 不需要实现抽象 superclass 的方法。所需要的只是任何具体 class(您可以初始化的)必须实现其所有超classes(包括接口)中所有尚未实现的方法。不需要其他 classes 来实现它们。

因为在第二个代码片段中 AbstractClassImplementation 本身是抽象的,所以它没有显示任何错误。

以下是Orcale对此的看法

When an abstract class is subclassed, the subclass usually provides implementations for all of the abstract methods in its parent class. However, if it does not, then the subclass must also be declared abstract.