温故知新之:接口和抽象类有什么区别?

news2024/12/23 5:37:42

本文以下内容基于 JDK 8 版本。

1、接口介绍

接口是 Java 语言中的一个抽象类型,用于定义对象的公共行为。它的创建关键字是 interface,在接口的实现中可以定义方法和常量,其普通方法是不能有具体的代码实现的,而在 JDK 8 之后,接口中可以创建 static 和 default 方法了,并且这两种方法可以有默认的方法实现。

接口定义:

package basic.person;

public interface IPerson {

    String info = "info";

    default void selectOne() {
        System.out.println("interface IPerson selectOne!");
    }

    void selectTwo();

    static void selectThree() {
        System.out.println("interface IPerson selectThree!");
    }
}

接口实现:

package basic.person;

public class PersonImpl implements IPerson {

    @Override
    public void selectTwo() {
        System.out.println("interface IPerson selectTwo!");
        System.out.println("interface IPerson info===" + info);
        selectOne();
        IPerson.selectThree();
    }
}

测试类:

package basic.person;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class MainTest {

    @Before
    public void before(){
        System.out.println("junt test before init.");
    }

    //
    @Test
    public void test() {
        IPerson person =  new PersonImpl();
        person.selectTwo();
    }

    @After
    public void after(){
        System.out.println("junt test after init.");
    }
}

运行结果:

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe"************************ -junit4 basic.person.MainTest,test
junt test before init.
interface IPerson selectTwo!
interface IPerson info===info
interface IPerson selectOne!
interface IPerson selectThree!
junt test after init.

Process finished with exit code 0

结论:

  1. JDK 8 中接口可以定义 static 和 default 方法,并且这两种方法可以包含具体的代码实现。
  2. 实现接口要使用 implements 关键字。
  3. 接口不能直接实例化。
  4. 接口中定义的变量默认为 public static final 类型。
  5. 实现类不重写接口中的 static 和 default 方法的情况下,默认调用的是接口的方法实现。

2、抽象类介绍

抽象类和接口类似,它也是用来定义对象的公共行为的,并且它也不能直接实例化,抽象类的实现关键字为 abstract class,子类用 extends 关键字继承父类。 

抽象类:

package basic.abstractclass;

public abstract class ParentPerson {

    int age =20;

    public abstract void  methodA();

    public void  methodB(){
        System.out.println("ParentPerson methodB init!");
    };

}

实现类

package basic.abstractclass;

public class Person extends ParentPerson {

    @Override
    public void methodA() {
        System.out.println("Person methodA init;");
        methodB();
    }
    
}

 测试类

package basic.abstractclass;

import basic.person.IPerson;
import basic.person.PersonImpl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class MainTest {

    @Before
    public void before(){
        System.out.println("junt test before init.");
    }

    //
    @Test
    public void test() {
//        ParentPerson parentPerson = new ParentPerson();
        ParentPerson parentPerson = new Person();
        parentPerson.methodA();

    }

    @After
    public void after(){
        System.out.println("junt test after init.");
    }
}

测试结果:

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" ........................
junt test before init.
Person methodA init;
ParentPerson methodB init!
junt test after init.

Process finished with exit code 0

结论

  1. 抽象类使用 abstract 关键字声明。
  2. 抽象类中可以包含普通方法和抽象方法,抽象方法不能有具体的代码实现。
  3. 抽象类需要使用 extends 关键字实现继承。
  4. 抽象类不能直接实例化。
  5. 抽象类中属性控制符无限制,可以定义 private 类型的属性。

3、接口和抽象类区别介绍

3.1、定义关键字不同

接口使用关键字 interface 来定义。 抽象类使用关键字 abstract 来定义。

3.2、继承或实现的关键字不同

接口使用 implements 关键字定义其具体实现。 抽象类使用 extends 关键字实现继承。

3.3、实现(子)类扩展的数量不同

接口的实现类可以实现很多接口,抽象类的子类,只能继承一个抽象类。在Java 语言中,一个类只能继承一个父类(单继承),但可以实现多个接口。

3.4、属性访问控制符不同

