(1)使用 abstract 关键字修饰的类称为抽象类。例如:
public abstract class Demo { // 一个抽象类 }
(2)使用 abstract 关键字修饰的方法称为抽象方法,注意:抽象方法可以没有具体的实现。例如:
public abstract class Demo { // 抽象方法 public abstract void show(); }
(3)在抽象类的子类中必须对抽象方法进行重写,当其子类为抽象类时,可以不重写抽象方法,但在其子类中一旦有普通类,则必须重写父类继承的所有抽象方法。例如:
public abstract class Demo { public abstract void show(); } public abstract class Demo2 extends Demo { public abstract void show2(); } public class Demo3 extends Demo2 { // 实现 Demo 的接口 public void show() { System.out.println("show()"); } // 实现 Demo2 的接口 public void show2() { System.out.println("show2()"); } }
(4)抽象类不可以实例化,抽象类的构造方法作用为初始化子类对象。例如:
public abstract class MyAbstract { private String message; public MyAbstract(String message) { this.message = message; } public void show() { System.out.println(message); } } public class Demo extends MyAbstract { public Demo(String message) { super(message); } public static void main(String[] args) { Demo demo = new Demo("Hello World"); demo.show(); } }
(5)抽象类中的普通属性和普通方法都需要用子类的对象去调用。例如:
public abstract class MyAbstract { // 抽象类中的一个普通方法 public void show(String message) { System.out.println(message); } } public class Demo extends MyAbstract { public static void main(String[] args) { Demo demo = new Demo(); // 调用抽象类的方法 demo.show("Hello World"); } }
(1)普通类可以实例化,实例化后可以调用自己类中的属性和方法,以及父类中的方法和属性。
(2)普通类的构造方法中必须要调用父类的构造方法。如果父类没有定义带参数构造方法,子类则不需要显示调用父类构造方法。例如:
public abstract class MyAbstract { private String message; // 自定义无参构造方法,初始化 message 变量 public MyAbstract() { this.message = "Hello world"; } public void show() { System.out.println(message); } } public class Demo extends MyAbstract { // 默认调用了父类的无参构造方法 public Demo() {} public static void main(String[] args) { Demo demo = new Demo(); demo.show(); } }
运行示例,输出如下:
Hello world
(3)如果普通类继承了抽象类,那么必须要重写所有父类的抽象方法。
抽象类的存在时为了被继承,不能实例化,而普通类存在是为了实例化一个对象。
抽象类的子类必须重写抽象类中的抽象方法,而普通类可以选择重写父类的方法,也可以直接调用父类的方法。
抽象类必须用 abstract 来修饰,普通类则不用。
普通类和抽象类都可以含有普通成员属性和普通方法。
普通类和抽象类都可以继承别的类或者被别的类继承。
普通类和抽象类的属性和方法都可以通过子类对象来调用。