Java常用类object详解
1.Object概述: 类Object是类层次结构的根类。每个类都使用Object作为超类。所有对象(包括数组)都实现这个类的方法。
2.构造方法详细信息:
Object只有一个无参构造方法,因为object中没有属性
public Object()
3.常用成员方法:
protected Object clone()
boolean equals(Object obj)
protected void finalize()
Class<?> getClass()
int hashCode()
String toString()
public final Class getClass():
从final看出子类不能被重写, 任何一个对象它的 getClass() 行为是一致。
返回值是 Object 的运行时类型。返回值类型是Class: 类类型
Class概述:Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注解是一种接口。
Class类中有一个public String getName():返回该对象的运行时类的全限定名(包名.类名)。可以在得到getClass的方法返回值Class类的时候通过getName获取当前正在运行的类名。
例如:
package com.cskaoyan.object;
public class ObjectDemo_02 {
public static void main(String[] args){
Object obj=new Object();
Class cl1=obj.getClass();
String name1=cl1.getName();
System.out.println("name1 = " + name1);//name1 = java.lang.Object
System.out.println("------------------------------------------" );
Object obj2=new Student();
Class cl2=obj2.getClass();
String name2=cl2.getName();
System.out.println("name2 = " + name2);//name2 = com.cskaoyan.object.Student }
}
public int hashCode():
返回该对象的哈希码值。
默认实现:这一般是通过将该对象的 内部地址 转换 成一个整数来实现的
hashcode()的常规协定:
1) 一致性. 如果一个对象进行比较的信息没有发生修改,那么在一次程序运行期间,它们的hash值要一致。
2) 相等性. 如果两个对象通过 equals 比较是相等的,那么它们的 hashcode 也要相等。
3) 哈希碰撞概率低. 如果两个对象不相等,那么它们的 hashcode 最好不相等,这个可以提高哈希 表的性能。
哈希码值相关知识:
哈希方程:哈希函数可以把任意长度的输入数据映射成一个固定长度的输出结果,返回值就为哈希码值

*MD4是麻省理工学院教授Ronald Rivest于1990年设计的一种信息摘要算法。它是一种用来测试信息完整性的密码散列函数的实行。其摘要长度为128位。这个算法影响了后来的算法如MD5、SHA家族和RIPEMD等。
*MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。
*SHA家族:安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
一些常用的哈希算法:

