定义:
抽象的类,对于一系列具有共同特征和行为的子类的进一步抽象。
使用:
- 使用abstract修饰类名
- 抽象类中可以有属性、普通方法和抽象方法
- 抽象方法:只有声明没有实现,使用abstract关键字修饰
- 子类继承抽象父类,通过重写实现父类的所有抽象方法,否则该子类也是抽象类
注意事项:
- 抽象类不可以直接创建对象,可以通过类的内部实现创建对象。
- 抽象类可以有抽象方法,也可以有普通方法。
- 有抽象方法的类一定是抽象类。
- 子类没有重写实现所有抽象父类的抽象方法,子类也必须是抽象类。
- 构造方法和静态方法不能是抽象的。
- 抽象类不能被final修饰
- 抽象方法不能被final、private修饰
- 抽象类的构造方法不能直接使用,可以在子类的构造方法中调用
下面用枪械类来说明抽象类
/**
* 枪械抽象类
*
*/
public abstract class Gun {
private String name;
private double range;
private double caliber;
public Gun() {
super();
}
public Gun(String name, double range, double caliber) {
super();
this.name = name;
this.range = range;
this.caliber = caliber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getRange() {
return range;
}
public void setRange(double range) {
this.range = range;
}
public double getCaliber() {
return caliber;
}
public void setCaliber(double caliber) {
this.caliber = caliber;
}
//抽象方法
public abstract void shoot();
@Override
public String toString() {
return "Gun [name=" + name + ", range=" + range + ", caliber=" + caliber + "]";
}
}
建立一个突击步枪子类
/**
* 步枪子类
*/
public class Musket extends Gun {
public Musket() {
super();
}
public Musket(String name, double range, double caliber) {
super(name, range, caliber);
}
@Override
//如果本类不是抽象类,必须重写抽象父类的抽象方法
public void shoot() {
System.out.println("突突突");
}
}
在主方法中
public static void main(String[] args) {
//抽象类的内部实现
//可以理解为java不允许抽象类创建对象,但是如果实现了抽象的方法可以允许创建实例对象
Gun gun1 = new Gun("黄金左轮", 100.5, 5.8) {
@Override
public void shoot() {
System.out.println("点射");
}
};
System.out.println(gun1.toString());
gun1.shoot();
//通过子类实现抽象父类,创建对象
Musket gun2 = new Musket("ak47", 400, 7.62);
System.out.println(gun2.toString());
gun2.shoot();
}
总结:
用abstract去定义一个抽象类,定义抽象方法是必须要加abstract,没有默认一说也是防止创建父类对象所以用抽象去定义