Java-抽象类和接口(下)

news2024/10/7 18:32:09

接口使用实例
给对象数组排序
两个学生对象的大小关系怎么确定? 需要我们额外指定.
这里需要用到Comparable 接口
在这里插入图片描述
在Comparable 接口内部有一个compareTo 的方法,我们需要实现它
在这里插入图片描述
在下图中,我们需要将o强制转换为Student
在这里插入图片描述
之后调用Arrays.sort(array)即可完成排序,如下
在这里插入图片描述
代码:

package demo5;

import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Home-pc
 * Date: 2023-08-16
 * Time: 16:40
 */
class Student implements Comparable{
    public String name;
    public double score;
    public Student(String name,double score){
        this.name=name;
        this.score=score;
    }

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


    public int compareTo(Object o) {
        Student student=(Student)o;
        if(this.score>student.score){
            return 1;
        }else if(this.score<student.score){
            return -1;
        }
        return 0;
    }
}
public class Test {
    public static void main(String[] args) {
        Student[] array=new Student[3];
        array[0]=new Student("zhangsan",80);
        array[1]=new Student("qwer",7);
        array[2]=new Student("asdfg",806);
        System.out.println("前"+ Arrays.toString(array));
        Arrays.sort(array);
        System.out.println("后"+ Arrays.toString(array));
    }
}


为了进一步加深对接口的理解, 我们可以尝试自己实现一个 sort 方法来完成刚才的排序过程(使用冒泡排序)
在这里插入图片描述
结果也是正确的
在这里插入图片描述


扩展上面的内容,我们想分别按照年龄和分数排序
需要用到Comparator接口
在这里插入图片描述
建立两个不同的类来实现这两种方法,都要实现Comparator接口
在这里插入图片描述
结果如下
在这里插入图片描述
上述代码如下:

package demo5;

import java.util.Arrays;
import java.util.Comparator;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Home-pc
 * Date: 2023-08-16
 * Time: 16:40
 */
class Student{
    public String name;
    public double score;
    public int age;
    public Student(String name,double score,int age){
        this.name=name;
        this.score=score;
        this.age=age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", score='" + score + '\'' +
                '}';
    }
}
class AgeComparator implements Comparator<Student>{

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

    @Override
    public int compare(Student o1, Student o2) {
        return (int)(o1.score-o2.score);
    }
}
public class Test {

    public static void main(String[] args) {
        Student[] array=new Student[3];
        array[0]=new Student("zhangsan",80,89);
        array[1]=new Student("qwer",7,123);
        AgeComparator ageComparator=new AgeComparator();
        System.out.println(ageComparator.compare(array[0], array[1]));
        System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
        ScoreComparator scoreComparator=new ScoreComparator();
        System.out.println(scoreComparator.compare(array[0], array[1]));
    }
}


抽象类和接口的区别
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中
不能包含普通方法, 子类必须重写所有的抽象方法.
抽象类存在的意义是为了让编译器更好的校验, 像 Animal 这样的类我们并不会直接使用, 而是使用它的子类.
万一不小心创建了 Animal 的实例, 编译器会及时提醒我们.
在这里插入图片描述


Clonable 接口和深浅拷贝
Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”. 但是要想合法调用 clone 方法, 必须要
先实现 Clonable 接口
如下所示,我们需要Student实现这个接口,需要对clone方法重写
在这里插入图片描述
但是我们运行后发现还是报错
我们发现这里,点击添加Add
在这里插入图片描述
运行发现继续报错,观察到红线这里,需要的类型为Student,我们提供的类型为Object,需要强制类型转换
在这里插入图片描述
运行,拷贝成功
在这里插入图片描述
上述为浅拷贝


在这里插入图片描述
在这里插入图片描述
结果并不理想,它把两个对象里的grade都改了,这种情况下没有构成深拷贝,拷贝的是grade的地址,它只是对Student对象中的内容进行了一份拷贝,但是并没有对,对象中的对象中的内容进行拷贝。
如何进行深拷贝?
我们改动以下部分
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


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

使用Object接收所有类的对象
在这里插入图片描述


Object类是参数的最高统一类型。但是Object类也存在有定义好的一些方法
我们主要来熟悉这几个方法:toString()方法,equals()方法,hashcode()方法