public String toString(): (建议所有子类都重写此方法。)
返回该对象的字符串表示。结果应是一个简明但易于读懂的信息表达式。
默认实现:return getClass().getName() + "@" + Integer.toHexString(hashCode());
例如:
public class ObjectDemo_04 {
public static void main(String[] args) {
Object obj=new Object();
String s=obj.toString();
System.out.println("s = " + s);//s = java.lang.Object@1540e19d
System.out.println(obj);//java.lang.Object@1540e19d
}
}
注意:直接打印对象,会默认调用toString()方法。
public boolean equals(Object obj):
指示其他某个对象是否与此对象"相等"。
默认实现: return (this == obj); 判断两个对象的地址值是否相等 (是否是同一个对象)
分两种情况判断是否需要重写equals()方法:
实体类:
一个对象对应一个实体。没有必要重写 Object 中的 equals();
值类:
例如:String, Point(成员变量为为横坐标和纵坐标),因为在现实生活中这种类型的类,当值都相同就可以看作同一个对象,所以需要重写 equals 方法。
值类重写方法需要将关键域进行比较:
例如:Rectangle(长方形类):
关键域:length, width
衍生域:area, perimeter
无关域:color
根据关键域进行比较
Point类重写equals()方法例如:
@Override
//注意,因为是重写Object类的equals方法,所以参数列表不能改变,还应该是Object object
public boolean equals(Object object){
if(object instanceof Point){
Point point=(Point) object;
return x==point.x&&y==point.y;
}
}
}
equals方法常规协定:
equals 方法在非空对象引用上实现相等关系:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回true时,x.equals(y)才应返回 true。
传递性:对于任何非空引 用值 x、y 和 z,如果x.equals(y)返回 true,并且y.equals(z)返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
非空性:对于任何非空引用值 x,x.equals(null) 都应返回 false。
注意事项:当此方法被重写时,通常有必要重写hashCode方法,并协定相等对象,都要有相同的哈希码。
用比较的元素作为根据来写hashCode方法。
使用idea生成的equals方法有一个缺陷,子类和父类进行比较的时候,返回值为false违反了里氏替换原则(凡是能够使用父类的地方都可以它的子类替换)。
protected void finalize() throws Throwable
概述:当垃圾回收器回收这个对象时,会自动调用此方法。子类重写 finalize 方法,以释放资源。
默认实现:什么都没做,空实现。
finalize:
1. 可以自己调用, 该对象没有被回收。
2. 当垃圾回收器回收这个对象时,会自动调用此方法。
3. 释放资源最好不要放在 finalize() 里面。为什么?
原因是:垃圾回收线程是一个优先级低的线程,当一个对象变成垃圾后,并不会马上被回 收,因此资源得不到立刻释放。
怎么释放资源呢?
try ... catch ... finally(异常处理)语句释放资源
protected Object clone() throws CloneNotSupportedException
概述:创建并返回此对象的一个"副本".
这个方法是protected修饰的,只有类在同一个包中才能使用,而Object在lang包下,所以我们想要调用这个方法就必须去重写这个方法。
但是如果重写得方法不实现Cloneable 接口则会报出异常:CloneNotSupportedException。
Cloneable(空接口, 标记接口):
此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出CloneNotSupportedException异常。
一个接口没有定义任何内容,叫做空接口,在Java中往往起标记作用。
浅拷贝和深拷贝:
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
深拷贝和浅拷贝的应用场景:
1.对于基本数据类型我们不需要考虑浅拷贝和深拷贝,使用等号便可复制值。
2.对于复合数据类型使用等号属于浅拷贝,仅复制该字段值,如数组则复制地址,这个时候需要考虑是否使用需要深拷贝。
Java的默认实现是浅拷贝和深拷贝?
浅拷贝
举例:
public class ObjectDemo7 {
public static void main(String[] args) throws CloneNotSupportedException {
// Object obj = new Object();
// obj.clone();
Student s1 = new Student("Henson_z", 18);
Student s2 = s1.clone();
// System.out.println(s1.equals(s2));
// System.out.println(s2);
// System.out.println(s1 == s2);
System.out.println(s1.getName().equals(s2.getName())); // true
System.out.println(s1.getName() == s2.getName()); // false
}
}
因为name 是String类型的是引用变量,从 System.out.println(s1.getName() == s2.getName()); // false中可以看出s1和s2的name是指向同一个变量的,所以java中的拷贝为浅拷贝

