JavaSE Object类

一、Object

  • Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入
  • 任何一个类默认继承Object,就算没有直接继承,最终也会间接继承
  • Object类是所有Java类的祖先,每个类都使用 Object 作为超类,所有对象(包括数组)都实现这个类的方法。可以使用类型为Object的变量指向任意类型的对象
  • 什么是API
    API即应用程序编程接口,(Application Program Interface),整个JDK的类库就是一个JavaSE的API,SUN公司提前写好的这套类库就是API,一般每一个API都会配置一套API帮助文档

二、toString()

  • 源码
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

源码上toString()方法的默认实现:
类名@对象的内存地址转换为十六进制的形式

  • toString()的作用
    通过调用这个方法可以将一个“Java对象”转换成“字符串表现形式”
  • SUN公司开发Java语言的时候,建议所有的子类都重写toString()方法
  • System.out.println(引用); 这里会自动调用“引用”的toString()方法
  • String类已经重写了toString()方法

三、equals()

  • 源码
public boolean equals(Object obj) {
	return (this == obj);
}
  • equals() 的作用
    判断两个对象是否相等(基本数据类型比较时用:==;引用数据类型比较时用:equals方法)
  • 所有类的equals方法也需要重写,因为Object中的equals方法比较的是两个对象的内存地址,且重写equals方法的时候要彻底
  • String类已经重写了equals() 方法,比较两个字符串不能使用“==”,必须使用equals()

3.1 equals() 与 ==

  • == :它的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)
  • equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
    情况 1:类没有重写 equals() 方法。通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象;
    情况 2:类重写了 equals() 方法。一般,通过重写 equals() 方法来判断两个对象的内容相等;若它们的内容相等,则返回 true (即认为这两个对象相等)。

四、finalize

  • 源码(since=“9”)
protected void finalize() throws Throwable {}

finalize()方法只有一个方法体,里面没有代码,并且这个方法由protected修饰
此方法不需要程序员手动调用,JVM的垃圾回收器负责调用这个方法,finalize()只需要重写

  • finalize()方法的执行时机
    当一个Java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用finalize()方法,finalize()方法实际上是SUN公司为Java程序员准备的一个时机——垃圾销毁时机,如果希望在对象销毁时机执行一段代码当作记录的话,这段代码要写到finalize()方法当中
  • Java中的垃圾回收器不是轻易启动的,垃圾太少,或者时间没到等种种条件下,有可能启动,也有可能不启动

五、hashCode

  • 源码
public native int hashCode();

这个方法不是抽象方法,带有native关键字,底层调用C++程序

  • hashCode()方法返回的是哈希码:
    实际上就是一个Java对象的内存地址,经过哈希算法,得出的一个值,所以hashCode()方法的执行结果可以等同看做一个Java对象的内存地址
public class Test01 {
	public static void main(String[] args) {
		Object o = new Object();
		int hashCodeValue = o.hashCode();

		// 对象内存地址经过哈希算法转换的一个数字,可以等同看做内存地址
		System.out.println(hashCodeValue); // 366712642

		MyClass mc = new MyClass();
		int hashCodeValue2 = mc.hashCode();
		System.out.println(hashCodeValue2); // 1829164700

		MyClass mc2 = new MyClass();
		System.out.println(mc2.hashCode()); // 2018699554
	}
}

class MyClass {
}

六、clone

  • 浅克隆:拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象
  • 深克隆:不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象(就是把被克隆对象的实例变量中引用数据类型所指向的对象再new一遍)
  • 引用:
    1.浅克隆:只复制基本类型的数据,引用类型的数据只复制了引用的地址,引用的对象并没有复制,在新的对象中修改引用类型的数据会影响原对象中的引用
    2.深克隆:是在引用类型的类中也实现了clone,是clone的嵌套,复制后的对象与原对象之间完全不会影响
    3.使用序列化也能完成深克隆的功能:对象序列化后写入流中,此时也就不存在引用什么的概念了,再从流中读取,生成新的对象,新对象和原对象之间也是完全互不影响的
    4.使用clone实现的深克隆其实是浅克隆中嵌套了浅克隆,与toString方法类似
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jayco江柯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值