Object类中的toString()方法实现,可以直接用编译器生成重写
在这里插入图片描述


对象比较equals方法
在Java中, = = == ==进行比较时:
a.如果 = = == ==左右两侧是基本类型变量,比较的是变量中值是否相同
b.如果 = = == ==左右两侧是引用类型变量,比较的是引用变量地址是否相同
c.如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的
在这里插入图片描述
结论:比较对象中内容是否相同的时候,一定要重写equals方法


hashcode方法
算出一个具体的对象位置
我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看示例
代码:
在这里插入图片描述
像重写equals方法一样,我们也可以重写hashcode()方法。
在这里插入图片描述
在这里插入图片描述


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

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

相关文章

电商项目part04 微服务拆分

微服务架构拆分 微服务介绍 英文:https://martinfowler.com/articles/microservices.html 中文:http://blog.cuicc.com/blog/2015/07/22/microservices 微服务拆分时机 如下场景是否需要进行微服务拆分&#xff1f; 代码维护困难&#xff0c;几百人同时开发一个模块&…

01 背包算法

描述 王强决定把年终奖用于购物&#xff0c;他把想买的物品分为两类&#xff1a;主件与附件&#xff0c;附件是从属于某个主件的&#xff0c;下表就是一些主件与附件的例子&#xff1a; 主件附件电脑打印机&#xff0c;扫描仪书柜图书书桌台灯&#xff0c;文具工作椅无 如果…

漏洞指北-VulFocus靶场专栏-中级02

漏洞指北-VulFocus靶场专栏-中级02 中级005 &#x1f338;thinkphp lang 命令执行&#xff08;thinkphp:6.0.12&#xff09;&#x1f338;step1&#xff1a;burp suite 抓包 修改请求头step2 修改成功&#xff0c;访问shell.php 中级006 &#x1f338;Metabase geojson任意文件…

Linux内核源码分析-内存管理

Linux内核内存布局 64位Linux系统一般使用48位表示虚拟地址空间&#xff0c;45位表示物理地址。通过命令&#xff1a;cat /proc/cpuinfo。查看Linux内核位数和proc文件系统输出系统软硬件信息如下&#xff1a; x86_64架构体系内核分布情况 通过 cat /proc/meminfo 输出系统架…

ruoyi-vue-pro yudao 项目报表设计器 积木报表模块启用及相关SQL脚本

目前ruoyi-vue-pro 项目虽然开源&#xff0c;但是report模块被屏蔽了&#xff0c;查看文档却要收费 199元&#xff08;知识星球&#xff09;&#xff0c;价格有点太高了吧。 分享下如何启用 report 模块&#xff0c;顺便贴上sql相关脚本。 一、启用模块 修改根目录 pom.xml …

Laravel 框架模型的定义 模型的增删改 批量赋值和软删除 ⑧

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

docker 安装 Wordpress 用lnmp搭建出现的故障

第一个故障就是mysql出现的故障了 你起mysql镜像是这么起的导致pid号用不了 docker run --namemysql -d --privileged --device-write-bps /dev/sda:10M -v /usr/local/mysql --net mynetwork --ip 172.20.0.20 mysql:lnmp 解决方法 docker run --namemysql -d --privilege…

【ARM-Linux】项目,语音刷抖音项目

文章目录 所需器材装备操作SU-03T语音模块配置代码&#xff08;没有用wiring库&#xff0c;自己实现串口通信&#xff09;结束 所需器材 可以百度了解以下器材 orangepi-zero2全志开发板 su-03T语音识别模块 USB-TTL模块 一个安卓手机 一根可以传输的数据线 装备操作 安…

【Python数据挖掘】应用toad包中的KS_bucket函数统计好坏样本率、KS值

大数据时代的到来&#xff0c;使得很多工作都需要进行数据挖掘&#xff0c;从而发现更多有利的规律&#xff0c;或规避风险&#xff0c;或发现商业价值。比如在支付领域&#xff0c;通过挖掘商户的交易数据&#xff0c;分析商户是否有欺诈、盗刷、赌博、套现等风险。对于有风险…

孤注一掷——基于文心Ernie-3.0大模型的影评情感分析

