首页 > 编程语言 >【Java基础语法】内置接口

【Java基础语法】内置接口

时间:2024-07-23 19:30:04浏览次数:19  
标签:clone 内置 Java int age 接口 Person Student public

前言:

小编紧接着上期抽象类与接口进行了拓展,介绍了一些Java内置有用的接口,希望能够对大家有所帮助。上期博客http://t.csdnimg.cn/0MoDe

1. Comparable 接口

1.1Comparable 接口

在如下代码中:

 public static void main(String[] args) {
        Student[] student=new Student[]{
                new Student("zhangsan",12),
                new Student("lisi",11),
                new Student("wangwu",13),
        };
       
        System.out.println(Arrays.toString(student));
    }
}
class Student {
    public String name;
    public int age;
    public Student(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String toString(){
        return "["+this.name+":"+this.age+"]";
    }
  
}

 我们能进行打印,但是如果我们想进行按年龄进行排序直接进行

Arrays.sort(student);

我们能进行排序吗,显然是不可以的,应为student数组包含了string类。

此时我们就要用到 Comparable接口,让我们的 Student 类实现 Comparable 接口, 并实现其中的 compareTo 方法

代码实例:

class Student2 implements Comparable{
    public String name;
    public int age;
    public Student2(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String toString(){
        return "["+this.name+":"+this.age+"]";
    }
    @Override
    public int compareTo(Object o) {
        Student student=(Student) o;
        return this.age-student.age;
    }
}

实现comparable后要进行重写compareTo方法

在 sort 方法中会自动调用 compareTo 方法. compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象.然后比较当前对象和参数对象的大小关系。

1.2.comparator接口

在上述代码中存在一个问题,就是无法通过名字进行比较,那么此时我们就要用到comparator接口

代码如下:

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

理解:设置一个年龄比较类去实现comparaor接口规定为学生类进行比较,重写compare方法,传入比较的学生对象,如果按年龄比较(对象.age),若前者更大,即返回负值。

当然我们也可以规定名字比较

代码如下:

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

原理:和上述年龄比较几乎一样,但是在用对像调用时,名字为string类不能够相减,此时string引用类型的compareto方法进行比较。

因为string实现了comparable接口,重写了compareto方法。

内置原码:

1.3总结

两种写法都叫做比较器,但是后者更加灵活,可以根据所需进行编写,而且两者可以共同存在。

2.Clonable 接口和深拷贝

2.1clone的语法

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

例如以下代码

public class test1 {
    public static void main(String[] args) {
        Person person1=new Person(10);
        Person person2=person1.clone();   //代码报错
    }
}
class Person{
    public int age;
    public Person(int age){
        this.age=age;
    }


    @Override
    public String toString() {
        return "Preson="+this.age;
    }
}

代码在clone关键词下面报错

当我们点开object类的clone方法时可以发现clone方法是protect方法 

此时我们要在子类重写

class Person{
    public int age;
    public Person(int age){
        this.age=age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Preson="+this.age;
    }

 此时克隆的就是person类
Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 "拷贝". 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常.

那么我们就要实现接口;

class Person implements Cloneable

 并且处理异常

但是此时又再次报错,此时就要注意,object是父类,要完成向下转型,那么我们就要强转

Person person2= (Person) person1.clone();

此时我们就不会报错了。

总体代码如下:

public class test1 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1=new Person(10);
        Person person2= (Person) person1.clone();
        System.out.println(person2);
        System.out.println(person1);
    }
}
class Person implements Cloneable{
    public int age;
    public Person(int age){
        this.age=age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Preson="+this.age;
    }
}

2.2总结处理

处理的异常:

1.object类的clone是protect方法,要实现子类重写

2.解决抛出异常问题

3.实现clone是父类方法,父类给子类要实现向下转型见http://t.csdnimg.cn/kIt7l

4.实现接口cloneable

2.3 浅拷贝

当我们重新设置一个类定义一个变量,并进行引用时,在person2实现更改值,但是输出时person1也会改变,这叫浅拷贝

代码如下:

