假设我们开了一个汽车玩具厂,现在要造奔驰和宝马系列玩具。这两种玩具的功能基本是一致,只是车的喇叭音乐不同。
由于只是车的内置喇叭(trumpet) 不同,那么我们造的时候,我们首先开发一套车的模板 (Car) 即可,车的骨架、内部零件什么的都用一样的。生产奔驰(Benchi) 系列的车,我们去奔驰车间给他装上奔驰的内置喇叭 (Benchi extends Car) ;生产宝马系列的车,我们去宝马(Baoma) 车间给他装上宝马的内置喇叭 (Baoma extends Car)。
现在,我们奔驰系列的车模板和宝马系列的车模板就造好了,出厂每一个车的时候,给车模套上车壳就完工了。
我们把生产汽车模板的过程抽象成一个Car类。
abstract class Car {
String name;
public Car(String name){
this.name = name;
}
// 每个车都可以跑
void run(){
System.out.println(this.name + "跑起来了");
}
// 每个车的喇叭
abstract void trumpet()
}
由于每个车都必须有喇叭,因此trumpet方法是必须存在的。但每个系列的车喇叭不同,因此,在Car类中,我们无法具体指明方法内容(没有写方法体)。这个trumpet方法就是一个抽象方法, 我们用abstract给他标记一下。
由于Car缺少喇叭、车壳等零件(trumpet是抽象抽象方法,Car因此是抽象类),因此它无法直接生产玩具(不能实例化)。我们需要去不同车间继续完善它 (只能被子类继承、完善方法) 。
我们去奔驰车间给他装上奔驰的喇叭,奔驰系列玩具的车模就做好了。
class Bnechi extends Car {
public Bnechi(String name){
super(name);
}
public void trumpet(){
System.out.println("我是奔驰,啦啦啦");
}
}
然后,我们去宝马车间给他装上喇叭,宝马系列的玩具车模就做好了
class Baoma extends Car {
public Baoma(String name){
super(name);
}
public void trumpet(){
System.out.println("我是宝马,啦啦啦");
}
}
最后,我们在奔驰和宝马车间就可以不断的生产玩具了。
上面的代码中,我们定义了一个sountrumpetd方法,这是Car必须有的方法,但是每个子类(奔驰、宝马)的这个方法是不同的,因此我们无法具体写成这个方法的内容。
那么,这个sound方法就是一个抽象方法,对应的,Car就是一个抽象类。Car是不完整的,因此它不能直接生产成一个玩具车 (不能实例化)。
我们需要用Car这个模板来完善我们的奔驰系列玩具
public class CarFactory {
public static void main(String[] args) {
// 生产奔驰
Bnechi BCA = new Bnechi("奔驰A级");
BCA.run();
BCA.trumpet();
// 生产宝马
Baoma BMW1 = new Baoma("宝马1系");
BMW1.run();
BMW1.trumpet();
}
}
抽象类使用abstract关键字进行声明,它可以包含抽象方法和普通方法。
它无法直接创建抽象类的实例,只能通过继承它的子类来使用。抽象类通常用于定义类的共同特征和行为,而将具体的实现细节留给子类来完成。
示例代码:
abstract class Car {
String name;
public Car(String name){
this.name = name;
}
// 普通方法
void run(){
System.out.println(this.name + "跑起来了");
}
// 抽象方法,子类需要实现具体的功能,不写函数体
abstract void trumpet()
}
抽象方法是在抽象类中声明但没有具体实现的方法,它使用abstract关键字进行声明。抽象方法没有方法体,只有方法签名,子类必须实现这些抽象方法,否则子类也必须声明为抽象类。
示例代码:
abstract class Car {
String name;
public Car(String name){
this.name = name;
}
// 每个车都可以跑
void run(){
System.out.println(this.name + "跑起来了");
}
// 每个车的音乐
abstract void trumpet();
}
// 子类继承父类
class Bnechi extends Car {
public Bnechi(String name){
super(name);
}
// 子类完善父类的抽象方法
public void trumpet(){
System.out.println("我是奔驰,啦啦啦");
}
}
// 子类继承父类
class Baoma extends Car {
public Baoma(String name){
super(name);
}
// 子类完善父类的抽象方法
public void trumpet(){
System.out.println("我是宝马,啦啦啦");
}
}
抽象类和抽象方法的使用场景: