JavaAPI(2)

JavaAPI(2)

一、Object

  • Object是Java中的顶级父类。所有的类都直接或者间接的继承与Object

1、Object的构造方法

  • 只有空参构造——public Object()
class Person {private String name;private int age;public Person() {super();	// 不写,系统会默认加上}public Person(String name, int age) {super();	// 不写,系统会默认加上this.name = name;this.age = age;}
}

当你创建一个子类对象时,子类的构造函数会自动调用父类的构造函数。这是因为子类需要确保父类部分的初始化完成,以便能够正确使用从父类继承的属性和方法。

2、Object常用的成员方法

2.1toString()方法
  • public String toString()——返回对象的字符串表示形式
  1. 当没有在方法中重写toString()方法时,默认打印一个对象时,底层会调用父类Object中的toString方法,打印出对象的地址值
  2. 如果想要打印出内容的属性值,则需要在子类中重写toString方法

示例

// 1.toString 返回对象的字符串表示形式Object object = new Object();String s = object.toString();System.out.println(s);  // 输出: java.lang.Object@4eec7777// 没有重写toString方法时// 细节:// System:类名// out:静态变量// System.out:获取打印的对象// println():方法// 核心逻辑:打印一个对象时,底层会调用对象的toString方法,把对象变成字符串Student st = new Student();String s1 = st.toString();System.out.println(s1); // 输出: com.api.a04objectdemo04.Student@41629346// 若要打印出的内容是属性值,则需要造子类中重写toString方法System.out.println(s1); // 输出: Student{name = null, age = 0}// 所以要实现本方法时,且要打印出它的属性值时,需要重写
2.2equal()方法
  • public boolean equals(object obj)——比较两个对象是否相等
  1. 如果没有调用重写的equals方法,那么就默认使用Object中的方法进行比较,比较的是地址值是否相等
  2. 一般地址值对于我们来讲意义不大,所以我们会进行重写,比较内部的属性值

重写的代码

@Overridepublic 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);}

示例

        // 2.equal 比较两个对象是否相等Student s2 = new Student();Student s3 = new Student();// 如果没有调用重写equals方法,那么就默认使用Object中的方法进行比较,比较的是地址值是否相等boolean result = s2.equals(s3);System.out.println(result); // 输出: false// 一般来讲地址值对于我们的意义不大,所以我们会重写// 重写之后比较的就是对象内部的属性值了Student a1 = new Student("小明", 20);Student a2 = new Student("小明", 20);boolean result01 = a1.equals(a2);System.out.println(result01);   // 输出: true
拓展内容
  • StringStringBuilder类的比较
