【JavaSE】:接口(二)

接口

  • 一.对学生进行排序
  • 二.Clonable接口
  • 三.抽象类和接口的区别
  • 四.Object类

一.对学生进行排序

在这里插入图片描述

在这里插入图片描述

很明显我们直接对学生进行排序是会报错的,因为编译器也不知道你需要按照名字排还是分数排,我们点击报错位置进入sort内部。

在这里插入图片描述

在sort内部我们可以看到它把数组转换成立一个Comparable类型。而这个Comparable是一个接口型,而这个接口里有一个compareto方法,我们需要实现这个接口。

import java.util.Arrays;class Student implements Comparable<Student>{String name;int score;public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "Student{" +"name=" + name +", score=" + score +'}';}@Overridepublic int compareTo(Student o) {if(this.score<o.score) return 1;else if(this.score>o.score) return -1;else return 0;}
}public class sort {public static void main(String[] args) {Student[] st=new Student[3];st[0]=new Student("张三",28);st[1]=new Student("李四",100);st[2]=new Student("王麻子",63);Arrays.sort(st);//排序System.out.println(Arrays.toString(st));//打印出来}
}

在这里插入图片描述

但是这样写有一个很明显缺点,就是写死了。它这个类就只能按年龄比较,为了更加灵活,java又提供了另一个接口comparator。

import java.util.Arrays;
import java.util.Comparator;class Student{String name;int score;public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "Student{" +"name=" + name +", score=" + score +'}';}
}//灵活方法
class Scompare implements Comparator<Student>{@Overridepublic int compare(Student o1, Student o2) {if(o1.score<o2.score) return 1;else if(o1.score>o2.score) return -1;else return 0;}
}public class sort {public static void main(String[] args) {Student[] st=new Student[3];st[0]=new Student("张三",28);st[1]=new Student("李四",100);st[2]=new Student("王麻子",63);//使用Scompare s=new Scompare();Arrays.sort(st,s);//排序System.out.println(Arrays.toString(st));//打印出来}
}

在这里插入图片描述

二.Clonable接口

Java 中内置了一些很有用的接口, Clonable 就是其中之一

在这里插入图片描述

Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”。但是要想合法调用 clone 方法, 必须要先实现Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常。object是所有类的父类(即使你没有写任何继承)。

import java.util.Arrays;
import java.util.Comparator;class Student implements Cloneable{String name;int score;public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "Student{" +"name=" + name +", score=" + score +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class sort {//因为克隆会抛出一个异常,所以main函数也需要声明异常public static void main(String[] args) throws CloneNotSupportedException{Student A=new Student("张三",60);//因为克隆方法是object里的,object是所有类的父类//这里相当于向下转,所以需要强转转型Student B=(Student) A.clone();System.out.println(B);}
}

在这里插入图片描述

上面我们仅仅是调用的object的克隆方法会问题,更改一下代码

在这里插入图片描述

在这里插入图片描述

这里出现了问题,我们只对A的money进行了修改,就跟B的money也发生了改变,不符合我们的预期。

在这里插入图片描述

因为我们仅仅将A里Money类的地址进行了拷贝,所以两者指向的Money对象自然是同一个,接下来实现一下让他们指向不同Money。

import java.util.Arrays;
import java.util.Comparator;class Money implements Cloneable{public double money=12.5;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}class Student implements Cloneable{public String name;public int score;public Money m=new Money();public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "Student{" +"name=" + name +", score=" + score +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {//克隆了student对象Student stu=(Student) super.clone();//克隆了student里的money对象stu.m=(Money) this.m.clone();return stu;}
}
public class sort {//因为克隆会抛出一个异常,所以main函数也需要声明异常public static void main(String[] args) throws CloneNotSupportedException{Student A=new Student("张三",60);//因为克隆方法是object里的,object是所有类的父类//这里相当于向下转,所以需要强转转型Student B=(Student) A.clone();System.out.println(A.m.money);System.out.println(B.m.money);System.out.println("#########");A.m.money=52.2;System.out.println(A.m.money);System.out.println(B.m.money);}
}

在这里插入图片描述

在这里插入图片描述

三.抽象类和接口的区别

核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法,子类必须重写所有的抽象方法。

在这里插入图片描述

四.Object类

Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父类。即所有类的对象都可以使用Object的引用进行接收。

例如

在这里插入图片描述

所以在开发之中,Object类是参数的最高统一类型。但是Object类也存在有定义好的一些方法。如下:

在这里插入图片描述

例如为什么在写了toString后printlen就会自动调用toString呢

在这里插入图片描述

printlen实际上是用object类接收的,然后再调用了一个valueof。

在这里插入图片描述

而valueof也是用object类接收,它就会调用自己写的toString。

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

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

相关文章

泛微OA对接金蝶云星空方案分享(对接场景解析)

分享金蝶云星空跟泛微OA系统集成对接的方案分享&#xff0c;主讲审批流程对接&#xff0c;表单对接的两类场景。分别是金蝶云星空发起申请和泛微发起流程审批&#xff0c;最终实现统一管理。 数据集成主要有以下好处&#xff1a; &#xff08;1&#xff09;数据一致性&#xf…

东南大学与OpenHarmony携手共建开源生态,技术俱乐部揭牌成立并迎来TSC专家进校园

11月25日,OpenAtom OpenHarmony(以下简称“OpenHarmony”)项目群技术指导委员会(以下简称“TSC”)与东南大学携手,于东南大学九龙湖校区金智楼一楼报告厅举办了“东南大学OpenHarmony技术俱乐部成立仪式暨OpenHarmony TSC专家进校园”活动。此次盛会标志着OpenHarmony开源社区和…

Mac M1 安装Docker打包arm64的python项目的镜像包

1、首先安装Docker&#xff0c;到官网下载&#xff0c;选择apple chip版 Docker中文网 官网 2、双击下载的dmg文件&#xff0c;在弹出框中之间拖拽到右边 3、打开docker&#xff0c;修改国内镜像源&#xff0c;位置在配置-DockerEngine "registry-mirrors": ["…

Go字符串类型

一、字符串 1、字符串 Go 语言里的字符串的内部实现使用 UTF-8 编码字符串带的值为双引号&#xff08;"&#xff09;中的内容&#xff0c;可以在 Go 语言的源码中直接添加非ASCII 码字符 s1 : "hello" s2 : "您好" 2、字符串转义符 Go 语言的字符…

UE4 UE5 使用SVN控制

关键概念&#xff1a;虚幻引擎中使用SVN&#xff0c;帮助团队成员共享资源。 1. UE4/UE5项目文件 如果不需要编译的中间缓存&#xff0c;则删除&#xff1a; DerivedDataCache、Intermediate、Saved 三个文件夹 2.更新、上传

【linux】基本指令(中篇)

echo指令 将引号内容打印到显示屏上 输出的重定向 追加的重定向 输出的重定向 我们学习c语言的时候当以写的方式创建一个文件&#xff0c;就会覆盖掉该文件之前的内容 当我们以追加的方式打开文件的时候&#xff0c;原文件内容不会被覆盖而是追加 more指令 10.more指令…

YOLOv8独家原创改进:自研独家创新MSAM注意力,通道注意力升级,魔改CBAM

💡💡💡本文自研创新改进:MSAM(CBAM升级版):通道注意力具备多尺度性能,多分支深度卷积更好的提取多尺度特征,最后高效结合空间注意力 1)作为注意力MSAM使用; 推荐指数:五星 MSCA | 亲测在多个数据集能够实现涨点,对标CBAM。 在道路缺陷检测任务中,原始ma…

基于51单片机超声波测距汽车避障系统

**单片机设计介绍&#xff0c; 基于51单片机超声波测距汽车避障系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的超声波测距汽车避障系统是一种用于帮助汽车避免碰撞和发生事故的设备&#xff0c;以下是一个基本…

Java面试-框架篇-Mybatis

Java面试-框架篇-Mybatis MyBatis执行流程延迟加载使用及原理一, 二级缓存来源 MyBatis执行流程 读取MyBatis配置文件: mybatis-config.xml加载运行环境和映射文件构造会话工厂SqlSessionFactory会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法)操作数据库的接口, Ex…

从零开始学习typescript——数据类型

数据类型 以前我们用js编写代码的时候&#xff0c;都是直接使用let、var、const 来定义数据类型&#xff1b;js会在运行时来确定数据类型&#xff0c;但是在ts中&#xff0c;可以在声明时就可以指定数据类型。如果你学过其他编程语言&#xff0c;比如c、java就能更好的理解了。…

HTML5原生视频播放器组件video的videocontrolslist属性详解

HTML5提供了内置的视频播放控件,其中videocontrolslist是其中一个很有用的属性。videocontrolslist属性可以用于告诉浏览器在视频播放过程中应该显示哪些默认的用户界面控件。下面我们将从几个方面来介绍videocontrolslist的详细使用。 一、启用videocontrolslist videocont…

格式工厂——万能格式转换器

很多时候&#xff0c;大家从网络上下载的文件不一定是自己想要的类型&#xff0c;比如flv等视频文件&#xff0c;而强行改文件后缀名只会造成文件格式错误&#xff0c;无法打开&#xff1b;而很多文件的格式并不能轻易转换&#xff0c;且很多渠道都需要收费。今天介绍的这款For…

实力登榜!迅镭激光荣膺“江苏省瞪羚企业”称号!

11月24日&#xff0c;江苏省生产力促进中心发布“江苏省独角兽企业和瞪羚企业评估结果”&#xff0c;迅镭激光凭借在技术研发、产品创新、市场服务等方面的取得的领先成就&#xff0c;荣膺“江苏省瞪羚企业”称号! “瞪羚企业”是指以科技创新或商业模式创新为支撑&#xff0c;…

一、Gradle 手动创建一个项目

文章目录 Gradle 介绍Gradle Wrapper Gradle 使用手动安装 Gradle初始化 Gradle 介绍 Gradle 是一个快速的、可信的、适应性强的自动化构建工具&#xff0c;它是开源的。它使用优雅的并且可扩展的描述性语言。其他的介绍在官网可以了解。 Gradle Wrapper 官方建议使用 Gradl…

c语言:模拟实现各种字符串函数

strlen函数&#xff1a; 功能&#xff1a;获取到\0之前的的字符个数。 代码模拟实现函数&#xff1a; //strlen //这里用了递归法&#xff0c; //如abc&#xff0c;1bc&#xff0c;然后11c&#xff0c;接着111&#xff0c;最后读取到\0&#xff0c;1110&#xff0c;得到结果3…

Day40力扣打卡

打卡记录 包子凑数&#xff08;裴蜀定理 DP&#xff09; 根据裴蜀定理&#xff0c;存在 c gcd(a, b) 使不定方程ax by c满足条件&#xff0c;如果gcd(a, b) 1即a与b互素的情况下&#xff0c;就会 ax by 1&#xff0c;由于为1可以构造后面的无穷数字&#xff0c;故得到结…

深入了解Java8新特性-日期时间API之ZonedDateTime类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概19000多字&#xff0c;预计阅读时间长需要10分钟以上。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…

离散系统的频域分析(数字信号处理实验2-1)

创建具有15 Hz和40 Hz分量频率的信号&#xff0c;叠加两个信号形成混合信号x&#xff0c;使用fft命令绘制x的频域图&#xff0c;标注频率为横坐标&#xff0c;平均能量为纵坐标。 文章目录 一.题目二.实验目的三.实验仪器四.实验原理1.MATLAB使用函数2.离散傅里叶变换(DFT)实验…

Python 装饰器与偏函数

目录 装饰器 概念 简单的装饰器 复杂点的装饰器 通用装饰器 定义通用装饰器 使用装饰器 偏函数 引入类库 应用 总结 装饰器 概念 装饰器就是个闭包&#xff1b;把一个函数当做参数&#xff0c;返回一个修改过功能的函数&#xff1b; 本质上是一个返回函数的函数。…

Mysql单表查询练习

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker (部门号 int(11) NOT NULL,职工号 int(11) NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10…