接口中属性的访问控制符只能是 public,接口中的属性默认是 public static final 修饰的。

 抽象类中的属性访问控制符无限制,可为任意控制符。

3.5、方法控制符不同

接口中方法的默认控制符是 public,并且不能定义为其他控制符。

抽象类中的方法控制符无限制,其中抽象方法不能使用 private 修饰。

3.6、方法实现不同

接口中普通方法不能有具体的方法实现,在 JDK 8 之后 static 和 default 方法必须有方法实现。

从上述结果可以看出:static 或 default 方法如果没有方法实现就会报错,而普通方法如果有方法实现就会报错。 ​

抽象类中普通方法可以有方法实现,抽象方法不能有方法实现。

从上述结果可以看出:抽象类中的普通方法如果没有方法实现就会报错,而抽象方法如果有方法实现则会报错。 

3.7、静态代码块使用不同

接口中不能使用静态代码块。

抽象类中可以使用静态代码块。

4、总结

  1. 定义的关键字不同。
  2. 子类继承或实现关键字不同。
  3. 类型扩展不同:抽象类是单继承,而接口是多继承。
  4. 方法访问控制符:抽象类无限制,只是抽象类中的抽象方法不能被 private 修饰;而接口有限制,接口默认的是 public 控制符。
  5. 属性方法控制符:抽象类无限制,而接口有限制,接口默认的是 public 控制符。
  6. 方法实现不同:抽象类中的普通方法必须有实现,抽象方法必须没有实现;而接口中普通方法不能有实现,但在 JDK 8 中的 static 和 defualt 方法必须有实现。
  7. 静态代码块的使用不同:抽象类可以有静态代码块,而接口不能有。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/911144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

南京医科大学采购ZJ-3精密压电测试仪和PZT-JH30/3型复合压电极化装置

南京医科大学采购ZJ-3精密压电测试仪和PZT-JH30/3型复合压电极化装置 南京医科大学(Nanjing Medical University),位于江苏省南京市,是教育部、中华人民共和国国家卫生健康委员会、江苏省人民政府共建高校和江苏高水平大学建设高校…

长胜证券:怎么看k线图?

K线图是股票、期货、外汇等金融商场中常用的一种图表方式,用来展示必定时刻内的价格走势。关于投资者来说,学会怎么正确地剖析K线图是非常重要的。本文将从多个视点来剖析怎么看K线图,协助投资者更好地把握商场走势和做出正确的买卖决议计划。…

Java:集合LinkedSet底层原理、TreeSet底层原理;开发中如何选择集合使用

LinkedSet底层原理 TreeSet底层原理 如果你想对自定义类型的对象进行排序,有两种方式 但是执行出来,如果两个比较的数据相等,就会造成一个数据丢失 第二种

天翼物联、汕头电信与汕头大学共建新一代信息技术与数字创新(物联网)联合实验室

近日,在工业和信息化部和广东省人民政府共同主办的2023中国数字经济创新发展大会上,天翼物联、汕头电信与汕头大学共建“新一代信息技术与数字创新(物联网)”联合实验室签约仪式举行。汕头大学校长郝志峰、中国电信广东公司总经理…

ssm物流管理系统源码和论文

ssm物流管理系统设计与实现037 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 1.选题的意义与目的、文献综述与研究现状 随着我国经济的快速发展,以及信息化步伐的快,物流企…

使用GEWE框架进行微信个人资料管理、批量管理

友情链接 geweapi.com 点击即可访问 更新个人资料 请求URL: http://域名地址/api/personal/updateprofile 请求方式: POST 请求头: Content-Type:application/json X-GEWE-TOKEN: 后台获取 参数: 参数名必填…

【正点原子STM32连载】第十八章 通用定时器PWM输出实验 摘自【正点原子】APM32F407最小系统板使用指南

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 第十…

【附安装包】Solid Edge2023安装教程最强CAD选择

软件下载 软件:Solid Edge版本:2023语言:简体中文大小:3.85G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.0GHz 内存4G(或更高)下载通道①百度网盘丨64位下载链接:https://pan.bai…

Python 如何复制列表,高效复制列表,列表复制效率对比,copy 与 deepcopy 差距对比

