- 抽象类特点
- 案例
Java 中抽象类值的是用 abstract 关键字修饰的类。
抽象类特点- 抽象类和抽象方法都必须使用 abstract 关键字修饰;
- 抽象类也可以有成员变量(变量,常量);
- 抽象类不可实例化,唯一作用是被继承,利用高层抽象类引用指向子类,避免直接引用实际子类;
- 抽象方法没有方法体(即没有大括号以及里面的内容);
- 类中包含抽象方法则必须声明为抽象类,类中不包含抽象方法也可以声明为抽象类;
- 抽象类中也可以包含非抽象方法(提高代码复用性);
- 子类必须重写父抽象类中所有抽象方法,否则该子类也需声明为抽象类(强迫子类实现所有抽象方法实际上定义了子类编写规范);
- 虽然抽象类不可实例化,但其也具有构造方法,也可自定义带参构造方法,抽象类中的构造方法只用于子类访问父类数据的初始化;
首先定义一个抽象类 Animal:
public abstract class Animal { private String gender; private int age; // 抽象类不可实例化,但也有构造方法 public Animal() { System.out.println("This is super class"); } public Animal(String gender, int age) { this.gender = gender; this.age = age; } // 抽象类可包含非抽象方法 public void setGender(String gender) { this.gender = gender; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public int getAge() { return age; } public abstract void run(); public abstract void eat(); public abstract void sleep(); }
定义一个子类 Tiger 继承 Animal 类,Tiger 不是抽象类,所以其必须实现 Animal 中的所有抽象方法:
public class Tiger extends Animal{ public Tiger() { System.out.println("This subclass Tiger"); } public Tiger(String gender, int age) { super(gender, age); } // 重写 Animal 类中所有抽象方法 @Override public void run() { System.out.println("Tiger is running"); } @Override public void eat() { System.out.println("Tiger is eating"); } @Override public void sleep() { System.out.println("Tiger is sleeping"); } }
定义测试类:
public class AbstractClassDemo { public static void main(String[] args) { Tiger t = new Tiger(); t.setGender("male"); t.setAge(6); System.out.println("Gender: " + t.getGender() + " Age: " + t.getAge()); t.run(); } }
运行结果:
This is super class This subclass Tiger Gender: male Age: 6 Tiger is running