抽象类和接口
1. 引言
接口和抽象类是面向对象编程中的两个概念,用于实现代码的抽象和封装。
2. 抽象类
2.1 定义
抽象类(Abstract Class)是用于实现部分行为的类,它不能被实例化。抽象类可以包含普通方法、抽象方法(只有方法签名,没有具体实现)和属性,但抽象类中的抽象方法必须在子类中被实现。抽象类可以作为其他类的基类,其他类可以通过继承抽象类获得其属性和方法。在Java中,抽象类通过abstract关键字来定义。
2.2 抽象方法
抽象方法是一种特殊的方法,它没有方法的具体实现,即没有方法体,定义该方法时要用abstract关键字来修饰,该方法必须在抽象类中。
public abstract void run();
2.3 抽象类的特性
- 使用abstract关键字来修饰抽象类。
- 抽象类不能被实例化,即不能用抽象类去创建对象。
- 抽象类中可以有普通类中所包含的成员变量,成员方法和构造方法。
- 抽象类相比于普通类,抽象类中有抽象方法。
- 抽象类的方法不能被private修饰的,不然违背重写原则。
- 抽象类中有构造方法,为了方便子类能够调用,来初始化抽象类当中的成员。
- 类只能通过extends关键字去继承抽象类。
2.4 抽象类的使用
- Animals抽象类
public abstract class Animals {
int leg; //腿
public Animals() {
}
public Animals(int leg) {
this.leg = leg;
}
public abstract void run();
}
- Dog类继承Animals抽象类
public class Dog extends Animals{
public Dog() {
super(4);
}
@Override
public void run() {
System.out.println("狗在跑");
}
}
- Duck类继承Animals抽象类
public class Duck extends Animals{
public Duck(){
super(2);
}
@Override
public void run() {
System.out.println("鸭子在跑");
}
}
- 测试类:
public class TestAnimals {
public static void main(String[] args) {
Dog dog = new Dog();
dog.run();
System.out.println("狗的腿有" + dog.leg + "条");
Duck duck = new Duck();
duck.run();
System.out.println("鸭子的腿有" + duck.leg + "条");
}
}
测试结果如下:
3. 接口
3.1 定义
接口(Interface)是一种抽象类型,它定义了一组方法的签名,但没有具体的实现。接口描述了一个类或者对象应该具备的行为,实现了接口的类必须实现接口中定义的所有方法。接口提供了一种规范,确保了代码的一致性和层次结构的灵活性。通俗来讲,接口就是一个标准,实现接口的类都得按照这个标准来定义。在Java中,接口通过interface关键字来定义。
3.2 接口存在的意义
类的父类只能有一个,继承只能是单继承,可以使用接口让我们实现多继承的逻辑。
3.3 接口的特性
- 使用interface关键字来修饰接口。
- 接口是特殊的抽象类。
- 接口中的方法不能不能有具体的实现。
- 接口中的方法可以是抽象的,静态的,默认的。在接口中抽象方法默认是 public abstract修饰的。在接口中变量默认是 public static final修饰的,实现它的类重写接口中的方法必须由public修饰。
- 接口不能被实例化,即接口不能有构造方法。
- 使用implements关键字来实现接口,接口里面的抽象方法必须要重写,默认方法可以重写也可以不重写,静态方法不能被重写。
- 多个类可以实现一个接口。一个类可以实现多个接口,但只能继承一个类。
- 类实现接口的时候,必须要实现接口里面的所有方法。否则,该类要定义为抽象类。
3.4 接口的使用
- ICharger接口:开始充电和停止充电两个方法
public interface ICharger {
void startCharge();
void stopCharge();
}
- Huawei类:实现ICharger接口
public class Huawei implements ICharger{
@Override
public void startCharge() {
System.out.println("华为手机开始充电");
}
@Override
public void stopCharge() {
System.out.println("华为手机停止充电");
}
}
- Honor类:实现ICharger接口
public class Honor implements ICharger{
@Override
public void startCharge() {
System.out.println("荣耀手机开始充电");
}
@Override
public void stopCharge() {
System.out.println("荣耀手机停止充电");
}
}
- 测试类:
public class TestCharger {
public static void main(String[] args) {
Huawei huawei = new Huawei();
huawei.startCharge();
huawei.stopCharge();
Honor honor = new Honor();
honor.startCharge();
honor.stopCharge();
}
}
测试结果如下:
4. 区别和联系
4.1 区别
- 抽象类中可以含有普通方法和成员变量,接口中不能含有普通方法,子类必须重写所有抽象方法。
- 抽象类用extends关键字继承,接口用implements关键字实现。
- 一个抽象类可以实现多个接口,接口不能继承抽象类,接口可以使用extends关键字继承多个父类接口。
- 一个类只能继承一个抽象类,一个类可以实现多个接口。
- 接口适用于描述类之间的公共行为和功能,它提供了规范和约束,实现接口能够在不同的类之间实现代码的复用和组合。抽象类适用于描述类之间的共同特征和行为,它提供了一些通用的方法和属性,子类可以通过继承和重写来实现具体的功能。
4.2 联系
抽象类和接口中都可以由抽象方法,抽象方法是没有方法体的,这就需要我们去继承抽象类或者实现接口时来重写这些方法。
5. 总结
- 抽象类中不一定有抽象方法,,但有抽象方法的类一定是抽象类。
- 有了接口之后,类的使用者就不用关注具体类型,而只关注某个类是否具备某种能力。
- 接口和抽象类都是面向对象编程中的重要概念,用于实现代码的抽象和封装,提高代码的可维护性和可扩展性。选择使用接口还是抽象类,取决于具体的需求和设计考虑。