java.lang.Object
所有类都直接或间接继承该类
1、类结构
public class Object
2、native
native方法:指非Java语言写的方法,一般是系统提供的,对底层进行直接操作。由关键字native声明,jvm进行调用。
(除非是开始系统深入学习虚拟机,否则很难,也没有必要学习native的实现)
private static native void registerNatives();
static {
registerNatives();
}
registerNatives方法具体做什么暂时不用研究,按名字大概是对本类中的native方法进行注册
该方法出现的类一定有其它native方法,比如java.lang.System。
而包含native方法的类也可能没有该方法,比如java.lang.String。
3、构造方法
只有默认的构造方法
4、 其它方法
(1)克隆
protected native Object clone() throws CloneNotSupportedException;
对象克隆,需要实现java.lang.Cloneable
接口,然后重写Object的clone方法。
浅拷贝:只是创建新的对象,对象属性是原对象的属性
深拷贝:不仅创建新的对象,同时对原属性也进行创建。
第三种方案:不实现java.lang.Cloneable,而是实现java.io.Serializable接口完成深拷贝
(2)等于
==:
- 不能判断基本数据类型和一个引用数据类型
- 判断两个引用数据类型是判断地址
- 判断两个基本数据类型是判断值
- 同时boolean类型不能和其它基本类型比较
public boolean equals(Object obj) {
return (this == obj);
}
- 只有非null的引用数据类型对象才能调用equas方法
- this指代本类的当前对象
比较的几个准则:
- 自反性:a.equals(b)为true,反之b.equals(a)也为true,false是一样的,obj为null除外。
- 传递性:a.equals(b)为true,b.equals(c)为true,则a.equals(c)也为true
- 持久性:只要本身没有发生改变,a.equals(b)的结果应该一直不变
- a.equals(b),b为null则结果为false
在子类重写equals方法时也应该遵守这几条规则。
(3)finalize完成
protected void finalize() throws Throwable { }
是手动进行资源回收的,慎用。
在Java11被废弃
(4)hash码
public native int hashCode();
哈希算法:指一种算法模型,具体由其它算法实现,比如md4,md5。
该算法是单向的,即只能加密而无法解密。
哈希算法是将一个不定长度的数据映射成一个固定长度的数据,结果即为哈希码。根据哈希码无法求得原值。
相同对象的哈希码一定相同,不同对象的哈希码也可能相同。
实际上,哈希码不是完全无法取得原值,有人将常用文本映射成哈希码做成一张表,通过查询哈希码,能够得到一组原值。但是无法准确求得,也保证原值一定在这组数据之中。
Java的Object对象的哈希码是通过地址相关来求得的。
(5)获取Class对象
public final native Class<?> getClass();
Class类对象是在类加载的时候由虚拟机创建的,唯一。
Student student = new Student();
student.setName("张三");
Student student1 = new Student();
System.out.println(student1.getClass() == student.getClass());
结果为true
(6)toString
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
输出对象的Class类名和哈希码的十六进制字符串。
(7)wait
public final void wait() throws InterruptedException {
wait(0);
}
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
wait:让当前线程进入等待状态(挂起),同时释放当前线程持有的锁。直到其它线程调用此对象的notify或notifyAll方法,该线程被唤醒进入就绪状态。
wait():立即挂起
wait(long timeout):单位毫秒
wait(long timeout, int nanos):毫秒,纳秒
(8)notify、notifyAll
public final native void notify();
public final native void notifyAll();
唤醒
唤醒所有