object类常见方法
/*** native 方法,用于返回当前运行时对象的 Class 对象,使用了 final 关键字修饰,故不允许子类重写。*/
public final native Class<?> getClass()
/*** native 方法,用于返回对象的哈希码,主要使用在哈希表中,比如 JDK 中的HashMap。*/
public native int hashCode()
/*** 用于比较 2 个对象的内存地址是否相等,String 类对该方法进行了重写以用于比较字符串的值是否相等。*/
public boolean equals(Object obj)
/*** native 方法,用于创建并返回当前对象的一份拷贝。*/
protected native Object clone() throws CloneNotSupportedException
/*** 返回类的名字实例的哈希码的 16 进制的字符串。建议 Object 所有的子类都重写这个方法。*/
public String toString()
/*** native 方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个。*/
public final native void notify()
/*** native 方法,并且不能重写。跟 notify 一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程。*/
public final native void notifyAll()
/*** native方法,并且不能重写。暂停线程的执行。注意:sleep 方法没有释放锁,而 wait 方法释放了锁 ,timeout 是等待时间。*/
public final native void wait(long timeout) throws InterruptedException
/*** 多了 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒。。*/
public final void wait(long timeout, int nanos) throws InterruptedException
/*** 跟之前的2个wait方法一样,只不过该方法一直等待,没有超时时间这个概念*/
public final void wait() throws InterruptedException
/*** 实例被垃圾回收器回收的时候触发的操作*/
protected void finalize() throws Throwable { }
解读:
- 被final修饰的类表示不可改变,因为所有的类都属于object类的子类,所以所有类都不能重写被final修饰的方法。
- 在Java中,
native
是一个方法修饰符关键字,用于表示该方法的实现不是用Java编写的,而是用其他语言(如C或C++)编写的本地代码。这些方法通过Java本地接口(JNI)与Java虚拟机交互
Java中的值传递
基本数据类型传递:修改方法内的基本类型参数不会影响原始值。
引用数据类型传递:修改方法内的引用类型参数(例如数组或对象)会影响原始对象,因为副本和原始引用指向同一个对象。但是,如果尝试改变引用本身(即让副本引用另一个对象),则不会影响原始引用。对于引用类型,传递的是引用的副本(内存地址的副本)简单说:拷贝了钥匙,但开的还是同一把锁。 但正是因为传递的是内存地址的副本,再次对引用对象赋值时却不会改变引用本身。
==与equals()方法
- 对于基本数据类型来说,
==
比较的是值。 - 对于引用数据类型来说,
==
比较的是对象的内存地址。
因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
object类的equals方法
public boolean equals(Object obj) {return (this == obj);
}
- 没有重写equals方法时,equals方法就是==
重写后的equals方法
String
中的 equals
方法是被重写过的,因为 Object
的 equals
方法是比较的对象的内存地址,而 String
的 equals
方法比较的是对象的值。
当创建 String
类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String
对象。
public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;
}
解读:
先比较地址:
if (this == anObject)
→ 如果是同一个对象,直接返回true (这一步是优化)检查类型:
if (anObject instanceof String)
→ 如果不是String类型,直接返回false比较长度:
if (n == anotherString.value.length)
→ 长度不同直接返回false逐字符比较:
while
循环逐个比较字符,有任何不同就返回false全部相同:所有字符都相同,返回true
小结:
本篇博客主要介绍了object类和它的重要方法,同时介绍了Java中的值传递,进而引出equals方法,在后面解读源码时,我们还会讲一讲它和hashcode()的难解难分。希望能带给你启发!