抽象类(abstract class)和接口(Interface)的区别

本文对比分析了Java中抽象类和接口的特点与用途,探讨了它们的定义、使用场景及语法差异,帮助开发者理解并正确选择使用。
部署运行你感兴趣的模型镜像

前言

  • 抽象类(abstract class)和接口(Interface)是Java语言中对于抽象类定义进行支持的两种机制,赋予了Java强大的面向对象能力。
  • 二者具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstractclass和Interface的选择显得比较随意。其实,两者之间还是有很大的区别的。
  • 本文将对它们之间的区别进行剖析,并提供一个在二者之间进行选择的依据。

抽象类是什么?

本文中的抽象类表示的是一个抽象体,并非直接从abstract class翻译而来,而abstract class仅仅是Java语言中用于定义抽象类的一种方法,请读者注意区分)

  • 在面向对象的概念中,所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

  • 抽象类的定义
    是对一系列看上去不同,但是本质上相同的具体概念的抽象,往往用来表征我们在对问题进行分析、设计中得出的抽象概念

    • 比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们本质上又都属于这样一个概念:形状,形状这个概念在问题领域是不存在的,所以形状就是一个圆形、三角形的抽象类。
    • 正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的。

为什么要有抽象类?

  • 用于类型隐藏
    在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类。
  • 用于拓展对象的行为功能
    这一组任意个可能的具体实现则表现为所有可能的派生类(子类),模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。

如何进行抽象类的定义?

抽象类(abstract class)和接口(Interface)在Java语言中都是用来进行抽象类定义的两种主要方法

抽象类(abstract class)

  • 定义:包含抽象方法的的类是abstract class

    用abstract关键字修饰

  • 作用:abstractclass是为了把相同的东西提取出来,即重用

  • 使用abstractclass语法规定

语法备注
抽象类定义用abstract关键字修饰要通过子类进行实例化
抽象类是不能被实例化的要通过子类进行实例化
子类必须重写父类的所有抽象方法抽象方法:声明但却未被实现的方法,用abstract关键字修饰
含有抽象方法的类一定是抽象类,但是抽象类不一定含有抽象方法
抽象类是用来被它的子类继承的关键字extends
抽象类是在功能上的一个规定

Interface

  • 定义:比abstract class更加抽象,是一种特殊的abstract class

    用Interface关键字修饰

  • 作用:Interface是为了把程序模块进行固化的契约,是为了降低偶合

  • 使用Interface的语法规定
语法备注
接口定义用Interface关键字修饰 
接口中的所有方法都是抽象的可以用abstract修饰,也可以省略
接口中的方法必须是用public修饰,或不写但是不能被其他修饰符修饰
接口中的属性必须是全局常量publicstaticfinal修饰
抽象类是用来被它的子类实现的关键字Implements
抽象类是在结构上的一个规定
接口不能被实例化
子类实现接口时需要实现接口中的所有方法若有一个未不实现,该子类就是抽象类abstractclass

实例
下面以定义一个名为Demo的抽象类为例来说明这种不同。

  • 使用abstract class的方式定义Demo抽象类:
    abstract classDemo{
    abstract void method1();
    abstract avoid method2();}
  • 使用interface的方式定义Demo抽象类:
    interface Demo{
    void method1();
    void method2();}

二者的相同点

都不能被实例化

二者的区别

类型abstract classInterface
定义abstract class关键字Interface关键字
继承抽象类可以继承一个类和实现多个接口;子类只可以继承一个抽象类接口只可以继承接口(一个或多个);子类可以实现多个接口
访问修饰符抽象方法可以有publicprotecteddefault这些修饰符接口方法默认修饰符是public。你不可以使用其它修饰符
方法实现可定义构造方法,可以有抽象方法和具体方法接口完全是抽象的,没构造方法,且方法都是抽象的,不存在方法的实现
实现方式子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
作用了把相同的东西提取出来,即重用为了把程序模块进行固化的契约,是为了降低偶合

总结

本文对抽象类(abstract class)和接口(Interface)进行了简单的总结,有兴趣可以继续关注Carson_Ho的安卓开发笔记,不定期分享关于安卓开发的干货

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

在C#中,抽象类接口是两个非常重要的概念,它们都用于实现面向对象编程中的抽象多态机制,但它们之间存在显著的区别。以下是对这两个概念的详细解析及其区别说明。 ### 抽象类 抽象类是一种不能被实例化的类,它主要用于作为其他类的基类。抽象类可以包含抽象方法、虚方法以及具体的实现方法。抽象方法是没有实现的方法,必须在派生类中被重写。虚方法则提供了默认的实现,但允许在派生类中被重写。此外,抽象类还可以包含构造函数、静态方法属性等成员[^4]。 例如,定义一个表示形状的抽象类`Shape`,它可以包含一个或多个没有具体实现的抽象方法,如计算面积的方法`Area()`,同时也可以提供一些通用的功能实现,比如绘制形状的方法`Draw()`打印描述信息的方法`PrintDescription()`。 ```csharp public abstract class Shape { // 抽象方法(无实现,必须被子类重写) public abstract double Area(); // 虚方法(有默认实现,可选择重写) public virtual void Draw() { Console.WriteLine("绘制形状"); } // 普通方法 public void PrintDescription() { Console.WriteLine($"这是一个图形,面积={Area()}"); } // 抽象属性 public abstract string Name { get; } } ``` ### 接口 接口定义了一组行为规范,任何实现了该接口的类都必须遵循这些规范。接口中通常只包含方法签名、事件、索引器属性,而不包含任何具体的实现代码。从C# 8.0开始,接口支持默认实现,这意味着可以在接口中为方法提供默认的行为,但这并不改变接口的本质——它仍然是一个契约,规定了实现它的类应该具备哪些功能[^3]。 下面是一个简单的接口示例,定义了一个名为`IRunnable`的接口,其中包含一个`Run`方法: ```csharp public interface IRunnable { void Run(); } ``` ### 主要区别 - **实例化**:抽象类不能直接被实例化,而接口本身也不能被实例化,但是可以通过实现该接口的类来创建对象。 - **多重继承**:一个类只能继承一个抽象类,但可以实现多个接口。这使得接口成为实现多重继承的一种方式[^2]。 - **成员实现**:抽象类可以包含抽象方法、虚方法及具体实现;相比之下,传统上接口仅能声明成员而不提供实现,不过从C# 8.0起,接口也可以拥有默认实现[^3]。 - **访问修饰符**:抽象类支持各种访问修饰符以控制其成员的可见性;而接口的所有成员默认都是公共的,并且不允许使用访问修饰符[^4]。 - **设计目的**:抽象类倾向于表达“是什么”的关系,强调的是类之间的层次结构;而接口更多地体现了“能做什么”的能力契约,适用于更灵活的设计场景[^5]。 综上所述,虽然抽象类接口在某些方面相似,但在实际应用时应根据需求选择合适的方式。如果需要定义一组相关类型共享的核心行为并且希望这些类型之间存在紧密的联系,则可能更适合使用抽象类;若是要跨不同类型的对象建立某种行为上的联系或是想要模拟多重继承的效果,则应当考虑采用接口
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值