首页 > 其他分享 >抽象类和接口的区别

抽象类和接口的区别

时间:2024-08-20 11:25:01浏览次数:12  
标签:区别 继承 修饰符 默认 接口 抽象类 public

在Java中,抽象类和接口都是用于实现抽象化和多态的机制,但它们之间有一些共同点和显著的区别。

共同点

  1. 抽象化:抽象类和接口都用于定义抽象行为,即可以定义方法但不提供具体实现。
  2. 不能实例化:抽象类和接口都不能被直接实例化。只能通过其子类或实现类来创建对象。
  3. 多态:它们都支持多态,允许通过父类或接口类型来引用子类对象。
  4. 继承与实现:一个类继承抽象类或者实现接口,都必须重写他们的所有方法,否则自己也必须成为抽象类,不然编译报错。

    区别:

    1.关键字

    抽象类:使用abstract关键字定义

    接口:使用interface关键字定义

    2.方法实现

    抽象类:可以包含抽象方法和具体方法

    接口:默认情况下,所有的方法都是抽象方法,(Java 8 及以后的版本允许有默认方法和静态方法)

    3.构造方法

    抽象类:可以有构造方法

    接口:没有构造方法

    4.多重继承

    抽象类:不支持多重继承,只能继承一个类

    接口:支持多重继承,可以实现多个接口

    5.访问修饰符

    抽象类:可以用多种修饰符(public,protected,default,private)

    接口:所有方法默认public修饰,因为要供类实现功能,字段默认是 public static final

    6.用途

    抽象类:通常用于表示“什么是一个的关系”(is -a)

    接口 :通常用于表示可以做什么的能力,表示功能(can- do)

区别

特性抽象类接口
关键字使用 abstract 关键字定义使用 interface 关键字定义
方法实现可以包含抽象方法和具体方法默认情况下,所有方法都是抽象的(Java 8 及以后的版本允许有默认方法和静态方法)
构造函数可以有构造函数没有构造函数
字段可以包含实例变量(字段),可以有访问修饰符只能包含 public static final 字段
多重继承不支持多重继承,只能继承一个类支持多重继承,可以实现多个接口
访问修饰符可以使用多种访问修饰符(public、protected、private)所有方法默认是 public,字段默认是 public static final
用途通常用于表示“是一个”的关系(is-a)通常用于表示“可以做”的能力(can-do)

选择使用抽象类还是接口

  • 使用抽象类:当你需要共享代码并提供一些默认实现时,使用抽象类。
  • 使用接口:当你需要定义一组功能或行为,而不关心具体实现时,使用接口。
    // 抽象类示例
    abstract class Animal {
        abstract void makeSound(); // 抽象方法
        void sleep() {              // 具体方法
            System.out.println("Sleeping...");
        }
    }
    
    // 接口示例
    interface CanFly {
        void fly(); // 默认是抽象方法
    }
    
    class Bird extends Animal implements CanFly {
        void makeSound() {
            System.out.println("Chirp");
        }
        
        public void fly() {
            System.out.println("Flying");
        }
    }
    

标签:区别,继承,修饰符,默认,接口,抽象类,public
From: https://blog.csdn.net/2302_76758195/article/details/141319869

相关文章

  • 在K8S中,在主机和容器上部署应用程序有什么区别?
    在Kubernetes中部署应用程序有两种主要的方式:直接在主机上部署(也称为裸金属或非容器化部署)和在容器中部署。这两种方式有着本质的区别,下面将详细介绍它们的特点和应用场景。1.直接在主机上部署应用程序特点:直接运行:应用程序直接安装在操作系统上,没有额外的容器层。资源利......
  • OOP篇(Java - 抽象类、类、对象、构造器、接口、内部类、 代码块、枚举)(doing)
    目录一、抽象类1.简介2.什么时候定义抽象类?3.什么是抽象方法?4.抽象类的作用是什么?5.继承抽象类需要做什么?6.抽象类为什么不能创建对象?自己干什么,创建对象毫无意义7.final和abstract是什么关系?二、类1.简介2.表示类关系的UML符号3.类的组成4.如何定义......
  • TCPIP路由技术第一卷第七章第六部分案例研究二多eigrp进程Passive接口自动汇总和手工
    tcp/ip_eigrp-2案例研究r1:routereigrp90nonetwork15.1.1.10.0.0.0r5:noroutereigrp90routereigrp1network0.0.0.00.0.0.0r1:routereigrp1network15.1.1.10.0.0.0routereigrp90redistributeeigrp1(在eigrp和eigrp之间重分布不需要加metric)rout......
  • TCPIP路由技术第一卷第八章OSPF 第二部分-1接口结构和接口状态机
    tcp/ip_ospf案例研究一r2:inte1/0ipospf110area0r3:inte1/0ipospf110area0r2:showipospfneighborauto-costreference-bandwidth更改缺省的参考带宽.在一个ospf域建议配置一致.inftransdelay:这个信息是指lsa从路由器的接口发送后经历的时间,以秒数计算,......
  • 【面试】阐述TCP和UDP的区别
    面试模拟场景面试官:你能阐述一下TCP和UDP的区别吗?###参考回答示例1.连接性TCP:面向连接(Connection-Oriented):TCP是一种面向连接的协议,在传输数据之前需要建立连接。在TCP通信过程中,客户端和服务器之间通过“三次握手”来建立连接,然后再进行数据传输,确保两者之间的......
  • 【前端】使用Promise达到循环调用接口的效果
    Promise.all()要使用Promise.all调用同一个异步方法多次并将所有结果收集起来,你可以创建一个包含该方法调用的Promise数组,然后将这个数组传递给Promise.all。示例:假设你有一个异步方法fetchData(id),你想针对一组ID调用它并等待所有结果。asyncfunctionfetchData(id){......
  • 存储系列之 从ext2到ext3、ext4 的变化与区别
     来自:https://www.cnblogs.com/orange-CC/p/12673073.html 存储系列之从ext2到ext3、ext4的变化与区别引言:ext3和ext4对ext2进行了增强,但是其核心设计并没有发生变化。所以建议先查看上上篇的《存储系列之Linuxext2概述 》,有了ext2的基础,看这篇就是soeasy了。......
  • C++批量核验身份证真伪、实名认证接口、身份证识别
    实名认证接口是指一个系统或程序,它能够接收用户的个人信息(如姓名、身份证号码等),并与官方记录进行匹配以验证这些信息的真实性。这种接口可以集成到各种应用程序和服务中,以增强安全性并遵守相关法律法规的要求。批量核验身份证真伪以及进行实名认证是许多在线服务平台为了......
  • Vue——el-option下拉框绑定,value为数字和字符串区别
    Vue——el-option下拉框绑定1、正常使用v-for进行遍历下拉框内容,如果需要增加一个自定义的值,则加一个el-optionel-option用法:参数说明类型可选值默认值value选项的值string/number/object——label选项的标签,若不设置则默认与v......
  • Tree.Kind.STRING_LITERAL 、Tree.Kind.IDENTIFIER、Tree.Kind.TEXT_BLOCK 区别
    在SonarQubeJava插件开发中,Tree.Kind.STRING_LITERAL、Tree.Kind.IDENTIFIER和Tree.Kind.TEXT_BLOCK是用于表示不同类型Java代码节点的常量。1.Tree.Kind.STRING_LITERAL用途:表示Java代码中的字符串文字(即用双引号括起来的文本)。示例:"Hello,World!""username......