普通类,抽象类和接口之间的区别

本文探讨了Java中普通类、抽象类和接口的主要区别,包括实例化、继承与实现、方法声明与实现等方面。同时,指出在何时选择抽象类或接口,如需默认实现选抽象类,需多重继承则选接口。

一、普通类、抽象类和接口区别:

1. 普通类可以实例化,接口都不能被实例化(它没有构造方法),抽象类如果要实例化,抽象类必须指向实现所有抽象方法的子类对象(抽象类可以直接实例化,直接重写自己的抽象方法),接口必须指向实现所有所有接口方法的类对象。

2. 抽象类要被子类继承,接口要被子类实现。

3. 接口只能做方法的声明,抽象类可以做方法的声明,也可以做方法的实现。

4. 接口里定义的变量只能是公共的静态常量,抽象类中定义的变量是普通变量。

5. 抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类的抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如果不能全部实现接口方法,那么该类只能是抽象类。

6. 抽象方法只能声明,不能实现。接口是设计的结果,抽象类是重构的结果。

7. 抽象类里可以没有抽象方法。

8. 如果一个类里有抽象方法,那么该类只能是抽象类。

9. 抽象方法要被实现,所以不能是静态的,也不能是私有的。

10. 接口可以继承接口,并可多继承接口,但类只能单继承。(重要啊)

11. 接口中的常量:有固定的修饰符-public static final(不能用private和protected修饰/本质上都是static的而且是final类型的,不管加不加static修饰)。

### 抽象类接口区别 在 Java 中,抽象类接口是实现抽象机制的两种主要方式。以下是两者之间区别: #### 1. 定义与继承 - 抽象类使用 `abstract` 关键字定义,可以包含抽象方法(没有实现的方法)非抽象方法(有具体实现的方法)。子类通过 `extends` 关键字继承抽象类,并且必须实现所有未实现的抽象方法[^3]。 - 接口使用 `interface` 关键字定义,默认情况下接口中的方法都是抽象的,即使不显式地使用 `abstract` 关键字。从 JDK 1.8 开始,接口可以包含默认方法(使用 `default` 关键字修饰)静态方法(使用 `static` 关键字修饰)[^4]。 #### 2. 方法实现 - 抽象类可以包含构造方法、非静态方法静态方法。此外,抽象类还可以包含字段(成员变量),这些字段可以是普通变量或常量。 - 接口中的字段默认是 `public static final` 类型,即它们是公共的、静态的不可变的常量。接口本身不能包含实例变量。 #### 3. 多重继承 - 在 Java 中,一个类只能继承一个抽象类,这限制了单继承的特性[^2]。 - 接口支持多重继承。一个类可以通过 `implements` 关键字实现多个接口,从而模拟多重继承的行为[^2]。 #### 4. 设计目的 - 抽象类通常用于模板设计模式,它提供了一个通用的基类,子类可以在其基础上扩展或修改行为。 - 接口更适合作为规范定义,描述了一组相关的行为或功能,而不涉及具体的实现细节。如果需要更改接口,所有实现该接口的类都需要相应调整[^3]。 #### 5. JDK 1.8 的新特性 - 从 JDK 1.8 开始,接口可以包含默认方法静态方法。这使得接口的功能更加丰富,但仍然保留了其作为行为规范的本质。 ### 示例代码 以下是一个简单的抽象类接口示例: ```java // 抽象类示例 public abstract class Animal { public abstract void makeSound(); // 抽象方法 public void sleep() { // 非抽象方法 System.out.println("Sleeping..."); } } // 接口示例 public interface Movable { void move(); // 默认是 public abstract default void stop() { // JDK 1.8 引入的默认方法 System.out.println("Stopped"); } } ``` ### 总结 抽象类接口各有优缺点,选择时应根据具体需求进行权衡。如果需要提供部分实现并允许单继承,则使用抽象类;如果需要定义行为规范并支持多重继承,则使用接口
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李金轩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值