public static void main(String[] args) {// 拓展String s = "abc";StringBuilder sb = new StringBuilder("abc");System.out.println(s.equals(sb));   // 输出: false// 因为equals方法是被s调用的,而s是字符串// 所以equals要看String类中的// 字符串中的equals方法,先判断地址值,再判断参数是否是字符串,再比较字符串是否相等// 如果是字符串,再比较内部的属性// 此处并不是字符串,所以输出为: falseSystem.out.println(sb.equals(s));   // 输出: false// 因为equals方法是被sb调用的,而sb是StringBuilder// 所以这里的equals方法要看StringBuilder中的equals方法// 那么在StringBuilder当中,没有重写equals方法// 使用的是Object中的// 在object当中默认是使用==号比较两个对象的地址值// 而这里的s和sb记录的地址值是不一样的,所以结果返回false}
2.3clone()方法
  • protected Object clone(int a)——对象克隆

使用场景:一般在游戏中会用于,玩家在不同服务区数据的克隆

  1. 该方法不能通过创建的对象直接调用,因为是在Object中是protected修饰的(protected是不同包下的子类里面可以用,但子类创建的对象不能用
  2. 所以要想使用只能在子类中重写clone()方法

在子类中的重写

@Overrideprotected Object clone() throws CloneNotSupportedException {// 调用父类中的clone方法// 相当于让Java帮我们克隆一个对象,并把克隆之后的对象返回出去return super.clone();}
  • 并且要将子类实现Cloneable接口:
//Cloneable
// 如果一个接口里面没有抽象方法
// 表示当前的接口是一个标记性接口
// 现在cloneable表示一旦了实现,那么当前类的对象就可以被克隆
// 如果没有实现,当前类的对象就不能克隆
public class User implements Cloneable{……
}

在测试类中

public static void main(String[] args) throws CloneNotSupportedException {// 对象克隆// 1.先创建一个对象int[] data = {1,2,3,4,5,6,7,8,9,10,11};User u1 = new User(1, "xiaoming", "123456", "sxacs", data);// 2.克隆对象// 不能直接创建对象调用,因为在Object中是protected修饰的// protected是不同包下的子类里面可以用,但是子类创建的对象不能用(只能在子类中重写clone()方法)// 细节:// 方法在底层会帮我们创建一个对象,并把原对象中的数据拷贝过去。// 书写细节://1.重写object中的clone方法//2.让javabean类实现cloneable接口//3.创建原对象并调用clone就可以了。User u2 = (User)u1.clone();// 验证Object中的克隆是深克隆还是浅克隆int[] arr = u1.getData();arr[2] = 10000;System.out.println(u1); // 输出: objectdemo03{id = 1, username = xiaoming, password = 123456, path = sxacs, data = [1, 2, 10000, 4, 5, 6, 7, 8, 9, 10, 11]}System.out.println(u2); // 输出: objectdemo03{id = 1, username = xiaoming, password = 123456, path = sxacs, data = [1, 2, 10000, 4, 5, 6, 7, 8, 9, 10, 11]}// 输出结果一下 Object中的克隆是浅克隆}
浅克隆和深克隆:
  • 把A对象的属性值完全拷贝给B对象,也叫对象拷贝,对象复制
1、浅克隆

不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来

  1. 基本数据类型:直接拷贝值
  2. 引用数据类型:
    1. 字符串:存放在字符串常量池中,赋值也是将在常量池的地址赋值给克隆对象(复用)
    2. 引用数据类型数组:(new出的),也是仍然会将之前new出的地址值赋给克隆对象

故:浅克隆的引用数据类型会与原对象共同操作使用一个地址的值Object是浅克隆

2、深克隆
  1. 基本数据类型:直接拷贝值
  2. 引用数据类型:
    1. 字符串:存放在字符串常量池中,赋值也是将在常量池的地址赋值给克隆对象(复用)
    2. 引用数据类型数组:再次new一个内存,并将原来的值拷贝到新内存中,将新的地址值赋给克隆对象

故:深克隆的引用数据类型数组不会与原来的对象操作一个值(互不影响)

所以要想在上面的代码(父类Object)中实现深克隆则需要在子类重写的clone()方法中进行new操作:

@Override
protected object clone() throws CloneNotSupportedException{//调用父类中的clone方法//相当于让Java帮我们克隆一个对象,并把克隆之后的对象返回出去。//先把被克隆对象中的数组获取出来int[] data = this.data;//创建新的数组int[] newData =ew int[data.length];//拷贝数组中的数据for (int i = 0; i < data.length; i++) {newData[i]= data[i];}//调用父类中的方法克隆对象User u = (User) super.clone();//因为父类中的克隆方法是浅克隆,替换克隆出来对象中的数组地址值u.data = newData;return u; 
}

二、Objects

Objects是一个工具类,提供一些方法去完成一些功能

  • 对于在创建对象时,可进行赋值为空的判断,避免空指针异常

1、equals()方法

  • public static boolean equals(object a, Object b)——先做非空判断,比较两个对象

2、isNull()方法

  • public static boolean isNull(object obj)——判断对象是否为null,为null返回true ,反之

3、nonNull()方法

  • public static boolean nonNull(object obj)——判断对象是否为null,跟isNull的结果相反

示例

public static void main(String[] args) {// Objects是一个工具类// 创建一个学生对象Student s1 = null;Student s2 = new Student("xiaoming", 20);//        boolean result = s1.equals(s2);
//        System.out.println(result); // 此时会报错 空指针异常// 比较两个对象的属性值是否相等if(s1 != null) {boolean result = s1.equals(s2);System.out.println(result);}else {System.out.println("调用者为空"); // 输出: 调用者为空}// 在这种情况下可以使用Objectsboolean result = Objects.equals(s1, s2);System.out.println(result); // false// 细节://1.方法的底层会判断s1是否为nul1,如果为nul1,直接返回false//2.如果s1不为null,那么就利用s1再次调用equals方法//3.此时s1是Student类型,所以最终还是会调用student中的equals方法。//  如果没有重写,比较地址值,如果重写了,就比较属性值。// 判断是否为空System.out.println(Objects.isNull(s1)); // trueSystem.out.println(Objects.isNull(s2)); // falseSystem.out.println(Objects.nonNull(s1)); // falseSystem.out.println(Objects.nonNull(s2)); // true}

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

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

相关文章

电子科大、同济大学与新加坡国立大学联合发布Math-LLaVA:增强多模态大语言模型的数学推理能力

一、结论写在前面 下面介绍的论文来自&#xff1a;电子科技大学、新加坡科技设计大学、同济大学、新加坡国立大学。 论文标题&#xff1a;Math-LLaVA: Bootstrapping Mathematical Reasoning for Multimodal Large Language Models 论文链接&#xff1a;https://arxiv.org/p…

高校体育场管理系统+ssm

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;高校体育场管理系统被用户普遍使用&#xff0c;为方便用户…

杂谈:业务说的场景金融是什么?

引言&#xff1a;市场格局的转变 在供应短缺的年代&#xff0c;是典型的卖方市场。为了保证稳定供货&#xff0c;买方会提前一段时间下单&#xff0c;也几乎没什么议价能力。卖方只需等着接单就行。 现在很多领域的供应商数量越来越多&#xff0c;而且随着互联网的普及&#…

知从科技受邀出席ARM日产技术日

10月29日&#xff0c;上海知从科技有限公司受 ARM 之邀&#xff0c;参与了由其主办的日产技术日活动。此次活动在日本神奈川县厚木市的日产技术中心盛大举行&#xff0c;这一活动汇聚了行业内的前沿技术与精英人才&#xff0c;成为科技创新技术交流的重要平台。 知从科技积极参…

驱动前的准备

驱动前的准备 目录 驱动前的准备 移植SDK 补充&#xff1a;怎么使用我的虚拟机/怎么把自己的虚拟机拷贝到其他磁盘 移植SDK -- 将压缩包复制到虚拟机里面 -- 删除备份文件 -- 解压这个压缩包(会占用大量的空间->有空间再去做&#xff01;) 补充&#xff1a;怎么使用我的…

【网页设计】CSS 定位

目标 能够说出为什么要用定位能够说出定位的4种分类能够说出4种定位各自的特点能够说出为什么常用子绝父相布局能够写出淘宝轮播图布局能够说出显示隐藏的2种方式以及区别 1. 定位 1.1 为什么需要定位 提问&#xff1a; 以下情况使用标准流或者浮动能实现吗&#xff1f;1. …

Spring Boot框架:计算机课程管理的工程认证之桥

3系统分析 3.1可行性分析 通过对本基于工程教育认证的计算机课程管理平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于工程教育认证的计算机课程管理平…

yolov10断点续训

1. 前言 我们在使用yolov10进行训练的时候往往会因为各种各样的原因中断训练&#xff0c;如&#xff1a; 开了太多程序导致崩溃突然断电其他原因 这时候如果下次能继续上次训练的结果继续训练会节省很多时间 2.复现与解决办法 2.1 正常启动训练 我们先正常启动一个训练 …

【笔记】LLC电路工作频点选择 2-1 输出稳定性的限制

LLC工作模式的分析参考了&#xff1a;现代电力电子学&#xff0c;电力出版社&#xff0c;李永东 1.LLC电路可以选择VCS也可以选择ZVS 1.1选择ZCS时&#xff0c;开关管与谐振电感串联后&#xff0c;与谐振电容并联&#xff1a; 1.2选择ZVS时&#xff0c;开关管仅仅安装在谐振电…

手把手教你写Unity3D飞机大战(4)人机飞机的移动

写在最前面的话 上一篇博客&#xff0c;我们控制了玩家的移动&#xff0c;但这还不够&#xff0c;我们需要让敌方也动起来。 一、大致概要 人机的移动&#xff0c;我们采用随机数来控制&#xff0c;分别包括&#xff08;前进&#xff0c;转弯&#xff0c;爬升&#xff0c;俯冲&…

Spring Boot助力计算机课程管理:符合工程认证

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于工程教育认证的计算机课程管理平台的开发全过程。通过分析基于工程教育认证的计算机课程管理平台管理的不足&#xff0c;创建了一个计算机管理基于工程教育认…

Vue2基础

1.环境准备 安装脚手架&#xff1a;全局安装 作用&#xff1a;在任何一个目录下都能通过vue命令创建项目 注意&#xff1a;低版本的node执行这行命令可能会报错&#xff0c;需要升级版本 npm install -g vue/cli 创建项目 在指定的目录下&#xff0c;执行命令 作用&…

RAG如何提升视觉问答?剑桥大学博士论文《使用检索方法增强多模态问答系统》

开发能够处理复杂任务的人工智能系统的需求推动了深度学习的快速发展&#xff0c;尤其是自 2016 年以来&#xff0c;神经网络模型已成为主流方法。这些模型的应用范围广泛&#xff0c;从推荐系统到语音识别&#xff0c;彻底变革了多个领域。然而&#xff0c;仍然存在一些挑战&a…

C++初阶学习第九弹-----vector的模拟实现

C初阶学习第六弹------标准库中的string类_c# string[]-CSDN博客 C初阶学习第七弹——string的模拟实现-CSDN博客 C初阶学习第八弹--深入解析vector的使用-CSDN博客 一.vector的成员变量 目录 一.vector的成员变量 二.vector的模拟实现 2.1vector的构造与析构 2.2迭代器…

提升网站流量的搜索引擎优化实用指南

内容概要 搜索引擎优化&#xff08;SEO&#xff09;是提升网站可见性与流量的重要过程。在当今数字时代&#xff0c;理解这一领域的基本概念至关重要。SEO不仅仅是关于提高关键词排名&#xff0c;更是关于如何创造更好的用户体验和吸引目标受众。以下是一些关键要素&#xff0…

求教0基础入门大模型的学习路线?java出身,数学良好,希望入局大模型算法,有无必要从cnn学起?

目录 前言&#xff1a; Prompt工程&#xff1a; 2.AI编程 3.API调用 4.大模型应用开发 1)RAG 2)Agent 5.深水区&#xff1a;模型训练和微调 1)Fine-tuning 2)多模态 6.产品和交付 前言 本人本科学历java开发出身&#xff0c;数学基础良好&#xff0c;希望入局大模…

ubuntu 安装 mongodb 笔记记录

https://www.mongodb.com/try/download/community 以上是下载地址 查看系统 (base) duyichengduyicheng-computer:~$ cat /proc/version Linux version 6.8.0-48-generic (builddlcy02-amd64-010) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.2.0-23ubuntu4) 13.2.0, GNU ld (GNU …

隐藏式水印了解一下?你以为加水印很麻烦?

隐藏式水印了解一下&#xff1f;你以为加水印很麻烦&#xff1f; 想在网页上添加水印&#xff1f;想要隐形又清晰的水印效果&#xff1f;watermark-js-plus或许就是你正在找的工具&#xff01;本文将详细介绍这款前端水印库的特点和使用方法&#xff0c;帮你轻松搞定网页水印问…

大模型人工智能课程全栈完整学习路径

嘿&#xff0c;朋友们&#xff0c;今天我们聊点高级的——大模型人工智能课程的全栈学习路径。不过别慌&#xff0c;虽然听起来高大上&#xff0c;但咱们慢慢来。从零开始&#xff0c;一步步带你走进这个神奇的世界。喝杯咖啡&#xff0c;穿上最舒适的拖鞋&#xff0c;准备好踏…

学SQL,要安装什么软件?

先上结论&#xff0c;推荐MySQLDbeaver的组合。 学SQL需要安装软件吗&#xff1f; 记得几年前我学习SQL的时候&#xff0c;以为像Java、Python一样需要安装SQL软件包&#xff0c;后来知道并没有所谓SQL软件&#xff0c;因为SQL是一种查询语言&#xff0c;它用来对数据库进行操…