成员变量
- 抽象类:可以有各种访问修饰符的成员变量,包括private、protected、public等,且可以有具体的初始值。例如:
abstract class AbstractClass {
private int privateVar = 10;
protected String protectedVar = "abstract";
public double publicVar = 3.14;
}
- 接口:成员变量默认是
public static final
的,也就是常量,必须在声明时初始化。例如:
interface MyInterface {
int CONSTANT = 100;
}
方法定义
- 抽象类:可以包含抽象方法(只有声明,没有实现)和具体方法(有方法体)。抽象方法用于强制子类实现特定功能,具体方法为子类提供通用的实现。例如:
abstract class AbstractClass {
// 抽象方法
public abstract void abstractMethod();
// 具体方法
public void concreteMethod() {
System.out.println("This is a concrete method.");
}
}
- 接口:所有方法默认是
public abstract
的,Java 8 开始接口可以有默认方法(使用default
关键字)和静态方法,默认方法为实现接口的类提供可选的方法实现,静态方法通过接口名直接调用。例如:
interface MyInterface {
void abstractMethod();
default void defaultMethod() {
System.out.println("This is a default method.");
}
static void staticMethod() {
System.out.println("This is a static method.");
}
}
继承与实现关系
- 抽象类:使用
extends
关键字来继承抽象类,一个类只能继承一个抽象类。因为Java单继承机制,这限制了一个类从多个抽象类获取属性和行为。例如:
class SubClass extends AbstractClass {
@Override
public void abstractMethod() {
System.out.println("Implemented abstract method.");
}
}
- 接口:使用
implements
关键字来实现接口,一个类可以实现多个接口,这使得类能够从多个接口获取不同的行为定义,实现更灵活的功能组合。例如:
class MyClass implements MyInterface, AnotherInterface {
@Override
public void abstractMethod() {
System.out.println("Implemented method from MyInterface.");
}
// 实现AnotherInterface中的抽象方法
@Override
public void anotherAbstractMethod() {
System.out.println("Implemented method from AnotherInterface.");
}
}
设计目的
- 抽象类:通常用于表示具有共同特征和行为的一组类的抽象概念,它将一些相关的属性和方法组织在一起,子类继承抽象类并根据自身需求扩展和细化这些属性和方法。适用于存在一定共性,且需要在抽象层面定义一些通用行为的场景。
- 接口:主要用于定义一组行为规范,不关心实现类的具体继承体系,只关注实现类是否满足接口定义的行为。它更强调行为的一致性和可替代性,适用于需要实现不同类之间功能交互和组合的场景,使得不相关的类可以具有相同的行为。