【JavaSE】接口 详解(下)

前言

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

接口实例运用

代码举例理解

比较对象的年龄

比较对象的姓名

利用冒泡排序实现Array.sort

年龄比较器

姓名比较器

比较示例测试

clone接口

浅拷贝和深拷贝

浅拷贝

图解

代码举例

深拷贝

图解

代码举例


接口实例运用

接口实现比较引用数据类型(对于引用类型数据来说,不能直接用大于小于号来比较)

代码举例理解

这里要比较两个对象的大小(指定某种方式比较,比如 年龄等)

比较对象的年龄

package demo6;

//接口Comparable 实现 比较引用类型数据的方法,这里面的comparable 的compareTo需要重写
class Student implements Comparable<Student>{
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override//要重写这个方法
    public int compareTo(Student o) {
    /*    if(this.age>o.age){//this表示当前对象,o表示传的参数
            return 1;
        }
        else if(this.age<o.age){
            return 0;
        }
        else{
            return -1;
        }*/
        //代码改良
        return this.age-o.age;
    }
}

public class Test6 {
    public static void main(String[] args) {
        Student student1=new Student("zhangsan",20);
        Student student2=new Student("lisi",5);
//        比较student1和student2,如果1大于2,返回大于0的数字,否则返回小于0的数字
        if(student1.compareTo(student2)>0){//调用的是student1的比较方法,传的是参数是student2
            System.out.println("student1>student2");
        }
        else{
            System.out.println("student1<=student2");
        }
    }
}

测试结果

比较对象的姓名

name是String类型,Java里面自带了字符串比较方法compareTo,比较的是字符串的ASCII码值

        @Override//要重写这个方法
    public int compareTo(Student o) {
        if(this.name.compareTo(o.name)>0){//this表示当前对象,o表示传的参数
            return 1;
        }
        else if(this.name.compareTo(o.name)==0){
            return 0;
        }
        else{
            return -1;
        }

这里有问题:Comparable接口有局限性(一旦这个类写死了比较方式,就不能随意更改)

利用冒泡排序实现Array.sort

public class Test6 {
    //冒泡排序 模拟实现引用数据类型的排序
    public static void mySort(Comparable[] comparable){
        for (int i = 0; i < comparable.length-1; i++) {
            for (int j = 0; j < comparable.length-1-i; j++) {
                if(comparable[j].compareTo(comparable[j+1])>0){
                    //交换
                    Comparable tmp=comparable[j];
                    comparable[j]=comparable[j+1];
                    comparable[j+1]=tmp;
                }
            }
        }
    }

    public static void main(String[] args) {
        Student[] students=new Student[3];
        students[0]=new Student("zhangsan",8);
        students[1]=new Student("lisi",4);
        students[2]=new Student("wangwu",10);
        mySort(students);
        System.out.println(Arrays.toString(students));
    }
    
}

代码结果(这里是根据学生的年龄排的结果)

年龄比较器

package demo;

import java.util.Comparator;

public class AgeComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.age-o2.age;
    }
}

姓名比较器

package demo;

import java.util.Comparator;

public class NameComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1,Student o2) {
        return o1.name.compareTo(o2.name);
    }
}

比较示例测试

public class Test {
    public static void main(String[] args) {

        Student student1=new Student("zhangsan",4);
        Student student2=new Student("lisi",6);

        //年龄比较器
        AgeComparator ageComparator=new AgeComparator();
        int ret=ageComparator.compare(student1,student2);
        System.out.println(ret);
        //名字比较器
        NameComparator nameComparator=new NameComparator();
        int ret2=nameComparator.compare(student1,student2);
        System.out.println(ret2);
    }

clone接口

前提:任何一个对象默认都是继承Object类的(是所有类的父类)

package demo3;

class Student implements Cloneable{//CloneNotSupportedException 必须实现Cloneable接口
    public int age;

    public Student(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();//Object中的clone方法使用了protected修饰,所以要重写,并用super访问
    }
}


public class Test {
    public static void main(String[] args)  throws CloneNotSupportedException {
        Student student1=new Student(10);
        Student student2=(Student)student1.clone() ;//clone是父类方法,在子类中使用要强制转换 (向下转型)
    }
}

浅拷贝和深拷贝

浅拷贝

两个引用指向一个对象,如两个Student指向一个Money

图解

代码举例

package demo3;

class Money {
    public double money=12.5;
}

class Student implements Cloneable{//CloneNotSupportedException 必须实现Cloneable接口
    public int age;
    public Money m=new Money();

