java jdk Object源码理解

java.lang.Object
Native:
使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了.DLL,由java去调用。
Java中,用native关键字修饰的函数表明该方法的实现并不是在Java中去完成,而是由C/C++去完成,并被编译成了.dll,由Java去调用。
所以native关键字的函数都是操作系统实现的,
java只能调用。
java是跨平台的语言,既然是跨了平台,所付出的代价就是牺牲一些对底层的控制,而java要实现对底层的控制,就需要一些其他语言的帮助,这个就是native的作用了。
https://www.cnblogs.com/KingIceMou/p/7239668.html
Class<?> getClass():
返回值是Class类型,Class c = obj.getClass(); 通过对象c,我们可以获取该对象的所有成员方法,每个成员方法都是一个Method对象;我们也可以获取该对象的所有成员变量,每个成员变量都是一个Field对象;同样的,我们也可以获取该对象的构造函数,构造函数则是一个Constructor对象
通过这个方法可以获得该类的类型信息,其实就是类型名,但这个是类型时运行时的类型.
getClass方法,有多态能力,运行时可以返回子类的类型信息,
.class是没有多态的,是静态解析的,编译时可以确定类型信息。
用这个方法就可以获得一个实例的类型类。类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例。
https://www.cnblogs.com/wsw-bk/p/8026266.html
Int hashCode():
1:返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
2:不同对象的,hashCode()一般来说不会相同。但是,同一个对象的hashCode()值肯定相同。
Integer.toHexString(ClassUtil.hashCode())==new ClassUtil()==toString()
通过这个方法可以获得该对象的哈希码,如果不重写的话也可以调用,系统会帮你用默认方法生成一个.如果想提高性能的话也可以自己重写
如果要进行重写从而提高性能的话建议一定要把equals方法一起重写,以防出现不符合规则的情况出现,从而导致无法意料的错误产生.
Boolean equals(Object obj):
只要两个对象内存地址不一样,那么equals()一定返回false
Object clone():
clone()的正确调用是需要实现Cloneable接口,如果没有实现Cloneable接口,并且子类直接调用Object类的clone()方法,则会抛出CloneNotSupportedException异常。
Cloneable接口仅是一个表示接口,接口本身不包含任何方法,用来指示Object.clone()可以合法的被子类引用所调用。
clone()方法是浅拷贝,复制得到的新对象对该引用类型属性内容进行修改,原始对象响应的属性内容也会发生变化,这就是"浅拷贝"的现象。
浅拷贝(Shallow Copy):①对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。②对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值。
浅拷贝的实现方式主要有:
通过拷贝构造方法实现浅拷贝:
通过重写clone()方法进行浅拷贝:
深拷贝:首先介绍对象图的概念。设想一下,一个类有一个对象,其成员变量中又有一个对象,该对象指向另一个对象,另一个对象又指向另一个对象,直到一个确定的实例。这就形成了对象图。那么,对于深拷贝来说,不仅要复制对象的所有基本数据类型的成员变量值,还要为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象图进行拷贝!
简单地说,深拷贝对引用数据类型的成员变量的对象图中所有的对象都开辟了内存空间;而浅拷贝只是传递地址指向,新的对象并没有对引用数据类型创建内存空间。
深拷贝的实现方法主要有两种:
通过重写clone方法来实现深拷贝
通过对象序列化实现深拷贝
深拷贝不会改变原来值。
String toString():
getClass()返回对象的类对象,getClassName()以String形式返回类对象的名称(含包名)。Integer.toHexString(hashCode())则是以对象的哈希码为实参,以16进制无符号整数形式返回此哈希码的字符串表示形式。
String toHexString(int i):
此方法返回的字符串表示的无符号整数参数所表示的值以十六进制(基数为16).
int numberOfLeadingZeros(int i):
返回二进制首部开始0的个数
因为123的二进制是 0000 0000 0000 0000 0000 0000 0111 1011。数一数前面有多少个0
https://www.jianshu.com/p/2d69c3cad58b
void notify():
唤醒一个正在这个对象监视器上等待的线程
void notifyAll():
唤醒所有等待的线程
void wait(long timeout):
让当前线程等待直到另外一个线程调用对象的notify或notifyAll方法,可能抛出InterruptedException异常
这个方法一般是和notify或者notifyAll方法配合使用的,这个方法会让当前的线程进入等待状态,直到调用那两个方法后恢复,或者等到超时自动恢复,如果想设置不唤醒的话一直等到天荒地老可以试试传入0.
要注意一下,线程有时候还会唤醒一个所谓的虚假唤醒(spurious wakeup).虽然很少发生,但也应该预防一下,比如将等待放在while循环当中,只要不满足条件就再通知一遍进入休眠.
同样,这个方法和notify,notifyAll一样要与synchronized一起用,详情请看notify里的介绍
void wait(long timeout, int nanos):
实际上还是调用的上一个方法,所以功能看上面那个方法就好了.
void wait():
天荒地老版的wait方法
void finalize():
…?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值