(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 来修饰,普通类则不用。
普通类和抽象类都可以含有普通成员属性和普通方法。
普通类和抽象类都可以继承别的类或者被别的类继承。
普通类和抽象类的属性和方法都可以通过子类对象来调用。