JavaImprove--Lesson02--Object类,Objects工具类,封装类
一.Object类
Java中的Object
类是所有类的超类,它是Java类层次结构的根类。这意味着所有的类都直接或间接地继承自Object
类
equals(Object obj)
: 用于比较两个对象是否相等。默认实现是比较对象的引用,但可以通过重写此方法来比较对象的内部状态。hashCode()
: 返回对象的哈希码值,通常用于散列数据结构,如哈希表。toString()
: 返回对象的字符串表示形式。默认实现可能不提供足够的信息,因此经常被重写。clone()
: 创建并返回此对象的一个副本。默认实现是浅复制,可以通过重写clone()
方法和Cloneable
接口来实现深复制。finalize()
: 当垃圾收集器准备回收对象的内存时,会调用此方法。可以用于释放资源,但不建议依赖此方法,因为它不是保证会运行。
Object自带的方法有很多,但是常使用的就是toString,equals,clone方法
这些方法都是主要使用的方法,但是Object类是被任何类所继承或者间接继承的,所以说任何类都可以使用到这些方法
但是,作为子类大多数情况下并不是为了使用父类的方法,而是重写父类的方法,从而使这些方法能够适配子类
举个例子,如果不重写object类的方法,clone()就会一直克隆object类,很显然,大多数情况下,我们不需要使用克隆object,而是克隆当前类,就需要重写clone方法
toString方法
toString方法,如果不重写父类的方法,那么就还是调用父类的方法,父类的方法就是打印一些关于当前对象的类名和对象的hashcode
public class toStringDemo {
private String name;
private String clasName;
private double grade; public toStringDemo() {
} public toStringDemo(String name, String clasName, double grade) {
this.name = name;
this.clasName = clasName;
this.grade = grade;
} }
如上代码,没有重写父类的方法,我们在主方法调用toString方法
输出如下
我们重写toString方法:
注意,重写需要清楚是自己重写还是让编译器帮我们重写
自己重写就根据自己想让此方法输出什么,就diy就好了
编译器帮我们重写的toString方法是用来打印当前对象的属性值的,我们可以使用快捷键 alt + insert ,或者手动输入tosting,编译器会提示此方法
但是一般重写都是让编译器帮我们重写,因为大多数人使用toString方法都是想看看对象的内部属性内容的
重写toString方法:
@Override
public String toString() {
return "toStringDemo{" +
"name='" + name + '\'' +
", clasName='" + clasName + '\'' +
", grade=" + grade +
'}';
}
使用有参构造,再来获取一个对象后,调用toString方法
输出如下:
总结:大多数情况下,我们都会让编译器重写object类的toString方法,使其能打印一些类对象的内部细节
equals
equals方法是用来比较两个对象是否相等的,使用方法:对象 . equals(对象)
对象之间的比较方式是确定equals方法执行的关键,object方法自带的比较方式是比较内存地址,但是再Java中,使用new关键字创建的对象都不是单例模式
也就是每次new关键字实例化出来的对象都是新建的,所以他们有自己的内存地址
所以使用object类的equals方法比较结果都是false
我们重写equals方法后,可以根据自定义的方式来判断两个对象是否相等,我们判断的标准可以变为对象的属性值是否一一对应相等,如果不是才返回false
重写equals方法:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
toStringDemo that = (toStringDemo) o;
return Double.compare(that.grade, grade) == 0 && Objects.equals(name, that.name) && Objects.equals(clasName, that.clasName);
}
这是编译器自动生成的equals方法,我们可以来看看这个方法的执行逻辑
if (this == o) return true;
这是equals方法的重写第一句,this调用此方法的对象,而o代表传入的对象
== 符号是用来判断地址是否相等的,如果这两个对象地址相等,那么肯定是一个对象,则返回true
if (o == null || getClass() != o.getClass()) return false;
第二句话先判断传入的对象是否为空,不为空且传入对象的类和this类是否属于一个类
如果不是一个类,那么不管怎么创建对象,两个类new出来的对象就一定是不同的对象,所以直接返回false
toStringDemo that = (toStringDemo) o;
return Double.compare(that.grade, grade) == 0 && Objects.equals(name, that.name) && Objects.equals(clasName, that.clasName);
最后一段代码就是将两个对象的属性值进行依次比较,只要有一个不相等,就返回false,反之,都相等,返回ture
clone方法
这不是 Java代码实现的方法,而是c++写的方法
它可以实现对象克隆,它是在内存中操作的方法,Java本身不提供指针操作,所以使用c++的方法会更加的高效,它们可以操作内存,这些非Java写的代码一般存放再Java的jvm虚拟机的本地方法栈中
这个方法就重写就只能靠编译器重写了
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
这种写法是浅克隆,可以克隆一个一摸一样的对象出来,hashcode是不一样的,内容是一样的
关于深克隆和浅克隆可以看我的博客:GOF23--23种设计模式(二)
查看设计模式的原型模式部分,有深克隆和浅克隆的详解
二.Objects工具类
Objects
是 Java 中的一个实用工具类,它包含了一系列用于处理对象的方法。由于 Object
是所有类的超类,Objects
类中的方法可以用于任何 Java 对象。以下是一些 Objects
类中的常用方法:
- equals(): 用于比较两个对象是否相等。这个方法首先检查两个对象是否为同一个对象(即它们的引用是否相同),如果是,则返回
true
。如果不是,它会调用对象的equals()
方法。如果对象没有重写equals()
方法,则默认实现会比较对象的内存地址,而不是它们的内部状态。 - hashCode(): 返回对象的哈希码值。哈希码是一个整数,通常用于在哈希表等数据结构中存储对象。默认情况下,
hashCode()
方法返回对象的内存地址的整数表示,但也可以通过重写该方法来提供更合适的哈希码计算方式。 - toString(): 返回对象的字符串表示形式。默认情况下,这个方法返回对象的类名和内存地址的字符串表示形式,但也可以通过重写该方法来提供更有意义的字符串表示。
- hash(): 计算对象的哈希码值,前提是该对象实现了
hashCode()
方法。 - toString(Object obj): 返回对象的字符串表示形式,前提是该对象实现了
toString()
方法。
Objects类中的方法都是静态的,所以说,我们可以直接通过Objects . 方法使用这个工具类重点的方法
Objects类中的工具方法有很多,详细了解请款JDK帮助文档
equals方法
object的equals方法和objects的equals方法使用是不一样的
调用方式:
object的equals方法:对象 . equals(对象)
ObjectsDemo obj1 = new ObjectsDemo();
ObjectsDemo obj2 = new ObjectsDemo();
obj1.equals(obj2);
objects的equals方法: Objects.equals(对象,对象)
ObjectsDemo obj1 = new ObjectsDemo();
ObjectsDemo obj2 = new ObjectsDemo();
//静态方法,直接点出来
Objects.equals(obj1,obj2);
object的equlas方法需要可以重写,但是objects的equals方法是静态方法,是架构师写好的,我们只能使用,不用重写
object
//object类的equals
public boolean equals(Object obj) {
return (this == obj);
}
objects
//Objects类的equals
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
我们可以看到objects类的方法更加的专业
它有非空校验,但是object的方法没有
obj1=null;
obj1.equals(obj2);
object的比较方式没有校验,如上比较后,会报错:
而使用objects的equals方法比较:
obj1=null;
System.out.println(Objects.equals(obj1, obj2));
总结:
Objects工具类中的方法更加专业,所以如果不想自己重写object的方法,可以使用Objects工具类中的方法
三.封装类(包装类)
众所周知,Java 是一门面向对象的编程语言,所谓万物皆对象
但是Java中又必须有一些不是对象的基本类型
编程语言一共有八个基本数据类型,对于这些不是对象,且必须存在面向对象的编程语言的类型怎么办呢?
这时候Java就拥有了基本类型的包装类,每一个基本类型都有它的包装类,它们的包装类就是对象类型
Java中的包装类(Wrapper class)是对基本数据类型的封装,它们为每种基本数据类型提供了对应的包装类。这些包装类在Java标准库中定义,并且都是java.lang
包的一部分。
以下是Java中的8种基本数据类型及其对应的包装类:
- byte -> Byte
- short -> Short
- int -> Integer
- long -> Long
- float -> Float
- double -> Double
- char -> Character
- boolean -> Boolean
我们在泛型中讲到,泛型中不支持基本类型的,所以有了包装类,我们可以使用包装类
举个例子:ArrayList<>泛型就只接收对象类型
ArrayList<Integer> list = new ArrayList<>();
使用Interger对象,就可以毫无问题的传入int类型
但是有没有想过,为什么我们传入的是int类型,而ArrayList<>中又是Interger类型,但是任然可以装进去呢?
这就涉及到Java的另外一个领域了,自动拆箱和装箱
自动装箱指的是,我们可以直接将int型变量赋给Integer对象,有JVM帮我们调用相关方法
如下:
Integer a = 12;
Integer b = Integer.valueOf(12);
这两个命名方式是一样的,但是上一条语句就是自动装箱的结果,在ArrayList中,我们也是传入了一个int型的值
只不过它被自动装箱成了Integer对象罢了
自动拆箱指的是,可以将一个Integer对象直接赋值给基本类型
如下:
Integer a = 12;
int b = a;
int c = a.intValue();
自动拆箱也不需要调用相关的方法,可以使封装类直接转换为基本类型
详细的自动拆箱和装箱可以看:Java拓展-拆,装箱,线程,反射
Integer.parseInt()和String.valueOf()
这两个方法是包装类的重点方法
parse方法可以将字符串转换为int,float,double
valueOf可以将其它类型转换为string类型
尤其是在web开发的时候,前后端传递参数都是String类型的,就可以通过paseInt将本是int类型的数据转换为int
parse系列方法:
parseInt:
String a = "12";
int b = Integer.parseInt(a);
parseDouble:
String a = "12";
double b = Double.parseDouble(a);
parseFloat:
String a = "12";
float b = Float.parseFloat(a);
注意:
如果a = “12.5”这种一看就是浮点型是不能使用int去转换的,它转不了
而且如果a中包含字符,也是转换不了的
上面两种情况都是会报错的
valueOf()方法:
此方法是包含于String类型的,可以将其它类型转换为S听类型
String a = String.valueOf(12);
String b = String.valueOf(12.0);
但是这个在实际开发中用到的比较少,因为一般我们会选择使用字符拼接
JavaImprove--Lesson02--Object类,Objects工具类,封装类的更多相关文章
- Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)
当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.la ...
- Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable
Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable接口,泛型 Collection,List,Se ...
- Java基础进阶:APi使用,Math,Arrarys,Objects工具类,自动拆装箱,字符串与基本数据类型互转,递归算法源码,冒泡排序源码实现,快排实现源码,附重难点,代码实现源码,课堂笔记,课后扩展及答案
要点摘要 Math: 类中么有构造方法,内部方法是静态的,可以直接类名.方式调用 常用: Math.abs(int a):返回参数绝对值 Math.ceil(double a):返回大于或等于参数的最 ...
- Code片段 : .properties属性文件操作工具类 & JSON工具类
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “贵专” — 泥瓦匠 一.java.util.Properties API & 案例 j ...
- 根据值获取枚举类对象工具类EnumUtils
枚举类 public enum Sex { man("M","男"),woman("W","女"); private S ...
- java工具类-日期工具类
1.获得时间戳 为了统一其他语言的如php和unix系统获取的时间戳是10位长度的,精确到秒. java时间戳长度是13位,精确到毫秒 我们获取时间戳需要相应处理. //获取当前时间戳,除以1000, ...
- Java常用工具类---IP工具类、File文件工具类
package com.jarvis.base.util; import java.io.IOException;import java.io.InputStreamReader;import jav ...
- Java常用工具类---XML工具类、数据验证工具类
package com.jarvis.base.util; import java.io.File;import java.io.FileWriter;import java.io.IOExcepti ...
- 工具类 分页工具类PageParamBean
自己编写的分页工具类,根据不同的数据库类型,生成对应的分页sql信息,分享给大家,希望大家共勉,工具类有些地方,大家可能不需要,请根绝自己的需要进行修改使用,核心逻辑都在,如果大家觉得有什么不妥,欢迎 ...
- java最全的获取某个接口或者某个类所有对应的所有实现类和继承类的工具类--反射动态获取、非动态获取、按照路径获取等总结
我们直接上代码吧,代码中有注释说明. //直接看代码吧 import java.io.File; import java.lang.reflect.Field; import java.net.URL ...
随机推荐
- destoon上做纯js实现html指定页面导出word
因为最近做了范文网站需要,所以要下载为word文档,如果php进行处理,很吃后台服务器,所以想用前端进行实现.查询github发现,确实有这方面的插件. js导出word文档所需要的两个插件: 1 2 ...
- Sentinel系列之SlotChain、NodeSelectorSlot、ClusterBuilderSlot分析
本文基于Sentinel 1.8.6版本分析 1. SlotChain 我们从入口com.alibaba.csp.sentinel.SphU#entry(java.lang.String) 开始分析. ...
- 如何打开关闭Edge鼠标手势
概述 今天突然发现edge有了一个鼠标手势,用起来不是很适应,所以决定将其关掉. 操作步骤 点击edge右上角的三个点 在下拉菜单中选择设置 点开设置之后出现如图所示的界面,然后选择外观 往下面拉页面 ...
- 服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
一般而言cpu异常往往还是比较好定位的.原因包括业务逻辑问题(死循环).频繁gc以及上下文切换过多.而最常见的往往是业务逻辑(或者框架逻辑)导致的,可以使用jstack来分析对应的堆栈情况. 使用js ...
- PTA乙级1044C++(手动打表hhh)
1044 火星数字 (20 分) 火星人是以 13 进制计数的: 地球人的 0 被火星人称为 tret. 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, j ...
- SpringBoot数据响应、分层解耦、三层架构
响应数据 @ResponseBody 类型:方法注解.类注解 位置:Controller方法.类上 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合 ,将会转换为json格式响应 说明:@ ...
- c#中原型模式详解
基础介绍: 具体可分为2个角色: Prototype(原型类):声明一个Clone自身的接口: ConcretePrototype(具体原型类):,实现一个Clone自身的操作. ...
- JUC并发编程学习笔记(七)常用的辅助类
常用的辅助类 CountDownLatch 这是一个JUC计数器辅助类,计数器有加有减,这是减. 使用方法 package org.example.demo; import java.util.con ...
- 时间复杂度为 O(nlogn) 的排序算法
归并排序 归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下: 划分:分解待排序的 n 个元素的 ...
- Object.assign () 和深拷贝
先看看啥叫深拷贝?啥叫浅拷贝? 假设B复制了A,修改A的时候,看B是否发生变化: 如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值) 如果B没有改变,说明是深拷贝,自食其力!(修改堆 ...