抽象类不能直接实例化,普通类可以;抽象类可含抽象方法且子类必须实现,否则自身须声明为abstract;抽象类可定义构造方法供子类调用。
这是最直观、也是编译器最先报错的区别。当你写 new Shape()(假设 Shape 是抽象类),Java 直接拒绝编译,提示 "Cannot instantiate the type Shape"。而普通类如 Rectangle 或 String,调用 new Rectangle(2.0, 3.0) 完全合法。
public abstract double calculateArea();),JVM 无法为其分配确定的内存布局HttpServlet),只要加了 abstract 关键字,就不能 new
在普通类中写 public abstract void doSomething(); 会立刻触发编

"Illegal combination of modifiers: 'public' and 'abstract'"。而抽象类中,抽象方法是核心设计手段。
{} 和实现逻辑,强制子类“补全”行为public 或 protected,不能是 private(子类看不见)、不能是 static(静态方法无法被重写)、也不能是 final(和重写冲突)abstract 方法,这个类就必须声明为 abstract
这是最容易踩坑的一环:你以为继承了抽象类就“搞定”,结果编译报错 "The type X must implement the inherited abstract method Y"。
abstract 类,它必须重写父类所有抽象方法,一个都不能少abstract 修饰符,否则编译失败private 或改了参数类型——这不算“实现”,只是重载,依然会报错很多人以为“不能 new 就不能有构造方法”,其实抽象类完全可以定义 Shape(String name) 这样的构造器,而且子类 super("circle") 必须显式调用它。
new 实例时,由子类构造器链式调用color 和 id),避免子类重复代码NullPointerException 或未定义行为