JAVA里的object类

news2024/11/17 22:57:51

 public static String toString(Object o)                     // 获取对象的字符串表现形式
public static boolean equals(Object a, Object b)            // 比较两个对象是否相等
public static boolean isNull(Object obj)                    // 判断对象是否为null
public static boolean nonNull(Object obj)                    // 判断对象是否不为null

1.toString(获取对象的字符串表现形式)

默认情况下,因为object类中的toString方法返回的是地址值,所以默认打印地址值
如果我们要打印属性值,就必须重写toString方法
toString方法的结论
如果我们打印一个对象,想要看到属性值,那就必须重写toString方法
在重写的方法中,把对象的属性值进行拼接
public class objectdemo1 {
    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println(s1);//Object.Student@b4c966a
        String s2 = s1.toString();
        System.out.println(s2);//Object.Student@b4c966a

        //默认情况下,因为object类中的toString方法返回的是地址值,所以默认打印地址值
        //如果我们要打印属性值,就必须重写toString方法
        //toString方法的结论
        //如果我们打印一个对象,想要看到属性值,那就必须重写toString方法
        //在重写的方法中,把对象的属性值进行拼接

    }
}

 重写之后


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




public class objectdemo1 {
    public static void main(String[] args) {
        Student s1 = new Student("zhangsan",18);
        System.out.println(s1);//zhangsan,18
        String s2 = s1.toString();
        System.out.println(s2);//zhangsan,18

        //默认情况下,因为object类中的toString方法返回的是地址值,所以默认打印地址值
        //如果我们要打印属性值,就必须重写toString方法
        //toString方法的结论
        //如果我们打印一个对象,想要看到属性值,那就必须重写toString方法
        //在重写的方法中,把对象的属性值进行拼接

    }
}

2.equals(比较两个对象是否相等)

默认比的是地址值,由于我们创建对象肯定创建出不同的对象,在堆区会开辟不同的内存空间,所以地址值肯定不一样,所以我们就要重写父类object里的equals方法

//public static boolean equals(Object a, Object b) 比较两个对象是否相等
public class objectdemo2 {
    public static void main(String[] args) {

        Student s1 = new Student();
        Student s2 = new Student();
        System.out.println(s1.equals(s2));//比的是地址值
        
    }
}

结果

重新父类的equals方法

  @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

如果我们比较属性值:

//public static boolean equals(Object a, Object b) 比较两个对象是否相等
public class objectdemo2 {
    public static void main(String[] args) {

        Student s1 = new Student("张三",18);
        Student s2 = new Student("张三",18);
        System.out.println(s1.equals(s2));//比的是属性值

    }
}

结果

//public static boolean equals(Object a, Object b) 比较两个对象是否相等
public class objectdemo3 {
    public static void main(String[] args) {

        String s1 = "abc";
        StringBuffer sb = new StringBuffer("abc");
        System.out.println(s1.equals(sb));//false
        //因为equals方法是被s1调用的,而s1是字符串
        //所以equals要看String类中的
        //如果是字符串,则比较内部属性值
        //如果参数不是字符串,直接返回false
        System.out.println(sb.equals(s1));//false
        //因为equals方法是被sb调用的,而sb是不是字符串是StringBuffer
        //所以equals要看StringBuffer类中的
        //因为StringBuffer没有重写equals方法,所以默认使用的是父类object类的equals方法
        //所以比较的是地址值
        //而这里s1和sb的地址值不一样,所以返回false
    }
}

结论: 

3.浅克隆和深克隆

在Java中,实现浅克隆通常意味着你需要重写对象的clone()方法。Java中的Object类提供了一个默认的clone()方法,但这个默认实现是受保护的,因此你需要让你的类实现Cloneable接口(尽管这个接口是一个标记接口,没有任何方法),并且重写clone()方法以使其为public

浅克隆 

细节:

public class objectdemo5 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Day day = new Day(2024, 6, 6);
        // 创建一个Animal对象
        Animal a = new Animal("小黑", 2, day);
        // 浅克隆这个Animal对象
        //先是object cloneA=a.clone();
        //然后强转成Animal类型
        // Animal cloneA=(Animal)a.clone();
        Animal cloneA = (Animal) a.clone();
        System.out.println(cloneA);
    }
}

 

package Object;

import java.util.Objects;

// 假设我们有一个简单的类Animal,它包含基本数据类型和另一个对象的引用
public class Animal implements Cloneable{
    private String name;
    private int age;
    private Day day; 假设Day是另一个类,并且我们想要浅克隆它

    public Animal(String name, int age, Day day) {
        this.name = name;
        this.age = age;
        this.day = day;
    }

    public Animal() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Day getDay() {
        return day;
    }

    public void setDay(Day day) {
        this.day = day;
    }

