1. 定义方式
抽象类 :使用 abstract
关键字定义,抽象类可以有抽象方法(没有方法体)和非抽象方法(有方法体)。接口 :使用 interface
关键字定义,接口只能包含抽象方法,直到 Java 8 才引入了默认方法(default
)和静态方法(static
)。
abstract class Animal { abstract void sound ( ) ; void breathe ( ) { System . out. println ( "Breathing..." ) ; }
}
interface Animal { void sound ( ) ; default void breathe ( ) { System . out. println ( "Breathing..." ) ; }
}
2. 方法的实现
抽象类 :可以有方法实现,也可以没有方法实现。即可以包含抽象方法和非抽象方法。接口 :所有方法默认都是抽象的,直到 Java 8 引入默认方法,接口可以包含默认实现的方法,但只能是 default
或 static
。
3. 成员变量
抽象类 :可以包含实例变量(成员变量),并且可以是不同的访问修饰符(private
、protected
、public
)。抽象类的成员变量也可以有初始值。接口 :接口中的成员变量默认是 public static final
,即常量,必须初始化,不能修改。
abstract class Animal { protected String name;
}
interface Animal { int AGE = 10 ;
}
4. 构造函数
抽象类 :可以有构造函数,子类可以调用父类的构造函数来初始化父类的成员变量。接口 :不能有构造函数,接口不能被实例化。
5. 继承/实现
抽象类 :一个类只能继承一个抽象类(单继承),但可以实现多个接口。接口 :一个类可以实现多个接口(多实现),这是 Java 通过接口支持多继承的一种方式。
class Dog extends Animal { void sound ( ) { System . out. println ( "Woof" ) ; }
}
class Dog implements Animal { public void sound ( ) { System . out. println ( "Woof" ) ; }
}
6. 多继承的支持
抽象类 :不支持多继承,一个类只能继承一个抽象类。接口 :支持多继承,一个类可以实现多个接口。
abstract class Animal { abstract void sound ( ) ;
} abstract class Pet { abstract void play ( ) ;
}
interface Animal { void sound ( ) ;
} interface Pet { void play ( ) ;
} class Dog implements Animal , Pet { public void sound ( ) { System . out. println ( "Woof" ) ; } public void play ( ) { System . out. println ( "Play fetch" ) ; }
}
7. 用途
抽象类 :用于描述“类”的通用行为,通常是相似的类之间的共性。适用于当不同的类共享某些方法的实现时,抽象类就成为更合适的选择。接口 :用于描述“能力”,如某个类的行为规范。接口更加灵活,适用于定义某些功能或行为的规范,不关心类的实现细节。
8. 默认方法(Java 8+)
抽象类 :没有类似接口中的 default
方法,抽象类的具体方法通常是类实现时需要覆盖的。接口 :Java 8 引入了 default
方法,允许在接口中提供方法的默认实现,以便向后兼容已有的接口。
interface Animal { default void breathe ( ) { System . out. println ( "Breathing..." ) ; }
}
总结
特性 抽象类 接口 关键词 abstract
interface
方法实现 可以有抽象方法和非抽象方法 默认全是抽象方法,Java 8+ 有默认方法 成员变量 可以有成员变量 默认是 public static final
常量 构造函数 可以有构造函数 不能有构造函数 继承/实现 只能继承一个类(单继承) 可以实现多个接口(多实现) 用途 描述类的共性行为 描述对象的能力(接口化的功能) 访问修饰符 可以有多种访问修饰符 默认 public