抽象类
1、概念
抽象类解释:有抽象方法的类就是抽象类,用abstract关键字修饰。
抽象方法解释:没有方法体的方法就是抽象方法,用abstract关键字修饰。
抽象方法的由来:当需要定义一个方法,却不明确方法的具体实现时,可以将方法定义为abstract,具体实现延迟到子类。
注意:
1、抽象类不能被实例化。
2、抽象类中可以包含抽象方法(使用abstract关键字定义的方法,没有方法体)和非抽象方法(即普通方法,有方法体)。抽象类也可以不包含任何抽象方法,只是用来被其他类继承。
3、如果一个类包含至少一个抽象方法,那么这个类就必须被声明为抽象类。
4、抽象类的子类必须实现父类中的所有抽象方法:除非子类也是抽象类。如果子类没有实现父类中的所有抽象方法,则子类也必须被声明为抽象类。
2、代码示例
package test1;
abstract class Animal {
int age = 1;
public abstract void eat();
abstract void bark();
}
class Dog extends Animal {
int age = 2;
@Override
public void bark() {
System.out.println("汪汪汪"); // 实现父类抽象方法
}
@Override
public void eat() {
System.out.println("吃骨头"); // 实现父类抽象方法
}
}
class Cat extends Animal {
int age = 2;
@Override
public void bark() {
System.out.println("喵喵喵"); // 实现父类抽象方法
}
@Override
public void eat() {
System.out.println("吃小鱼干"); // 实现父类抽象方法
}
}
public class demo {
public static void main(String[] args) {
Dog dog = new Dog();
dog.bark(); // 输出:汪汪汪
dog.eat(); // 输出:吃骨头
Cat cat = new Cat();
cat.bark(); // 输出:喵喵喵
cat.eat(); // 输出:吃小鱼干
}
}
代码中创建了一个抽象类Animal ,抽象类有两个子类Dog和Cat,在子类中实现了Animal 中的两个抽象方法,而且子类必须实现父类Animal 中的两个抽象方法。
package test1;
abstract class Animal {
int age = 1;
public abstract void eat();
abstract void bark();
}
abstract class Mouse extends Animal {
public abstract void run();
public void eat() {
System.out.println("吃大米");
}
}
代码中新建了一个Mouse类,继承了抽象类Animal ,Mouse类可以不实现父类抽象方法,但必须添加abstract 关键字,将自己也定义为一个抽象类,当然Mouse类也可以添加自己的抽象方法。
3、使用场景
Java中抽象类主要用于提高代码的复用性、可维护性和扩展性。以下是一些具体的使用场景:
-
定义通用的属性和方法
抽象类可以定义一些通用的属性和方法,供其子类继承和实现。这样可以避免在每个子类中重复定义相同的代码,提高代码的可维护性。例如,在软件开发中,经常需要处理各种数据模型,如动物、水果、员工等。这些数据模型通常具有一些共同的属性和方法,可以使用抽象类来定义这些共同点,让具体的子类来实现具体功能。 -
封装通用的逻辑
抽象类可以封装一些通用的逻辑,例如数据库连接、文件读写等操作。在子类中,只需要实现具体的业务逻辑即可,无需关心底层的通用逻辑实现。这样可以提高代码的复用性和开发效率。 -
定义模板方法
抽象类可以定义一个模板方法,其中包含了一系列的抽象方法和具体方法。这样,在子类中只需要实现具体的抽象方法,而具体方法则已经在抽象类中实现好了。这种方式可以提高代码的复用性和扩展性。模板方法设计模式就是基于这种思想实现的。 -
实现接口的部分方法
如果一个类实现了一个接口,但是又不想实现接口中的所有方法,可以将该类定义为抽象类,只实现部分方法,将未实现的方法留给子类去实现。这样可以在一定程度上减少子类的工作量,同时保持接口的定义不变。 -
限制实例化
抽象类不能直接实例化,它只能被继承。这种限制可以用来表示某个类是一个概念上的抽象,只能通过具体的子类进行实例化。这有助于防止创建无意义的实例对象,同时强制要求子类必须实现抽象类中定义的方法。 -
提供统一的接口
在大型框架或库的开发中,抽象类经常用于提供统一的接口。通过定义抽象类,可以规范子类必须实现的方法和行为,从而保证整个框架或库的一致性和可扩展性。例如,在Spring框架中,就大量使用了抽象类来定义各种组件的通用行为。