背景 在python中,避免不了经常使用 list 类型的变量,list 变量的复制也是经常遇到的需求,那么如何高效的复制一个 list呢? 代码 下面代码给出了 4 种不同的list复现方法,观察其代码效率: # -*- coding:…

Vue3 中引入液晶数字字体(通常用于大屏设计)

一、下载 .ttf 字体文件到本地,放在 src 中的 assets 文件下 下载液晶字体 DS-Digital.ttf 二、在 css 文件中引入字体 /* src/assets/fonts/dsfont.css */ font-face {font-family: electronicFont;src: url(./DS-Digital.ttf);font-weight: normal;font-styl…

CS144 计算机网络 Lab2:TCP Receiver

前言 Lab1 中我们使用双端队列实现了字节流重组器,可以将无序到达的数据重组为有序的字节流。Lab2 将在此基础上实现 TCP Receiver,在收到报文段之后将数据写入重组器中,并回复发送方。 实验要求 TCP 接收方除了将收到的数据写入重组器中外…

记录:ubuntu20.04+ORB_SLAM2_with_pointcloud_map+ROS noetic

由于相机实时在线运行需要ROS,但Ubuntu22.04只支持ROS2,于是重装Ubuntu20.04。上一篇文章跑通的是官方版本的ORB_SLAM2,不支持点云显示。高翔修改版本支持RGB-D相机的点云显示功能。 高翔修改版本ORB_SLAM2:https://github.com/ga…

vue中css修改滚动条样式

vue中css修改滚动条样式 效果图: 代码(在app.vue中全局增加下面样式即可): &::-webkit-scrollbar {width: 8px;height: 8px;border-radius: 3px;}/*定义滚动条轨道 内阴影圆角*/&::-webkit-scrollbar-track {//-webkit-box-shadow: inset 0 0 …

服务器的介绍

1.服务器概述 1.1 服务器的基本概念 服务器是计算机的一种,是网络中为客户端计算机提供各种服务的高性能计算机; 服务器在网络操作系统的控制下,将与其相连的硬盘、磁带、 打印机及昂贵的专用通讯设备提供给网络上的客户站点共享&#xf…

HTML动态爱心特效代码【一】(附源码)

前言 七夕马上就要到了,为了帮助大家高效表白,下面再给大家带来了实用的HTML浪漫表白代码(附源码)背景音乐,可用于520,情人节,生日,表白等场景,可直接使用。 效果演示 文案修改 var loverNam…

2023七夕小程序

又是一年七夕节 往年七夕小程序 2020 https://blog.csdn.net/chen_227/article/details/107062998 2022 视频 QiXi2022 代码 https://gitee.com/chen227/qixi2022-qt-qml 2023 效果 代码 https://gitee.com/chen227/qixi2023-qt-qml

ICC2工具如何避免对mux选择信号端口进行检查

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?拾陆楼知识星球入口 time.clock_gating_user_seeting_only这个option设置成false,导致对选择器的S端进行了时序分析,进而可能出现违例。 设置成true即可。

cuda面试准备(一),架构调试

1 cuda架构 硬件方面 SP (streaming Process) ,SM (streaming multiprocessor) 是硬件(GPUhardware) 概念。而thread,block,grid,warp是软件上的(CUDA) 概念 SP:最基本的处理单元,streaming processor,也称为CUDA core,最后具体的指令和任务都是在SP上处理的。GPU进行并行…

QT中按钮的基类QAbstractButton

QT中按钮的基类QAbstractButton 关于控件类的学习方法继承关系信号槽函数标题和图标按钮的 Check 属性 关于控件类的学习方法 控件类很多,API更多,但是不需要记忆知道控件对应的类名,通过帮助文档随用随查优先看帮助文档中控件对应的信号和槽…

速通蓝桥杯嵌入式省一教程:(八)ADC测量模拟电压

ADC(Analog to Digital Converter),模拟数字转换器,是电子工程师必须掌握的一个内容。由于单片机、计算机等是由0和1组成的,因此其无法直接测量或使用连续的模拟信号,需要用ADC将模拟信号转换为离散的数字信号。ADC的具体原理在此…