语法层面
定义方式
抽象类 :使用 abstract 关键字修饰类。例如:
abstract class Animal {
public abstract void makeSound ( ) ;
public void eat ( ) {
System . out. println ( "Animal is eating" ) ;
}
}
接口 :使用 interface 关键字定义。例如:
interface Flyable {
void fly ( ) ;
default void land ( ) {
System . out. println ( "Flying object is landing" ) ;
}
}
成员变量
抽象类 :可以有各种类型的成员变量,包括静态变量、实例变量,并且可以使用不同的访问修饰符(private、protected、public)。例如:
abstract class Vehicle {
private int wheels;
protected String color;
public static final int MAX_SPEED = 200 ;
public Vehicle ( int wheels, String color) {
this . wheels = wheels;
this . color = color;
}
}
接口 :成员变量默认是 public static final 类型,即常量,必须在定义时进行初始化。例如:
interface Shape {
double PI = 3.14 ;
}
方法
抽象类 :可以包含抽象方法(使用 abstract 关键字修饰,只有方法声明,没有方法体)和普通方法(有方法体)。例如:
abstract class Bird {
public abstract void fly ( ) ;
public void sleep ( ) {
System . out. println ( "Bird is sleeping" ) ;
}
}
接口 :在 Java 8 之前,接口中的方法都是抽象方法,不能有方法体。从 Java 8 开始,接口支持默认方法(使用 default 关键字修饰)和静态方法,Java 9 开始支持私有方法。例如:
interface Swimmable {
void swim ( ) ;
default void dive ( ) {
System . out. println ( "Swimming object is diving" ) ;
}
static void showInfo ( ) {
System . out. println ( "This is a swimmable object" ) ;
}
}
继承和实现
抽象类 :一个类只能继承一个抽象类,使用 extends 关键字。例如:
class Dog extends Animal {
@Override
public void makeSound ( ) {
System . out. println ( "Woof!" ) ;
}
}
接口 :一个类可以实现多个接口,使用 implements 关键字。例如:
class FlyingFish implements Flyable , Swimmable {
@Override
public void fly ( ) {
System . out. println ( "Flying fish is flying" ) ;
}
@Override
public void swim ( ) {
System . out. println ( "Flying fish is swimming" ) ;
}
}
设计层面
抽象程度
抽象类 :抽象类是对一类事物的抽象,它描述了一组具有相似特征和行为的对象。例如,Animal 抽象类可以表示所有动物的共性,子类可以继承这些共性并进行扩展。接口 :接口是对行为的抽象,它定义了一组行为规范,而不关心具体的实现细节。例如,Flyable 接口定义了飞行的行为,任何实现该接口的类都需要实现飞行的方法。
使用场景
抽象类 :当需要定义一组具有共同属性和行为的对象,并且这些对象有一些默认的实现时,使用抽象类。例如,在一个图形绘制系统中,可以定义一个抽象类 Shape,包含一些通用的属性(如颜色、位置)和方法(如绘制),具体的图形类(如圆形、矩形)可以继承该抽象类并实现特定的绘制方法。接口 :当需要为不同的类提供统一的行为规范,或者需要实现多继承的效果时,使用接口。例如,在一个电商系统中,商品类可以实现 Sellable 接口,订单类可以实现 Payable 接口,不同的类可以根据自己的需求实现不同的接口。