    public Student(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();//Object中的clone方法使用了protected修饰,所以要重写,并用super访问

    }
}


public class Test {
    public static void main(String[] args)  throws CloneNotSupportedException {
        Student student1=new Student(10);
        Student student2=(Student)student1.clone() ;//clone是父类方法,在子类中使用要强制转换 (向下转型)
        System.out.println(student1.m.money);//12.5
        System.out.println(student2.m.money);//12.5
        System.out.println("============");
        student2.m.money=100;
        System.out.println(student1.m.money);
        System.out.println(student2.m.money);

    }
}

打印结果

这里通过对象student2修改了money,而student1的money也被修改了

深拷贝

两个引用指向两个对象,如两个Student指向两个个Money

图解

代码举例

package demo3;

class Money implements Cloneable{//表示Money支持克隆功能
    public double money=12.5;

    @Override
    protected Object clone() throws CloneNotSupportedException {//要重写克隆方法
        return super.clone();
    }
}

class Student implements Cloneable{//CloneNotSupportedException 必须实现Cloneable接口
    public int age;
    public Money m=new Money();

    public Student(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
    Student tmp=(Student)super.clone();
    tmp.m=(Money)this.m.clone();
    return tmp;
    }
}


public class Test {
    public static void main(String[] args)  throws CloneNotSupportedException {
        Student student1=new Student(10);
        Student student2=(Student)student1.clone() ;//clone是父类方法,在子类中使用要强制转换 (向下转型)
        System.out.println(student1.m.money);//12.5
        System.out.println(student2.m.money);//12.5
        System.out.println("============");
        student2.m.money=100;
        System.out.println(student1.m.money);
        System.out.println(student2.m.money);
    }
}

打印结果

这里通过对象student2修改了money,student1的money不会被修改。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录学习Day 26

332.重新安排行程 题目链接 from collections import defaultdictclass Solution:def findItinerary(self, tickets):targets defaultdict(list) # 创建默认字典&#xff0c;用于存储机场映射关系for ticket in tickets:targets[ticket[0]].append(ticket[1]) # 将机票输入…

GlusterFS分布式存储

目录 前言 一、GlusterFS分布式存储概述 1、GFS概念 2、GFS特点 3、GFS术语 4、GFS构成 5、GFS工作流程 6、后端存储如何定位文件 7、GlusterFs的卷类型 7.1 Distributed Volume&#xff08;分布式卷&#xff09; 7.2 Striped Volume&#xff08;条带卷&#xff09…

【JavaEE初阶系列】——网络初识—TCP/IP五层网络模型

目录 &#x1f6a9;网络的发展史 &#x1f388;局域网LAN &#x1f388;广域网WAN &#x1f6a9;网络通信基础 &#x1f388;IP地址 &#x1f388;端口号 &#x1f388;协议类型 &#x1f388;五元组 &#x1f6a9;协议分层 &#x1f388;什么是协议分层 &#x…

Web前端-Ajax

Ajax 概念:Asynchronous JavaScript And XML,异步的JavaScript和XML。 作用: 1.数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。 2.异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用的校验等等…

TryHackMe - HTTP Request Smuggling

学完、打完后的复习 HTTP 1 这部分比较简单&#xff0c;直接略过 HTTP2请求走私 首先要了解HTTP2的结构&#xff0c;与HTTP1之间的一些差异 HTTP2中不再使用CRLF来作为字段的边界限定&#xff0c;而是在二进制中直接通过长度、名字、值长度、值&#xff0c;来确认边界 而这…

Leetcode算法训练日记 | day21

一、二叉搜索树的最小绝对差 1.题目 Leetcode&#xff1a;第 530 题 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,…

不到6毛钱的I2C总线实时时钟日历芯片LK8563

前言 8563实时时钟芯片&#xff0c;国内外均有多家生产&#xff0c;今推荐一个性价比极高的RTC芯片&#xff0c;LK8563&#xff0c;一片不到6毛钱. 特点 基于32.768kHz晶体的秒&#xff0c;分&#xff0c;小时&#xff0c;星期&#xff0c;天&#xff0c;月和年的计时 带有世…

Redis系列之基于Linux单机安装

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库&#xff0c;并提供多种语言的 API。最近学习需要用到Redis&#xff0c;所以就去Linux服务器上部署一个&#xff0c;做下记录&#xff0c;方便…

web安全学习笔记【22】——文件上传(1)

WEB攻防-PHP应用&文件上传&函数缺陷&条件竞争&二次渲染&黑白名单&JS绕过 演示案例&#xff1a; PHP-原生态-文件上传-前后端验证PHP-原生态-文件上传-类型文件头验证PHP-原生态-文件上传-后缀黑白名单验证PHP-原生态-文件上传-解析配置&二次渲染…

JUC 线程及创建线程

最近想再系统地复习一遍并发&#xff0c;随便再把以前整理的笔记整理为博客。 概念 了解线程前先要了解一下进程&#xff0c;进程是程序的一次执行过程&#xff0c;是系统运行的基本单位&#xff0c;其可以拥有资源&#xff0c;一个进程在执行期间会执行一系列的命令。 什么…

华为OD机试真题-模拟数据序列化传输 -2024年OD统一考试(C卷)

题目描述: 模拟一套简化的 序列化只 传输方式,请实现下面的数据编码与解码过程 1、编码前数据格式为 [位置,类型,值],多个数据的时候用逗号分隔,位置仅支持数字,不考虑重复等场景;类型仅支持:Integer/String/Compose(Compose的数据类型表示该存储的数据也需要编码) 2.编码…

【攻防世界】Confusion1

php的标志是大象&#xff0c;Python的标志是蛇 。Python 的 Flask 框架( Flask 使用 Jinja2 作为模板引擎 ) 点进register.php 输入{{3*4}} 输入 {{config}} 也有回显&#xff0c;ssti 判断是否存在ssti注入&#xff1a; 1. {{8*8}} 2. {{config}} 过滤了关键字&#xff0…

二、显示图片、提取边缘特征并保存(C# + OpenCV)

实现功能&#xff1a; 1&#xff0c;打开照片&#xff0c;并显示 2&#xff0c;对选择的照片进行Canny边缘检测 3&#xff0c;保存边缘检测之后的结果 一、布局 打开在视图下打开工具箱 选择一个PictureBox&#xff0c;仨Button 对Button改个名字 仨Button&#xff0c;分别…

Python从0到100(十二):函数的定义及模块

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

AI大模型探索之路-应用篇2:Langchain框架ModelIO模块—数据交互的秘密武器

目录 前言 一、概述​​​​​​​ 二、Model 三、Prompt 五、Output Parsers 总结 前言 随着人工智能技术的不断进步&#xff0c;大模型的应用场景越来越广泛。LangChain框架作为一个创新的解决方案&#xff0c;专为处理大型语言模型的输入输出而设计。其中&#xff0c;…

设计模式(22):解释器模式

解释器 是一种不常用的设计模式用于描述如何构成一个简单的语言解释器&#xff0c;主要用于使用面向对象语言开发的解释器和解释器设计当我们需要开发一种新的语言时&#xff0c;可以考虑使用解释器模式尽量不要使用解释器模式&#xff0c;后期维护会有很大麻烦。在项目中&…

【Redis】持久化

文章目录 一、RDB1.1、RDB的自动备份与手动备份1.1.1、自动备份1.1.2、手动备份 1.2、RDB优点1.3、RDB缺点1.4、RDB快照1.5、RDB优化配置项 二、AOF2.1、AOF工作流程2.2、AOF写回策略2.3、MP-AOF实现2.4、AOF优缺点2.5、AOF重写机制 三、RDBAOF混合持久化3.1、数据恢复顺序和加…

阿里云OSS使用流程

准备工作 无论怎么样&#xff0c;你需要准备一个阿里云账号&#xff0c;点击&#xff1a;注册阿里云 输入相关信息&#xff0c;然后注册成功以后&#xff0c;点击 然后注册成功了&#xff0c;实名一下阿里云账号。打开实名入口&#xff0c;选择个人实名或者企业实名。 如果你…

windows wireshark抓包rtmp推流出现TCP Retransmission

解决办法&#xff1a;tcp.port1935 && !(tcp.analysis.retransmission)

签名失败当前系统没有安装苹果根证书

发生背景 第一次我没有iOS证书(.p12)和描述文件(.mobileprovision)。按照这个文档https://ask.dcloud.net.cn/article/152拿到后&#xff0c;安心打包出问题。 错误信息 [Info] begin getCertCName... [Info] begin codesignFramwork to ipa... [Error] DCUniBase.framework…