Java进阶学习笔记24——Object类

news2024/11/13 9:43:11

Object类:

Object类是Java中所有类的祖宗类,因此,Java中所有类的对象都可以直接使用Object类中提供的一些方法。

所有类都是Object类的子孙类。

API文档:

 Object类的成员方法:

Object类的常见方法:

 

Student类:

package cn.ensource.d13_object;

import java.util.Objects;

public class Student {     // 默认继承Object类
    private String name;
    private int age;

    public Student() {
    }

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

    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;
    }

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

    // 重写equals方法,比较两个对象的内容一样,就返回true
    @Override
    public boolean equals(Object obj) {
        // 1. 两个对象的地址一样,直接返回true
        if(this == obj) return true;
        // 2. 判断Obj是null,直接返回false
        // 比较者类型跟被比较者类型不一样,例如:Student.class != Pig.class
        if(obj == null || getClass() != obj.getClass()) return false;
        // 3. obj不是null,obj一定是学生类型的对象,开始比较内容了
        // 强制类型转换到Student
        Student student = (Student) obj;
        return Objects.equals(this.name, student.name) && this.age == student.age;
    }
}

测试类:

package cn.ensource.d13_object;

public class Test {
    public static void main(String[] args) {
        // 目标:掌握Object类的常用方法

        Student s1 = new Student("赵敏", 23);
        System.out.println(s1);

        Student s2 = new Student("赵敏", 23);
        System.out.println(s2.equals(s1));   // 默认比较两个对象的地址,String类是帮我们重写了equals方法
        System.out.println(s1 == s2);        // 默认比较两个对象的地址
        
    }
}

clone方法:对象克隆:

当某个对象调用这个方法的时候,这个方法会复制一个一模一样的新对象返回。

这个新对象:里面的内容一样的,但是地址不一样。

package cn.ensource.d13_object;

// Cloneable标志接口,理解是一种规则。
public class User implements Cloneable {
    private int id;
    private String username;
    private String password;
    private double[] scores;

    public User() {
    }

    public User(int id, String username, String password, double[] scores) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.scores = scores;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public double[] getScores() {
        return scores;
    }

    public void setScores(double[] scores) {
        this.scores = scores;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        // super 去调用父类Object中的clone方法
        return super.clone();
    }
}

package cn.ensource.d13_object;

public class Test2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 目标;掌握Object类的对象克隆方法
        // 1. protected Object clone(): 对象克隆

        User user1 = new User(1, "chang", "123456", new double[]{99.0, 99.5});
        System.out.println(user1.getId());
        System.out.println(user1.getUsername());
        System.out.println(user1.getPassword());
        System.out.println(user1.getScores());

        System.out.println("-----------");

        User user2 = (User) user1.clone();
        System.out.println(user2.getId());
        System.out.println(user2.getUsername());
        System.out.println(user2.getPassword());
        System.out.println(user2.getScores());

    }
}

protected只能在这个lang包下,访问这个clone方法。或者是在Object的子类中才能调用这个方法。

protected 是指可以在子类中访问,而不是在子类对象中访问。

User是Object的不同包的子类,可以在User类中访问clone,但是不能在Test类中访问。

protected修饰的只能在本类,同一包下,继承它的子类中使用,只能在User这个类中使用clone,在new出来的对象中确实使用不了,如果一定要使用,重写或者在方法中使用。

protected只能自己的儿子用,不让让儿子的朋友以儿子的名义用。

实现对象克隆方法:

1)方法重写clone();

2)实现Cloneable接口;

3)main函数throw 异常处理;

输出结果:

