更新时间: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这一行,我们直接通过接口名访问了接口中定义的常量。