    // 重写clone方法以实现浅克隆


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

    // toString方法(可选,但有助于调试)
    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", day=" + day +
                '}';
    }
}

 

package Object;

public class Day {
    private int year;
    private int month;
    private int day;

    public Day(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public Day() {
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }

    @Override
    public String toString() {
        return "Day{" +
                "year=" + year +
                ", month=" + month +
                ", day=" + day +
                '}';
    }
}

结果:

 clone 方法是浅拷贝,对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存,相对应的深拷贝则会连引用的对象也重新创建。

说白了 浅克隆 是克隆的对象和被克隆的对象共享一块内存,其实一方改变,则另一方也跟着改变

深克隆

深克隆我们可以导入第三方工具类

//用第三方工具
        //编写代码
        Gson gson = new Gson();
        //把对象变成字符串
        String s = gson.toJson(a);//克隆Animal a类
        //再把字符串变成对象即可
        Animal animal = gson.fromJson(s, Animal.class);
        //试一下是不是深克隆 animal没有变即深克隆
        day.setYear(2023);
        //打印对象
        System.out.println(animal);//拷贝之后的结果

结果

说白了 深克隆 是克隆的对象和被克隆的对象不是一块内存,其实一方改变,则另一方也不会跟着改变,克隆出来的本质是拷贝了一个副本,操作的是自己属于的那块内存

 Objects