1
chang
123456
[D@3b07d329
-----------
1
chang
123456
[D@3b07d329

getscores()函数返回的是数组的地址,克隆的对象中的地址是一样的,都是指向堆内存中的数组对象,所以地址相同。

浅克隆:

拷出来的新对象,与原来对象中的数据是一模一样的(引用类型拷贝的只是地址。

深克隆:

对象中基本类型的数据直接拷贝。

对象中的字符串数据拷贝的还是地址。String是放在堆内存的常量池中。

对象中还包含的其他对象,不会拷贝地址,会创建新对象。

深克隆的实现:

对数组对象进行克隆。

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

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

相关文章

python冰雹序列的探索与编程实现

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、冰雹序列的奥秘 二、编程实现冰雹序列 三、测试与验证 四、总结与展望 一、冰雹序列的…

pycharm配置python开发环境—miniconda+black+gitlab

下载miniconda管理python开发环境 miniconda下载地址:https://docs.anaconda.com/free/miniconda/ miniconda最新版本的python版本是python3.12.2,下载这个miniconda最新版本后,会导致执行conda create -n py31013 python3.10.13指令配置py…

基于STM32实现智能水族箱控制系统

目录 引言环境准备智能水族箱控制系统基础代码示例:实现智能水族箱控制系统 水温传感器数据读取水泵与加热器控制水位传感器数据读取用户界面与显示应用场景:水族箱管理与环境控制问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌…

力扣刷题---2283. 判断一个数的数字计数是否等于数位的值【简单】

题目描述 给你一个下标从 0 开始长度为 n 的字符串 num &#xff0c;它只包含数字。 如果对于 每个 0 < i < n 的下标 i &#xff0c;都满足数位 i 在 num 中出现了 num[i]次&#xff0c;那么请你返回 true &#xff0c;否则返回 false 。 示例 1&#xff1a; 输入&a…

C++面向对象程序设计 - 输入和输出

程序的输入指的是文件将数据传送给程序&#xff0c;程序的输出指的是从程序将数据传送输出文件。 C的输入和和输出包括以下三个方面&#xff1a; 对系统指定的标准设备的输入和输出&#xff0c;即从键盘输入数据&#xff0c;输出到显示器屏幕。以外存磁盘&#xff08;或光盘、…

消费者相关高效读写ZK作用

消费者分区分配策略 目录概述需求&#xff1a; 设计思路1.消费者分区分配策略2. 消费者offset的存储3. kafka消费者组案例4. kafka高效读写&Zk作用5. Ranger分区再分析 实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show …

学习存储协议的利器,聊聊tcpdump和Wireshark

数据存储技术分为多个方面,包括数据持久化、数据映射、数据压缩和通信协议等等。其中通信协议是数据存储技术中非常重要的一部分,正是通信协议使得计算节点可以访问存储设备。同时,也正是不同的协议让存储系统呈现不同的形态。 如下图所示,通过iSCSI协议,可以将存储端的存…

解决Vue3+TS+vite,VSCode 高亮语法错误

一般像这种提示&#xff0c;有可能就是TypeScript语法的识别问题&#xff0c; 一般我们重装一下Vue - Official插件 或者将tcconfig.json中的moduleResolution改为node模式&#xff0c; 基本都是TypeScript无法识别vue文件中的TypeScript语句导致的

22款奔驰GLE450升级原厂AMG阀门运动排气声浪

提升车辆外观&#xff1a;空气悬挂系统可以调节车辆的高度&#xff0c;使车身更接近地面或提高离地间隙&#xff0c;从而改变车辆外观&#xff0c;增加个性化和独特性。 改善驾驶舒适性&#xff1a;空气悬挂系统具有更好的减震效果&#xff0c;可以提供更舒适的驾驶体验&#…

Ant design vue的表格双击编辑功能(即双击开始编辑并自动获得焦点,失去焦点时完成编辑)

本文基于Ant Design Vue官方网站的表格&#xff08;可编辑单元格&#xff09;&#xff08;表格 Table - Ant Design Vue (antdv.com))中的样板代码获得双击编辑且获得焦点、失去焦点时完成编辑的功能。 要点&#xff1a; &#xff08;1&#xff09;双击时候实现编辑&#xff…

docker同步bilibili收藏视频到群晖,可配合emby

作者是amtoaer&#xff0c;在github项目地址&#xff1a;https://github.com/amtoaer/bili-sync 有两个版本&#xff0c;1.0和2.0&#xff0c;我使用的是2.0 PS2&#xff1a;2.0和1.0版本目录结构不兼容&#xff0c;所以部署后会全量重新下载视频。 演示&#xff1a; 依然是…

解析售后维修服务平台如何助力企业高效运营与决策

随着生活质量的不断提高&#xff0c;人们对于售后服务的要求也越来越多。因此&#xff0c;售后服务已经成为企业竞争力的重要组成部分。售后服务平台作为连接企业与消费者的桥梁&#xff0c;不仅关乎着消费者的满意度&#xff0c;而且直接影响着企业的品牌形象与市场地位。那么…

用实践结果告诉你为啥说 CloudFlare 是赛博菩萨?

最近几天明月都没有更新博客了,主要是接了几个 CloudFlare 代维配置的活儿,有需要加速优化的,有需要排除疑难故障的,有需要提高防御攻击能力的甚至还有纯粹为了体验“打不死”装逼需要的。总之,各种各样的需求,五花八门的,好在 CloudFlare 都能一一满足,最主要的是这些…

VBA技术资料MF157:创建每个标题的目录

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

(Java面试题分享)万里长征-03-搜狐

万里长征-03-搜狐 ⚙ 以下内容基于GPT-4o模型 问题 1.LeetCode103 二叉树的锯齿形层序遍历 103. 二叉树的锯齿形层序遍历 - 力扣&#xff08;LeetCode&#xff09; 2.LeetCode5 最长回文子串 5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09; 3.Kafka为何那么快 …

Leetcode刷题笔记3:链表基础1

导语 leetcode刷题笔记记录&#xff0c;本篇博客记录链表基础1部分的题目&#xff0c;主要题目包括&#xff1a; 203.移除链表元素707.设计链表206.反转链表 知识点 链表 链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据…

vue3 依赖-组件tablepage-vue3版本1.1.2~1.1.5更新内容

github求⭐ 可通过github 地址和npm 地址查看全部内容 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例-汇总 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#…

002 仿muduo库实现高性能服务器组件_整体框架

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言项目框架小结 前言 本文不会包含任何项目模块的代码&#xff0c;旨在向你介绍项目具体分为哪几个模块&am…