抽象类和接口的区别

本文详细解析了Java中的抽象类和接口的概念及其使用方法,包括抽象类的特点、如何定义抽象方法、接口的定义及其实现等。同时对比了抽象类与接口的主要区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、抽象类

Java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰。

abstract void test(); //定义抽象方法test()

当一个类中包含了抽象方法,该类必须使用 abstract 关键字来修饰,使用abstract关键字修饰的类为抽象类。

public abstract class Test {
	//定义抽象方法test()
	abstract void test(); 

}

在定义抽象类时需要注意,包含抽象方法的类必须声明为抽象类,但抽象类可以不包含任何抽象方法。

另外,抽象类是不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。

如果想调用抽象类中定义的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。


总结抽象类:

1、abstract 类不能创建实例对象。
2、含有 abstract 方法的类必须定义为 abstract class
3、abstract class 类中的方法不必是抽象的。
4、abstract class 类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。

5、如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract 类型

二、接口

如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另外一种方式来定义。即接口。
在定义接口时,需要使用 interface 关键字来声明。


接口中定义的方法和变量,都包含一些默认的修饰符。
接口中的方法默认使用 public abstract 来修饰 即抽象方法
接口中的变量默认使用 public static final来修饰 即全局常量


由于接口中定义的方法都是抽象方法,因此不能通过实例对象的方式来调用接口中的方法。
此时需要定义一个类,并使用 implements 关键字来实现接口中的所有方法。


假设有  普通类A、B,接口C、D、E

/*1、一个类通过 implements 关键字实现接口时,可以实现多个接口,
被实现的多个接口之间要用逗号隔开
*/
public class A implements C,D {  }
/*2、在程序中还可以定义一个接口,使用关键词extends去继承成另一个接口,
一个接口可以通过 extends 关键字继承多个接口,接口之间用逗号隔开
*/
interface C extends D,E {   }

/*3、一个类在继承另一个类的同时还可以实现接口, 
 * extends 关键字必须位于 implements 关键字之前
 */
public class A extends B implements D {  }


接口和抽象类的一些区别:
1、抽象类可以有构造方法,接口中不能有构造方法。
2、抽象类中可以有普通的成员变量,接口中没有普通成员变量。
3、抽象类中可以包含非抽象的普通方法,接口中所有方法必须是抽象的,不能有非抽象的普通方法。
4、抽象类中的抽象方法的访问类型可以是 public,protected 。
      接口中的抽象方法只能是 public 类型的,默认为 public abstract 类型
5、抽象类中可以包含静态方法,接口中不能包含静态方法。


关于4、5的测试:



-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


问题:当一个类实现接口时,如果这个类是抽象类,则实现接口中的部分方法即可,否则需要实现接口中的所有方法。

假设有一个接口和一个抽象类:

接口里有一个不应该存在的方法;抽象类里有一个非抽象方法;


----------------------------------------------------------------------------------------------------------------------------------------------------------------


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

当使用继承去实现抽象类里的方法以及使用接口去实现接口里的方法的时候



--------------------------------------------------------------------------------------------------------------------------------------------------------------------

可以发现:Test1类是普通类 所以必须继承接口里的所有方法,即使那个方法是不应该存在的

而抽象类通过子类继承的方式进行实现的时候,只会实现抽象类中的抽象方法。


### 抽象类接口区别及使用场景 #### 定义上的差异 抽象类是一种未完全实现的类,它可以包含具体方法抽象方法。如果一个类被声明为`abstract`,即使其中没有任何抽象方法,该类仍然无法实例化[^2]。而接口是对行为的一种抽象定义,它只关注对象能够做什么,而不关心具体的实现细节。 #### 继承方式的不同 Java 中的一个类只能继承自一个父类(包括抽象类),但可以同时实现多个接口。这意味着当需要让一个类具有多种能力时,通常会优先考虑使用接口而非多重继承[^3]。 #### 方法与字段的支持情况 - **抽象类**:允许存在非静态成员变量以及构造函数;还可以提供默认实现供子类调用。 - **接口**:传统上仅支持常量(隐式 `public static final` 的字段)抽象方法(隐式 `public abstract`)。然而,在 Java 8 及之后版本中引入了默认方法 (`default`) 静态方法 (`static`) 支持,这使得某些功能看起来更接近于抽象类的行为[^1]。 #### 使用场景分析 ##### 抽象类适用场合 当几个相关联的具体类共享相同的基线逻辑,并且这些共同部分适合提取出来形成统一的基础结构时,可以选择创建抽象类作为它们的父亲节点。例如构建一系列图形处理工具时,“Shape”可能适合作为基础抽象类,因为它涵盖了所有形状都应具有的基本属性如颜色填充样式等通用特征[^1]。 ##### 接口更适合的情况 如果目标在于表达某特定动作或服务的存在与否,而不是强调实体之间的层次关系,则应该倾向于采用接口形式。比如前面提到过的“飞行”的概念——并不是所有的生物都是鸟类,也不是每种机器都能称为飞机,但是只要具备飞翔的能力就可以关联到同一个 Fly 接口中去[^3]。 ```java // 示例代码展示如何定义抽象类接口 public interface Flyable { void fly(); } public abstract class Animal { public String name; public abstract void makeSound(); // 抽象方法 public void eat() { System.out.println("Eating..."); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值