 public static void main(String[] args) {
        Student s1 = null;
        Student s2 = new Student("zhangsan", 18);
        //判断对象是否为null
        boolean result = Objects.equals(s1, s2);
        System.out.println(result);//false
        //细节:
        //1.方法的底层会判断s1是否为null,如果为null,直接返回false
        //2.如果s1不为null,那就利用s1再次调用equals方法
        //3.此时s1是Student类型,所以最终还是会调用Student类型中的equals方法
        //如果没有重写,比较的是地址值,如果重写了,比较的就是属性值了

结果:

public static boolean isNull(Object obj)                    // 判断对象是否为null
public static boolean nonNull(Object obj)                    // 判断对象是否不为null 

  Student s3 = new Student("zhangsan", 18);
        Student s4 = null;
        System.out.println(Objects.isNull(s3)); 判断对象是否为null,为null返回true
        System.out.println(Objects.isNull(s4));

结果:

  // public static boolean nonNull(Object obj)// 判断对象是否不为null
  Student s5 = new Student("zhangsan", 18);
 Student s6 = null;
 System.out.println(Objects.nonNull(s5));//判断对象是否为不null,如果不为null返回true
 System.out.println(Objects.nonNull(s6));

结果 

 

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

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

相关文章

数据库断言-数据库连接池

原因:现在的代码是单线程,如果遇到大并发的话就会崩溃,数据库查询就查不过来 措施:需要建立数据库连接池,可以设置连接池的数量 什么是大并发:很多客户端在idea写的程序和数据库建立连接 步骤&#xff1…

Python处理异常用操作介绍

Python中的异常处理主要用于捕获和处理程序运行过程中出现的错误。 在编写Python程序时,我们经常会遇到各种错误,如语法错误、运行时错误等。为了确保程序的稳定性和健壮性,我们需要对可能出现的错误进行捕获和处理。本文将介绍Python中常用的…

css美化滚动条样式

效果展示 实现 滚动条宽,高度 /* 整体滚动条 */ ::-webkit-scrollbar {width: 10px; }/* 滚动条轨道 */ ::-webkit-scrollbar-track {background-color: #ffffff;border-radius: 6px; }/* 滚动条滑块 */ ::-webkit-scrollbar-thumb {background-color: #888;borde…

伺服阀放大器配套稳压电源

稳压电源是为伺服阀放大器配套的电源。该稳压电源在开关电源基础上采用了多项先进技术进行设计,输出直流电压稳压精度高、纹波系数小、可靠性好。稳压电源也适用于其他各种伺服控制系统的配套电源。输入(180~240VAC 50Hz),输出&am…

SAP ABAP 常用实用函数

文章目录 前言一、日期 时间 相关 a.两个日期之间相隔多少月 二、数据 操作 转化 加密 a.增加 去除 前导零 b.将 数值类型 负号 提前 c.数据加密 MD5 加密 三、获取 属性 定义 读取 数据 a.获取函数的 出参 入参 定义 …

Linux|如何查找和删除重复文件

引言 整理您的个人文件夹甚至整个操作系统可能会相当棘手,特别是当您习惯于使用下载管理器从网上下载各种资料时。 在很多情况下,您可能会发现自己不小心下载了重复的mp3、pdf和epub文件(以及其他类型的文件),并将它们…

HTML5+CSS3+JS小实例:图片九宫格

实例:图片九宫格 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1…

智慧城市新利器:免费可视化工具助力高效管理

在智慧城市的建设中&#xff0c;实现高效的统筹管理是至关重要的。通过免费可视化工具“山海鲸可视化”&#xff0c;这一目标可以轻松达成。山海鲸可视化是一款免费可视化工具&#xff0c;具备二三维融合、易用性、安全性以及高质量画面渲染等特色&#xff0c;是制作智慧城市可…

通义听悟--一个懂你的AI助理

通义听悟--一个懂你的AI助理 通义听悟音频转文字本地音视频转文字云盘音视频转文字 实时记录通义听悟进阶体验感受功能建议产品联动 通义听悟 在体验通义听悟之前&#xff0c;我们首先得知道什么是通义听悟&#xff1f;有什么应用场景&#xff1f; 通义听悟简单来说就是你的工…

Java短剧系统

探索影视新体验 &#x1f4f1;一、引言&#xff1a;短剧时代的来临 在数字化的今天&#xff0c;我们见证了许多内容消费模式的转变。从长篇大论的电视剧到短小精悍的短视频&#xff0c;再到如今备受瞩目的短剧&#xff0c;观众对于影视内容的需求越来越多元化。而短剧系统微信…

Es结合springboot(笔记回忆)

导包 <!--导入es--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency><groupId>org.springframework.boot<…

前端vue项目升级nodejs后无法运行了

问题描述&#xff1a; 运行、打包都正常的vue项目&#xff0c;在将nodejs升级到v20.14.0后&#xff0c;均报错了&#xff1a; Error: error:0308010C:digital envelope routines::unsupported opensslErrorStack: [ error:03000086:digital envelope routines::initializ…

Centos下rpm和yum执行卡住问题(已解决)

问题描述 执行rpm和yum卡住&#xff0c; 没有任何报错信息&#xff0c;且无法 ctrl c 终止&#xff0c;只能通过后台 kill -9 杀死。 问题排查&#xff1a; 查看yum日志&#xff1a;yum -vv 软件包 会发现卡在 loading keyring from rpmdb&#xff0c;即load DB存在问题。 …

Java - 程序员面试笔记记录 实现 - Part2

2.1 输入输出流 流可以被看作一组有序的字节集合&#xff0c;即数据在两个设备间的传输。 字节流&#xff1a;以字节作为单位&#xff0c;读到一个字节就返回一个字节&#xff1b;InputStream & OutputStream。 字符流&#xff1a;使用字节流读到一个到多个字节先查询码…

【技巧】ArcGIS Pro设置自动保存数据编辑内容

一、工程文件自动保存 ArcGIS Pro软件的工程也可以自动保存备份。默认备份时间是5分钟&#xff0c;您可以在【工程】→【选项】→【常规】→【工程恢复】中调整自动备份时间。 二、数据编辑自动保存 操作方法&#xff1a;【工程】→【选项】→【编辑】→【会话】&#xff0c;勾…

安卓app开发-基础-本地环境安装android studio且配置参数

安卓app开发-基础-本地环境安装android studio且配置参数&#xff01;今天为大家介绍一下&#xff0c;如何在自己本地电脑安装android ,studio和启动一个简单的java版本的项目。 第一步&#xff0c;去下面的地址&#xff0c;下载一个安装文件。 地址&#xff1a;AndroidDevToo…

Stable Diffusion 商业变现与绘画大模型多场景实战

前言 ai绘画软件Stable Diffusion是一种通过模拟扩散过程&#xff0c;将噪声图像转化为目标图像的文生图模型&#xff0c;具有较强的稳定性和可控性&#xff0c;可以将文本信息自动转换成高质量、高分辨率且视觉效果良好、多样化的图像。在日常工作中&#xff0c;ai绘画软件St…

(3)Java 8 实战第二版——使用流和Lambda进行高效编程

集合工厂 List<String> friends Arrays.asList("Raphael", "Olivia"); friends.set(0, "Richard"); friends.add("Thibaut"); ←---- 抛出一个UnsupportedModificationException异常通过工厂方法创建的Collection的底层…

加载数据到mysql并解决原始数据乱码问题

查看linux上数据&#xff1a; 使用命令转换编码&#xff1a; iconv -f GBK -t UTF-8 toutiao.csv -o toutiao2.csv加载数据到mysql: load data local infile /root/toutiao2.csv INTO TABLE pdz FIELDS TERMINATED BY , LINES TERMINATED BY \r\n;

中霖教育怎么样?税务师通过率高吗?

中霖教育怎么样?税务师通过率高吗? 我们在税务师考试培训方面有着不错的成绩&#xff0c;这都是老师与学员共同努力的结果。 采用小班教学模式&#xff0c;确保每位学员都能得到足够的关注和指导&#xff0c;在学习过程中针对学员的薄弱环节进行专项突破。 因为大部分学员…