更新时间:2023-05-16 来源:黑马程序员 浏览量:

在Java中,abstract class和interface都是用来定义抽象类型的关键字,但它们在语法上有几个重要的区别:
abstract class是一种类,可以定义构造函数、成员变量和非抽象方法,也可以包含抽象方法,而interface只能定义常量和抽象方法,不能包含任何具体的实现。
一个类可以继承多个接口,但只能继承一个抽象类。此外,抽象类可以作为其他类的基类,而接口不能。
在抽象类中可以定义抽象方法,它们必须在非抽象子类中实现。在接口中定义的所有方法都是抽象的,实现接口的类必须提供方法的实现。

从Java 8开始,接口可以定义默认方法,这些方法具有默认实现,可以被实现接口的类直接继承或覆盖。抽象类也可以定义具有默认实现的方法,但是默认实现必须是非抽象的。
在抽象类中可以定义非常量成员变量,而在接口中只能定义常量(static final)变量。
接下来,笔者用一段Java代码来详细演示下abstract class和interface之间的语法区别:
// 抽象类
abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
// 抽象方法,必须在非抽象子类中实现
abstract void makeSound();
// 非抽象方法,可以在抽象类中直接实现
public void sleep() {
System.out.println(name + " is sleeping.");
}
}
// 接口
interface Swimable {
// 常量
int MAX_SPEED = 10;
// 抽象方法
void swim();
}
// 实现接口的类
class Fish implements Swimable {
// 必须实现接口中定义的所有方法
public void swim() {
System.out.println("Fish is swimming.");
}
}
// 继承抽象类的子类
class Dog extends Animal {
public Dog(String name) {
super(name);
}
// 必须实现父类中定义的抽象方法
void makeSound() {
System.out.println(name + " is barking.");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog("Puppy");
animal.makeSound();
animal.sleep();
Swimable swimable = new Fish();
swimable.swim();
System.out.println("Max speed: " + Swimable.MAX_SPEED);
}
}在这个例子中,Animal是一个抽象类,它有一个非抽象方法sleep和一个抽象方法makeSound。Swimable是一个接口,它定义了一个常量MAX_SPEED和一个抽象方法swim。Fish实现了Swimable接口,并提供了swim方法的具体实现。Dog是Animal的子类,它实现了makeSound方法,并继承了sleep方法。在Main类中,我们创建了一个Dog对象和一个Fish对象,并调用了它们的方法。注意到在Swimable.MAX_SPEED这一行,我们直接通过接口名访问了接口中定义的常量。