java基础——抽象类与接口

目录

一、抽象类

1. 定义

2. 示例代码

3. 特点

4. 使用场景

二、接口

1. 定义

2. 示例代码

3. 特点

三、抽象类和接口的区别

四、接口与抽象类的结合

五、自定义排序方法

六、总结


        在 Java 编程中,抽象类和接口是两个极为重要的概念,它们在代码设计和架构搭建中扮演着关键角色。合理运用抽象类和接口,能够提升代码的可维护性、可扩展性和可复用性。本文将深入探讨 Java 抽象类和接口的定义、特点、区别以及使用场景。

一、抽象类

1. 定义

        抽象类是一种不能被实例化的类,它为子类提供了一个通用的模板。抽象类可以包含抽象方法和具体方法。抽象方法是没有方法体的方法,它只定义了方法的签名,具体的实现需要由子类来完成。在 Java 中,使用 abstract 关键字来定义抽象类和抽象方法。

2. 示例代码

// 定义抽象类
abstract class Animal {public abstract void run(); // 抽象方法public void sleep() {  // 具体方法System.out.println("Animal is sleeping.");}
}
class Dog extends Animal { // 子类继承抽象类并实现抽象方法@Overridepublic void run() {System.out.println("Dog is running!");}
}
public class Main {public static void main(String[] args) {// Animal animal = new Animal(); // 不能实例化抽象类Dog dog = new Dog();dog.run();dog.sleep();}
}

3. 特点

  • 不能实例化:抽象类不能直接创建对象,只能通过其子类进行实例化。这是因为抽象类是作为模板使用的,本身需要子类继承来实现抽象类中的方法,且抽象方法没有具体的实现,无法直接使用。
  • 可以包含抽象方法和具体方法:抽象类中可以写抽象方法,也可以写普通方法。抽象方法用于定义子类必须实现的行为,而普通方法则提供了一些通用的实现,子类可以直接使用。
  • 可以有构造方法:抽象类可以有构造方法,用于初始化子类对象。当子类创建对象时,会先调用抽象类的构造方法。
  • 只能单继承:一个子类只能继承一个抽象类,因为抽象类也是父类。

4. 使用场景

        当多个类具有共同的特征和行为,并且其中一些行为的实现是相同的,可以使用抽象类来提取这些共同的部分。例如,在一个动物抽象类中,不同的动物(如狗、猫、鸟等)都有睡觉的行为,这部分行为可以定义成普通方法在抽象类中实现,子类直接调用即可。而不同动物的叫声则可以定义为抽象方法,由不同的子类来重写。

二、接口

1. 定义

        接口是一种完全抽象的类型,只包含抽象方法和常量在 Java 8 及以后的版本中,接口还可以包含默认方法和静态方法。默认方法提供了接口方法的默认实现,子类可以选择是否重写;静态方法则可以直接通过接口名调用。使用 interface 关键字来定义接口。

2. 示例代码

interface Flyable {  // 定义接口    void fly();  // 抽象方法    default void land() {  // 默认方法System.out.println("Flying object is landing.");}static void info() {  // 静态方法System.out.println("This is a flyable object.");}
}
class Bird implements Flyable {  // 类实现接口@Overridepublic void fly() {System.out.println("Bird is flying.");}
}
public class Main {public static void main(String[] args) {Bird bird = new Bird();bird.fly();  //子类调用父类的抽象方法bird.land();  Flyable.info();  通过类名直接调用接口中的静态方法}
}

3. 特点

  • 不能实例化:接口不能直接创建对象,需要通过实现类来实现接口中的方法。        
  • 只能包含抽象方法、默认方法、静态方法和常量:接口中的方法默认是 public abstract 的,常量默认是 public static final 的。
  • 可以多实现:一个类可以实现多个接口,从而实现多重继承的效果。这使得类可以同时具备多个不同接口定义的行为。
  • 没有构造方法:接口中不能有构造方法,因为接口不需要进行实例化。

三、抽象类和接口的区别

比较项抽象类接口
实例化不能实例化不能实例化
方法类型可以包含抽象方法和具体方法主要包含抽象方法,Java 8 及以后可以有默认方法和静态方法
成员变量可以有各种类型的成员变量只能有 public static final 类型的常量
构造方法可以有构造方法没有构造方法
继承 / 实现一个子类只能继承一个抽象类一个类可以实现多个接口
设计目的用于表示一组具有相似特征和行为的类的抽象用于定义一组行为规范,实现不同类之间的行为约束

四、接口与抽象类的结合

