关于abstract class 和interface的区别

本文详细比较了Java中抽象类(abstract class)与接口(interface)的不同之处,包括继承特性、成员变量类型、成员方法定义等,并阐述了两者在设计理念上的差异。
  1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。


2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。


3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。


4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。


5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。


6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。


7.接口中的方法默认都是 public,abstract 类型的。
### abstract class interface区别 #### 1. 定义方式 抽象类(`abstract class`)是一种特殊的类,它允许定义方法签名以及部分实现甚至完全实现的方法。而接口(`interface`)则是一个纯抽象的概念,在某些编程语言中仅能包含方法声明常量字段[^2]。 ```java // 抽象类示例 public abstract class Animal { public abstract void makeSound(); // 抽象方法 public void sleep() { // 非抽象方法 System.out.println("Sleeping..."); } } // 接口示例 public interface Movable { void move(); // 默认为公共抽象方法 } ``` #### 2. 方法实现能力 在许多现代编程语言中,如 Java 8 及以上版本,接口可以提供默认方法(`default methods`),从而允许其实现一些逻辑功能。然而,默认情况下,接口中的方法仍然是未被具体化的。相比之下,抽象类可以直接提供完整的实现[^3]。 ```java // 使用默认方法的接口 public interface Flyable { default void fly() { System.out.println("Flying..."); } } // 抽象类中的完整实现 public abstract class Bird { public final void layEggs() { System.out.println("Laying eggs..."); } } ``` #### 3. 多重继承支持 由于一个类只能继承自单一父类,因此如果需要模拟多重继承,则通常会采用接口的方式。多个接口能够同时由同一个类实现,这使得设计更加灵活[^4]。 ```java class Superhero implements Flyable, Movable { @Override public void move() { System.out.println("Moving..."); } @Override public void fly() { System.out.println("Super flying!"); } } ``` #### 4. 成员变量特性 接口不允许存在实例成员变量;它们只可拥有静态最终类型的属性(即常量)。相反地,抽象类既可以有普通的成员变量也可以具备静态或者动态初始化器。 ```java // 正确的接口常量定义 public interface Constants { int MAX_LIMIT = 100; } // 错误尝试给接口添加非常量数据成员 public interface WrongExample { String name; // 编译错误:必须显式指定final修饰符并赋初值 } ``` --- ### 使用场景分析 当考虑何时选用 `abstract class` 或者 `interface` 来构建软件组件时,需依据实际需求来决定: - **倾向于使用抽象类的情况** - 当希望共享代码片段的时候; - 如果基类型本身应该具有某种行为表现而非纯粹作为模板存在的话; - **更适于选择接口的情形** - 对于那些仅仅关心操作契约而不涉及任何特定算法细节的对象建模过程而言更为合适; - 若要求允许多种不同类型之间形成关联关系以便达成共同目标的情况下尤为适用[^1]。 --- ### 总结表格对比 | 特性 | Abstract Class | Interface | |---------------------|----------------------------------------|---------------------------------------| | 是否可含构造函数 | 是 | 否 | | 能否直接创建对象 | 不可以 | 绝对不可以 | | 支持多继承 | 单一继承 | 支持 | | 提供默认实现 | 可以 | 自 JDK 8 开始可以通过 `default` 关键字实现 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值