孤注一掷——基于文心Ernie-3.0大模型的影评情感分析 文章目录 孤注一掷——基于文心Ernie-3.0大模型的影评情感分析写在前面一、数据直观可视化1.1 各评价所占人数1.2 词云可视化 二、数据处理2.1 清洗数据2.2 划分数据集2.3 加载数据2.4 展示数据 三、RNIE 3.0文心大模型3.1 …

自己实现 SpringMVC 底层机制 系列之--实现任务阶段 3- 从 web.xml动态获取 wyxspringmvc.xml

&#x1f600;前言 自己实现 SpringMVC 底层机制 系列之–实现任务阶段 3- 从 web.xml动态获取 wyxspringmvc.xml &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff…

如何根据蛋白质序列找到蛋白质ID

多数数据集中有蛋白质序列但不存储蛋白质ID&#xff0c;这使得PDB文件获取困难&#xff0c;如何找到蛋白质序列对应的ID&#xff0c;参考以下&#xff08;还没有找到批处理方法&#xff0c;如果有知道的小伙伴评论区留言&#xff09;&#xff1a; 1. 进入官方网站&#xff1a;…

java 用协程 实现 简单下订单功能

java 用协程有几种方式&#xff0c;本文是是基于kotlin的协程库实现。 kotlin 协程原理 Kotlin 的协程&#xff08;Coroutines&#xff09;是一种在 Kotlin 语言中实现异步编程的轻量级工具。它可以实现更简洁和可读性更高的异步代码&#xff0c;并且不需要显式地使用回调函数…

0基础入门C++之类和对象中篇

目录 1.类的6个默认成员函数2.构造函数2.1概念2.2特性 3.析构函数3.1概念3.2特性 4.拷贝构造函数4.1概念4.2 特性 5.赋值运算符重载5.1运算符重载5.2赋值重载5.3赋值运算符重载特性 6.const成员7.取地址及const取地址操作符重载 1.类的6个默认成员函数 通过类和对象上篇的学习&…

操作系统——操作系统内存管理基础

文章目录 1.内存管理介绍2.常见的几种内存管理机制3.快表和多级页表快表多级页表总结 4.分页机制和分段机制的共同点和区别5.逻辑(虚拟)地址和物理地址6.CPU 寻址了解吗?为什么需要虚拟地址空间? 1.内存管理介绍 操作系统的内存管理主要是做什么&#xff1f; 操作系统的内存…

solidwords(6)

从右视图开始&#xff0c;分上下两部分 标题 这里的薄壁要留意一下怎么算的&#xff08;单向&#xff1a;默认向内&#xff1b;如果想向外记得选反向&#xff09;

Vue2+Vue3笔记(尚硅谷张天禹老师)day01

只是记录&#xff0c;初心是为了让页面更好看,会有错误 环境准备 下载vue:Vue下载 下面两个是可选的,主要是我想让控制台干净点 vue_dev_tool安装 vue_dev_tool安装 : Vue 控制台出现You are running Vue in development mode. Make sure to turn on production mode when dep…

unity之Input.GetKeyDown与Input.GetKey区别

文章目录 Input.GetKeyDown与Input.GetKey区别 Input.GetKeyDown与Input.GetKey区别 Input.GetKey 和 Input.GetKeyDown 是 Unity 中用于检测按键状态的两个不同函数。它们之间的区别在于何时触发。 Input.GetKey(KeyCode key): 这个函数会在用户按住指定的键时触发&#xff0…

CountDownLatch和CyclicBarrie

前置提要 什么是闭锁对象 闭锁对象&#xff08;Latch Object&#xff09;是一种同步工具&#xff0c;用于控制线程的等待和执行顺序。闭锁对象可以让一个或多个线程等待&#xff0c;直到特定的条件满足后才能继续执行。 在Java中&#xff0c;CountDownLatch就是一种常见的闭锁对…

【AI大模型】训练Al大模型

大模型超越AI 前言 洁洁的个人主页 我就问你有没有发挥&#xff01; 知行合一&#xff0c;志存高远。 目前所指的大模型&#xff0c;是“大规模深度学习模型”的简称&#xff0c;指具有大量参数和复杂结构的机器学习模型&#xff0c;可以处理大规模的数据和复杂的问题&#x…