【面试题】抽象类和接口的联系和区别

 

接口与抽象类的联系与区别
 接口抽象类
联系

1.都不能被实例化;

2.都位于继承树的顶端,用于被其他类实现和继承;

3.都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。

区别 

只包含抽象方法、静态方法和默认方法,不能为普通方法提供方法实现

完全包含普通方法;

 

只能定义静态常量,不能定义普通成员变量既可以定义普通成员变量,也可以定义静态常量
不能包含构造器可以包含构造器(让抽象类的子类调用这些构造器来完成属于抽象类的初始化操作)
不能包含初始化块可以包含初始代码块
多实现单继承,包括抽象类

 

### 抽象类接口区别 #### 定义上的差异 抽象类是一个无法被实例化的类,它可以包含部分实现的方法以及未实现的方法。子类通过继承该抽象类来完成具体的功能实现[^1]。而接口则完全由方法签名组成(在某些现代语言中允许默认方法),它表示一种能力或者契约,任何实现了这个接口的类都必须提供这些方法的具体实现。 #### 方法实现的能力 - **抽象类**可以拥有构造函数、字段成员变量、静态方法以及其他非抽象方法的实际代码逻辑[^2]。 - **接口**最初仅能声明无参数列表主体的方法,在较新的版本如 Java 8 C# 中引入了 `default` 关键字支持默认方法体[^3]。 #### 继承方式的不同 在一个基于单根继承体系的语言里(比如Java),一个类只能直接继承另一个单一父类;但如果需要同时具备多种功能,则可以通过实现多个接口达成目的。因此当面临多重继承场景时通常会选择使用接口而非抽象类。 #### 访问修饰符的规定 对于C#来说,默认情况下所有的接口成员都是public访问级别,并且不允许指定其他更严格的权限修饰词。然而抽象类中的成员可以根据需求设置成protected/private等形式从而控制对外暴露程度更高一些。 ```csharp // 示例展示如何定义并应用抽象类接口 using System; namespace AbstractVsInterfaceExample { // 接口IWorker public interface IWorker{ void DoWork(); } // 抽象基类Employee public abstract class Employee : IWorker{ protected string _name; public Employee(string name){ this._name = name; } // 实现来自IWorker接口的要求 public virtual void DoWork(){ Console.WriteLine($"{_name} is working."); } // 声明纯虚函数留给派生类去覆盖 public abstract void SpecialTask(); } // 派生于Employee的具体员工类型Developer public sealed class Developer : Employee{ public Developer(string name):base(name){} override public void SpecialTask(){ Console.WriteLine("Writing code..."); } } } ``` #### 总结对比表 | 特性 | 抽象类 | 接口 | |-------------------|------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | 是否可含状态 | 能够保存共享的状态信息 | 不应保持状态 | | 多重继承的支持 | 单一继承 | 支持多继承 | | 默认行为的存在 | 提供了一定数
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值