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 ...
随机推荐
- Ubuntu 18.04上安装Apache, MySQL, PHP, LAMP
1.安装 Apache $ sudo apt update && sudo apt install apache2 中间会遇到停顿询问是否继续, 输入 y 然后 回车. 2.测试 Ap ...
- 商学院教授点评亚马逊、苹果、Facebook和谷歌的商业策略:3星|《互联网四大:亚马逊、苹果、脸书和谷歌的隐藏基因》
“ 谷歌依靠时报的内容吸引了数十亿点击量,而时报使用它们的搜索算法来引入流量.但是两者中显然谷歌拥有更大的权力.它如同地主一样统治着互联网的一个关键领域,而时报就相当于那块草地上的佃农.我们的结局从一 ...
- 编译一个支持django及mysqlclient连接的alpine镜像
一切都不难,难的就是在alpine镜像里. 最后,使用了网上编译好mysqlclient的镜像,才搞定. 记录一下. 一,基础镜像Dockerfile https://github.com/tnir/ ...
- %STSADM% -o addsolution -filename AEMediaPlayerWebpart.wsp
SET STSADM="c:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\bin\STSADM. ...
- 微信小程序 - 双线程模型
小程序的双线程模型 官方文档给出的双线程模型: 小程序的宿主环境 微信客户端提供双线程去执行wxml,wxss,js文件. 双线程模型 1.上述的渲染层上面运行着wxml文件,渲染层使用是的webvi ...
- LeetCode3-Longest_Substring_Without_Repeating_Characters
参考思路 https://github.com/azl397985856/leetcode/blob/master/problems/3.longestSubstringWithoutRepeatin ...
- Hbase多条件查询数据(FilterList)
利用Filter进行筛选:HBase的Scan可以通过setFilter方法添加过滤器(Filter),这也是分页.多条件查询的基础.HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBas ...
- VNC远程登陆树莓派3(包括开机启动)
在树莓派上安装VNC需要使用命令行.如果需要远程操作安装VNC,就必须通过SSH登录到命令行界面(Raspbian的默认用户名是:pi,默认密码是:raspberry). 安装 命令行输入: sudo ...
- [LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树
Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- IDEA中SonarLint的安装与使用
一.SonarLint插件的安装 1.1在线安装 (1)在IDEA菜单栏选择File->Settings,左边栏选择Plugins (2)在线安装选择Browse repositories,搜索 ...