Java中的抽象类和接口都是用于实现抽象层次的设计,但它们之间存在一些关键的区别。以下是对它们之间主要差异的解释,并通过代码示例来进一步说明。
1. 抽象类(Abstract Class)
- 抽象类不能被实例化(即不能直接创建对象)。
- 抽象类中可以包含抽象方法和非抽象方法。
- 一个类只能继承一个抽象类(Java不支持多继承,但支持多层继承)。
- 抽象方法是没有方法体的方法,以
abstract
关键字声明,必须由子类实现(除非子类也是抽象类)。
2. 接口(Interface)
- 接口是一种引用类型,是一种抽象的类型,它是方法声明的集合。
- 接口不能被实例化。
- 接口中的方法都是抽象的(从Java 8开始,接口中也可以包含默认方法和静态方法,但这些方法都有具体的实现)。
- 一个类可以实现多个接口。
- 接口中只能包含常量、抽象方法、默认方法、静态方法以及嵌套的类型(枚举、接口、类)。
代码示例
抽象类示例
abstractclassAnimal{// 抽象方法abstractvoideat();// 非抽象方法voidsleep(){System.out.println("Animal is sleeping");}}classDogextendsAnimal{// 实现抽象方法voideat(){System.out.println("Dog is eating");}}publicclassTestAbstractClass{publicstaticvoidmain(String[] args){Animal myDog =newDog();
myDog.eat();
myDog.sleep();}}
接口示例
interfaceAnimal{// 抽象方法voideat();// Java 8 开始可以包含默认方法defaultvoidsleep(){System.out.println("Animal is sleeping");}}classDogimplementsAnimal{// 必须实现接口中的抽象方法publicvoideat(){System.out.println("Dog is eating");}// 可以选择不覆盖默认方法// 如果覆盖了默认方法,则需要显式声明}publicclassTestInterface{publicstaticvoidmain(String[] args){Dog myDog =newDog();
myDog.eat();
myDog.sleep();// 调用的是Dog类继承自Animal接口的默认方法}}
总结
- 抽象类是一种特殊的类,用于定义一组抽象方法的集合,同时也可以包含非抽象方法。
- 接口是一种更纯粹的抽象,它只包含抽象方法(直到Java 8之前),并且是一种类型,用于定义对象的行为规范。
- 抽象类可以有构造方法,接口不能有构造方法。
- 一个类只能继承一个抽象类,但可以实现多个接口。
- 抽象类和接口都是Java中实现多态和抽象化的重要工具。
本文转载自: https://blog.csdn.net/zzz19920821/article/details/140858297
版权归原作者 AugustRed 所有, 如有侵权,请联系我们删除。
版权归原作者 AugustRed 所有, 如有侵权,请联系我们删除。