在java中怎么实现深拷贝?
对引用数据类型,创建一个新的对象,并复制其内容。
举例:(单层关系的深拷贝)
//在Student重写clone()方法时,name属于String类型的成员变量,如果直接调用super.clone()(即Object类的clone方法)方法进行复制,只进行了浅拷贝
//所以对于name成员变量要创建一个新的对象,并复制内容
protected Student clone() throws CloneNotSupportedException {
Student s = (Student) super.clone();
s.name = new String(name);
return s;
}
举例:(多层关系的深拷贝)
package com.cskaoyan.object;
/*
对 FirstLevel 实现深拷贝。
分析:
1. 实现 cloneable 接口
2. 重写 clone 方法。
*/
public class FirstLevel implements Cloneable{
int a;
SecondLevel secondLevel; @Override
protected FirstLevel clone() throws CloneNotSupportedException {
// return super.clone();
FirstLevel fl = (FirstLevel) super.clone();
// 对 SecondLevel 进行深拷贝不是 FirstLevel 的职责。
/*SecondLevel sl = new SecondLevel();
sl.b = fl.secondLevel.b;
sl.s = new String(fl.secondLevel.s);*/
SecondLevel clone = secondLevel.clone();
fl.secondLevel = clone;
return fl;
}
}
package com.cskaoyan.object;
public class SecondLevel implements Cloneable{
int b;
String s;
@Override
protected SecondLevel clone() throws CloneNotSupportedException {
SecondLevel sl = (SecondLevel) super.clone();
sl.s = new String(s);
return sl;
}
}
Java常用类object详解的更多相关文章
- Java常用类StringBuffer详解
内容多为最近学习的自我总结,可能有些地方写的不严谨,甚至会有错误的地方,仅供参考,如发现错误敬请指出,谢谢! 灰色字体为补充扩展内容,多为帮助自己理解. StringBuffer概述: 线程安全的可变 ...
- Java基础之Java常用类--Object类,字符串相关类,包装类,日期相关类,数字相关类
Java是一种面向对象的语言,也就是将万事万物可以描述为对象,特点如下: 1.面向对象是常见的一种思考习惯,符合人们的思考习惯.2.面向对象的出现,将复杂的事情简单化.3.面向对象的出现,将之前过程中 ...
- java常用类 --- Object
Object类 Object类是所有Java类的父类,其位于java.lang包中.任何Java对象,如果没有显示定义父类则它默认Object类作为父类. 方法如下: 其中与线程相关的有5个方法: n ...
- Java常用类-Object类
一.java.lang.Object类 1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Obj ...
- Java 嵌套类基础详解
目录 1. 什么是嵌套类? 2. 为什么要使用嵌套类? 3. 嵌套类的类型 4. 静态嵌套类 5. 非静态嵌套类 5.1 成员内部类 5.2 局部内部类 5.3 匿名内部类 6. 嵌套接口 1. 什么 ...
- Java的类的详解
首先呢,我承认上一次我理解的有误. 1.构造方法的作用:是初始化一个对象,而不是成员变量,它和get和set方法都有给成员变量赋值的功能. 2.下来说一下JVM调用main方法的过程: a.静态变量赋 ...
- Java工具类DateFormatUtils详解
日期和时间格式化实用程序和常量public static String format(Calendar calendar, String pattern) 说明:将日历格式化为特定的模式:参数:cal ...
- Properties类使用详解
Java Properties类使用详解 概述 Properties 继承于 Hashtable.表示一个持久的属性集,属性列表以key-value的形式存在,key和value都是字符串. Pr ...
- 在java poi导入Excel通用工具类示例详解
转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36 作者:daochuwenziyao 我要评论 这篇文章主要给大家介绍了关于在j ...
随机推荐
- Centos 7 修改网卡名称、静态IP
修改内核选项 # vim /etc/sysconfig/grub GRUB_TIMEOUT= GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc ...
- web-忘记密码了
题目 随便提交一个数据 点击确定依旧跳转到原来的网页,下面网页依旧跳转到原来的网页 http://ctf5.shiyanbar.com/10/upload/step1.php/step2.php?em ...
- Win10打开控制面板的方式
Win10打开控制面板的方式方式1:1.打开运行框 windows键 + R2.在运行框中输入 control 方式2:右击开始图标->控制面板 方式3:在命令行cmd中输入 contro ...
- Golang调用Python
https://yq.aliyun.com/articles/117329 Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言.Python很适合让搞算法的写写模型, ...
- SysML——AI-Sys Spring 2019
AI-Sys Syllabus Projects Grading AI-Sys Spring 2019 When: Mondays and Wednesdays from 9:30 to 11:00 ...
- Appium入门指南 - 环境搭建和Case编写
本文档将详细介绍如何搭建 Appium 的运行环境,以及如何编写一个简单的 UI 自动化测试用例.其中,也会穿插讲解一些 Appium 的基本知识.关于 Appium 的更多信息,大家可以查看官方文档 ...
- PATB1033 旧键盘打字 (20 分)
一.技术总结 使用字符数组出现段错误即char str[];改成string str:后问题解决.以后尽量使用C++中的string 使用cin>>,出现答案错误,原因可能是在输入是有空格 ...
- [LeetCode] 137. Single Number II 单独的数字之二
Given a non-empty array of integers, every element appears three times except for one, which appears ...
- API数据加密框架monkey-api-encrypt
之前有写过一篇加密的文章<前后端API交互如何保证数据安全性>.主要是在Spring Boot中如何对接口的数据进行自动加解密操作,通过注解的方式来指定是否需要加解密. 原理也很简单,通过 ...
- STM32Cube在Main里判断USB是否已连接到电脑
首先添加这两个Includes: #include "usbd_def.h" #include "usbd_hid.h" 然后就可以在代码里用这个来判断是否有连 ...