        在 Java 编程里,接口和抽象类各自具备独特的特性与用途,将它们结合使用能充分发挥二者的优势,设计出更灵活、可维护且可扩展的代码架构。以下会从结合使用的方式、示例以及使用场景展开详细阐述。

  • 抽象类实现接口:抽象类可以实现接口,它既能够为接口中的部分方法提供默认实现,也可以把未实现的方法继续定义为抽象方法,让具体的子类去完成实现。这种方式有助于提取公共的实现逻辑,降低代码的重复度。
  • 具体类继承抽象类并实现接口:具体类可以先继承一个抽象类,再实现多个接口。这样一来,具体类既能继承抽象类中的属性和方法,又能具备多个接口所定义的行为,实现多重特性的组合

五、自定义排序方法

重写 Arrays.sort() 方法,重写后的方法可以对特定对象进行排序,前提是对象实现了Comparable接口

package com.qcby;public class Arrays2 {/**** @param o*/public static void sort(Comparable[] o){  //入参是一个Comparable数组,数组中的值可以是任意对象类型,但前提是实现了Comparable类quickSort(o,0,o.length-1);}public static void quickSort(Comparable[] arr,int left,int right){ //利用快排对数组进行排序,排序比较的是值if(left>right){return;}int i = left;int j = right;//定义baseComparable base = arr[left];while (i!=j){while (arr[j].compareTo(base) >=0 && i<j){ //compareTo是在类中重写Comparable的方法,用于比较对象的年龄j--;}while (arr[i].compareTo(base) <=0 && i<j){i++;}Comparable temp = arr[j];arr[j] = arr[i];arr[i] = temp;}arr[left] = arr[i];arr[i] = base;quickSort(arr,left,i-1);quickSort(arr,i+1,right);}}

重写了Comparable接口的Person对象

public class Person implements Comparable<Person> {public String name;public int age;public double height;public Person(String name,int age,double height){this.name = name;this.age = age;this.height = height;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", height=" + height +'}';}@Override //重写了Comparable的compareTo方法public int compareTo(Person o) {return age - o.age;  //指定 age 进行从小到大排序return o.age - age;  //指定 age 进行从大到小排序return (int) (height - o.height);}
}

测试+输出结果

package com.qcby;import java.util.Arrays;public class Test {public static void main(String[] args) {Person p1 = new Person("小黑",18,185.0);Person p2 = new Person("小白",22,182.5);Person p3 = new Person("小黄",20,174.5);Person p4 = new Person("小何",24,178.5);Person[] arrPersons = new Person[]{p1,p2,p3,p4};//实现Comparable接口Arrays.sort(arrPersons);System.out.println(Arrays.toString(arrPersons));}
}

六、总结

抽象类和接口都是 Java 中实现抽象和多态的重要工具,但它们的设计目的和使用场景有所不同。在实际编程中,需要根据具体的需求来选择使用抽象类还是接口。如果多个类之间有共同的特征和行为,并且部分行为的实现是相同的,那么可以使用抽象类;如果需要定义一组行为规范,让不同的类来实现这些规范,或者需要实现多重继承的效果,那么可以使用接口。合理运用抽象类和接口,能够使代码更加清晰、灵活和可维护。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML应用指南:利用GET请求获取全国乐乐茶门店位置信息

随着新零售业态的快速发展,门店位置信息的获取变得越来越重要。作为新茶饮品牌之一,乐乐茶自2016年在上海五角场创立,乐乐茶不仅在产品质量和服务体验上持续领先,还积极构建广泛的门店网络,以支持其不断增长的用户群体。为了更好地理解和利用这些数据,本篇文章将深入探讨…

蚁剑(AutSword)的下载安装与报错解决

蚁剑&#xff08;AutSword&#xff09;的下载安装与报错解决 1.下载 唯一官方github下载地址 GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器 2.安装 打开并且进入到下面的界面 下载需要的的版本 进行初始化 3.报错 出现下面的报错 4.解决方法 出现上面报错…

从低清到4K的魔法:FlashVideo突破高分辨率视频生成计算瓶颈(港大港中文字节)

论文链接&#xff1a;https://arxiv.org/pdf/2502.05179 项目链接&#xff1a;https://github.com/FoundationVision/FlashVideo 亮点直击 提出了 FlashVideo&#xff0c;一种将视频生成解耦为两个目标的方法&#xff1a;提示匹配度和视觉质量。通过在两个阶段分别调整模型规模…

《计算机视觉》——角点检测和特征提取sift

角点检测 角点的定义&#xff1a; 从直观上理解&#xff0c;角点是图像中两条或多条边缘的交点&#xff0c;在图像中表现为局部区域内的灰度变化较为剧烈的点。在数学和计算机视觉中&#xff0c;角点可以被定义为在两个或多个方向上具有显著变化的点。比如在一幅建筑物的图像…

Linux下ioctl的应用

文章目录 1、ioctl简介2、示例程序编写2.1、应用程序编写2.2、驱动程序编写 3、ioctl命令的构成4、测试 1、ioctl简介 ioctl&#xff08;input/output control&#xff09;是Linux中的一个系统调用&#xff0c;主要用于设备驱动程序与用户空间应用程序之间进行设备特定的输入/…

对称加密算法——IDEA加密算法

Java IDEA算法详解 1. 理论背景 IDEA&#xff08;International Data Encryption Algorithm&#xff09;是一种对称密钥加密算法&#xff0c;由Xuejia Lai和James Massey于1991年提出。它被设计用于替代DES&#xff08;Data Encryption Standard&#xff09;算法&#xff0c;…

Jenkins 给任务分配 节点(Node)、设置工作空间目录

Jenkins 给任务分配 节点(Node)、设置工作空间目录 创建 Freestyle project 类型 任务 任务配置 Node 打开任务-> Configure-> General 勾选 Restrict where this project can be run Label Expression 填写一个 Node 的 Label&#xff0c;输入有效的 Label名字&#x…

20250217 随笔 redis非原子性操作简述

从你提供的文本来看&#xff0c;核心是 Redis 作为缓存的检查机制&#xff0c;以及非原子性操作导致的不一致性问题。 我们可以拆解为两个部分来理解&#xff1a; &#x1f4cc; 1. 逻辑&#xff1a;先查 Redis&#xff0c;再决定是否注册 逻辑流程 先查询 Redis 是否有某个 …

SVM对偶问题

1、对偶问题数学基础 对偶问题&#xff1a;在线性规划中&#xff0c;每一个线性规划问题(称为原问题)都有一个与之对应的对偶问题。从数学形式上看&#xff0c;如果原问题是求解一个线性目标函数的最大值&#xff08;或最小值&#xff09;&#xff0c;在满足一系列线性不等式&…

CSDN、markdown环境下如何插入各种图(流程图,时序图,甘特图)

流程图 横向流程图 mermaid graph LRA[方形] --> B{条件a}B -->|满足| C(圆角)B -->|不满足| D(圆角)C --> E[输出结果1]D --> E效果图&#xff1a; 竖向流程图 mermaid graph TDC{条件a} --> |a1| A[方形]C --> |a2| F[竖向流程图]A --> B(圆角)B …

MSI微星电脑冲锋坦克Pro Vector GP76 12UGS(MS-17K4)原厂Win11系统恢复镜像,含还原功能,预装OEM系统下载

适用机型&#xff1a;【MS-17K4】 链接&#xff1a;https://pan.baidu.com/s/1P8ZgXc6S_J9DI8RToRd0dQ?pwdqrf1 提取码&#xff1a;qrf1 微星笔记本原装出厂WINDOWS11系统自带所有驱动、出厂主题壁纸、系统属性专属联机支持标志、Office办公软件、MSI Center控制中心等预装…

MySQL 之INDEX 索引(Index Index of MySQL)

MySQL 之INDEX 索引 1.4 INDEX 索引 1.4.1 索引介绍 索引&#xff1a;是排序的快速查找的特殊数据结构&#xff0c;定义作为查找条件的字段上&#xff0c;又称为键 key&#xff0c;索引通过存储引擎实现。 优点 大大加快数据的检索速度; 创建唯一性索引&#xff0c;保证数…

Ubuntu18.04安装rvm、ruby2.6.5和rails5.2.6

系统环境&#xff1a;Ubuntu 18.04 一、安装前准备 1. sudo apt update 2. sudo apt upgrade 如果提示abort&#xff0c;忽略。 3. sudo apt install sqlite3 gnupg curl git libpq-dev 二、安装rvm ruby版本管理器 1.切换管理员模式 sudo su 2.安装软件签名公钥 gpg…

【WPS+VBA】表格中重复表头与页码的批量删除

向豆包对话可以死磕的&#xff0c;以前问问题我只是根据第一条给出的答案使用。AI还有个优点&#xff0c;不会烦你&#xff0c;只要有问题就接着问&#xff0c;一直问到解决好问题。小编对豆包的连环提问&#xff0c;最终解决了批量删表头页面的问题。 1、豆包对话过程 开始问…

[Windows] Win7也能控制安卓手机屏幕(手机镜像投屏):scrcpy

Win7也能控制安卓手机屏幕&#xff08;手机镜像投屏&#xff09;&#xff1a;scrcpy 链接&#xff1a;https://pan.xunlei.com/s/VOJGlhQkX9mNqCYsM2cMbYxsA1?pwdm9wq# 系统平台&#xff1a;Windows 7/10/11 &#xff08;Win7系统需打开“Win7”文件夹进行操作&#xff09; …

Windows 环境下 Prometheus 安装指南

目录 确认系统环境 下载 Prometheus 解压安装包 配置 Prometheus 启动 Prometheus 访问 Prometheus Web 界面 确认系统环境 确保你的 Windows 系统满足 Prometheus 的运行要求&#xff08;推荐 Windows 10 或更高版本&#xff09;。 下载 Prometheus 打开 Prometheus 官…

使用Linux创作第一个小程序--进度条

Linux第一个小程序 - 进度条 储备知识 1.回车换行 回车概念 \r 换行概念 \n 2.缓冲区 sleep 先执行1 后执行2&#xff08;c语言中是按顺序执行的&#xff09; 那么在我sleep期间&#xff0c;“Hello World”一定是被保存起来了&#xff08;缓冲区&#xff09;。 缓冲区&a…

工业制造能耗管理新突破,漫途MTIC-ECM平台助力企业绿色转型!

在工业制造领域&#xff0c;能源消耗一直是企业运营成本的重要组成部分。随着“双碳”目标的推进&#xff0c;如何实现高效能耗管理&#xff0c;成为制造企业亟待解决的问题。漫途MTIC-ECM能源能耗在线监测平台&#xff0c;结合其自研的硬件产品&#xff0c;为工业制造企业提供…

DFS算法篇:理解递归,熟悉递归,成为递归

1.DFS原理 那么dfs就是大家熟知的一个深度优先搜索&#xff0c;那么听起来很高大尚的一个名字&#xff0c;但是实际上dfs的本质就是一个递归&#xff0c;而且是一个带路径的递归&#xff0c;那么递归大家一定很熟悉了&#xff0c;大学c语言课程里面就介绍过递归&#xff0c;我…

【Java学习】继承

一、继承 子类继承父类&#xff0c;子类这个类变量的引用在原有的指向子类自己类变量空间的原有访问权限上&#xff0c;增加上了父类类变量空间的访问权限&#xff0c;此时子类类变量指向的空间变为了原来子类类变量空间加上父类类变量空间&#xff0c;此时子类类变量空间就变成…