 public static void main(String[] args) throws CloneNotSupportedException {
        Person person1=new Person(10);
        Person person2= (Person) person1.clone();
        System.out.println(person2.m.money);
        System.out.println(person1.m.money);
        System.out.println("---------------");
        person2.m.money=99.9;
        System.out.println(person2.m.money);
        System.out.println(person1.m.money);


    }
}
class Money{
    public double money=19.9;
}
class Person implements Cloneable{
    public int age;
    public Money m;
    public Person(int age){
        this.age=age;
        this.m=new Money();
    }

我们希望person2输出99.9,person1输出19.9;

但是两者都是99.9;

原因:在实现克隆时,并没有将对象里面的对象进行拷贝

如图:

所以两个还是调用同一个对象里面对象的地址。

2.4深拷贝 

在上述中,我们就要拷贝一个内部对象

所以代码如下:

class Money implements Cloneable{
    public double money=19.9;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

那么此时就要接收克隆出来的地址

protected Object clone() throws CloneNotSupportedException {
        Person temp=(Person) super.clone();

然后克隆内部的对象存在temp里,就有了内部对象的克隆

 protected Object clone() throws CloneNotSupportedException {
        Person temp=(Person) super.clone();
        temp.m=(Money) this.m.clone();
        return temp;
    }

this时person1调用所以就是person1的内部对象进行克隆,最后将temp传给person2实现深拷贝。

2.5结果展示

 3.总结

限于小编能力有限,讲解过程难免有误,希望各位uu提出宝贵意见。

标签:clone,内置,Java,int,age,接口,Person,Student,public
From: https://blog.csdn.net/GGBond778/article/details/140638478

相关文章

  • 使用JavaScript做一个轮播图
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>图片轮播</titl......
  • java中assert用法
    java中assert用法一、java为什么源码框架都用assert调试1、一般是做单元测试的时候用(比如Junit),其它的地方也可以使用,但是基本上没人用,因为在其它的地方判断语句比断言好用。2、如果表达式计算为false,那么系统会报告一个Assertionerror。3、由于assert是一个新关键字,使用老......
  • Java 集合框架:HashMap 的介绍、使用、原理与源码解析
    大家好,我是栗筝i,这篇文章是我的“栗筝i的Java技术栈”专栏的第020篇文章,在“栗筝i的Java技术栈”这个专栏中我会持续为大家更新Java技术相关全套技术栈内容。专栏的主要目标是已经有一定Java开发经验,并希望进一步完善自己对整个Java技术体系来充实自己的......
  • 从零开始学Java(超详细韩顺平老师笔记梳理)08——面向对象编程中级(上)IDEA常用快捷键、包
    文章目录前言一、IDEA使用常用快捷键模板/自定义模板二、包package1.基本介绍2.包的命名规范3.常用的包和如何引入4.注意事项和细节三、访问修饰符(四类)四、封装Encapsulation(重点)1.封装介绍2.封装步骤3.快速入门4.封装与构造器五、继承(重点)1.为什么需要继承2......
  • java毕业设计-基于微信小程序的蛋糕订购商城系统设计与实现,基于springboot+vue+微信小
    文章目录前言演示视频项目背景项目架构和内容获取(文末获取)具体实现截图用户微信小程序端管理后台技术栈具体功能模块设计系统需求分析可行性分析系统测试为什么我?关于我我自己的网站项目相关文件前言博主介绍:✌️码农一枚,专注于大学生项目实战开发、讲解和毕业......
  • flask写接口,定制日志输出以及将请求状态以及自定义日志写入文件中
    前言:无论是写接口还是写项目,配置日志是必选的;适合配置可以帮助自己排查代码逻辑问题简单说一说日志的等级以及用处1.日志等级DEBUG:10INFO:20WARN:30ERROR。40CRITICAL:50数字越大,等级越高!!2.日志用处:        DEBUG(调试):用于开发阶段的调试,开启后,会记录程序......
  • 使用poi操作excel报这个错 java.lang.NoSuchMethodError: org.apache.logging.log4j.L
    使用poi操作excel报这个错java.lang.NoSuchMethodError:org.apache.logging.log4j.Logger.atTrace()Lorg/apache/logging/log4j/经查发现poi、poi-ooxml引用了log4j-api,版本较低,没有atTrace()方法 解决办法:移除poi、poi-ooxml引用的log4j-api,重新引用高版本的依赖 ......
  • 【java计算机毕设】在线教学平台MySQL springboot vue HTML maven小组设计项目源代码+
    目录1项目功能2项目介绍3项目地址1项目功能【java计算机毕设】在线教学平台MySQLspringbootvueHTMLmaven小组设计项目源代码+文档寒暑假作业 2项目介绍系统功能:在线教学平台包括管理员、用户、教师三种角色。管理员功能包括个人中心模块用于修改个人信息......
  • 你离java岗面试成功只差这一份面试题!拿下吧让你少走99%弯路
     马上金九银十很多同学/朋友都在忙着找工作,小五给大家整理了一份非常全面的Java面试题含答案总结!从java面试新手到java面试专家,你只差这一份面试题!还不赶紧来拿下~八股文内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring......
  • Java面试八股之详细阐述Spring的DI和IOC
    详细阐述Spring的DI和IOCSpring框架的两大核心特性之一就是控制反转(InversionofControl,IoC),另一个密切相关的是依赖注入(DependencyInjection,DI)。这两个概念是Spring实现松耦合、可测试和可管理软件组件的关键机制。控制反转(InversionofControl,IoC)概念:IoC是一种设......