你知道java的Object对象里面都包含什么吗?
Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java中最基本的类java.lang.Object开始谈起。
Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入。Object类没有定义属性,一共有13个方法,具体的类定义结构如下图:
idea :alt+7
其主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。
private static native void registerNatives();
static {
registerNatives();
}
*返回这个{@code对象}的运行时类。返回的
- {@code类}对象是被{@code锁定的对象 (效果与Object.class相同。)
被表示类的静态同步}方法。
public final native Class<?> getClass();
对象重写euqase方法必须重写hashcode方法
/**
*
-
* 原则1:一致性————多次调用同一个对象的这个方法,返回的值一样
- 2、如果2个对象equals为true, 那么它们的hashCode为一样的值
- 3、不过如果2个对象equals为false, 那么hashCode也可能为一样的值
-
* 开发者应该注意:先使用hashCode进行筛选,可以提高哈希表的性能
-
4、尽可能合理地定义这个方法
-
* 有些类: 不同的对象(内存地址),哈希码不同;
-
* 有些类: 不同的内容, 哈希码不同
-
* 根据我们的需要决定是否重写方法,有以上两种情况,不过不管是哪种情况,根据以上第二、三点,
-
* 在使用时,(1)我们先用HashCode方法比较两个对象的哈希值是否相等,若不等,则一定不是同一个
-
* 对象or内容相同;反之,进第二步判断
-
*(2)再用equals方法比较两个对象是否为同一个对象or内容是否相同,若返回结果为true,则同一个
-
*对象or内容相同
-
*之所以按照这个规则,我想大概基于两点:i、hashCode其实是将地址or内容采用一种算法进行映射得
-
*到一种编码,而equals则是直接比较两个对象的地址or内容是否相同。 所以,hashCode存在冲突的
-
*现象————内容or地址不同的2个对象,hashCode值相同 ii、尽管equals是直接比较,但是其消耗较大
-
*所以,先用hashCode有助于提高性能,筛选掉大部分情况(毕竟冲突时小概率事件)
- @return
*/
public native int hashCode();
/**
注意是非空对象的等价关系,也就是说,null不能调用
- 性质1、反射性--任何 非空引用 调用自身,返回结果都是true
- 2、 对称性--两个引用 互相调用,返回结果一样
- 3、 传递性
4、 一致性--两个对象之间的调用 多少次还是那个结果 前提是没有信息被修改 - 5、 任意非空引用 调用null 返回的都是false
-
- 不管equals方法有没有重写,我们都要重写hashCode方法
-
*从而保证————equal的对象(无重写:内存地址相同,指向同一个对象;有重写:内容相同)
-
*具有相同的hashCode值:for 地址or 内容的各个位 + hashCode算法 ==得到 相同的值
*/
public boolean equals(Object obj) {
return (this == obj); // 比较的是两个对象的内存地址
// 前面总是说reference object,也就是引用型数据,而不是基本类型数据(比较简单)
//基本数据类型一般都是用 ==
}
/**
- (1)clone方法是产生对象的一个独立副本
- (2)对象x和它clone的独立副本 调用getClass方法 结果一样
-
* 但这些不是绝对的条件(意思是clone可以重写吗?)
-
* x的clone副本 和 自己 equal 但是不是绝对的(意思是如果equal的是地址的话就不一定?)
-
按照惯例,返回的对象应该通过super.clone调用得到
-
*如果一个类和它所有父类遵循这个惯例,那么x.clone().getClass() == x.getClass()
-
按照惯例,返回的对象是独立的
-
*为了实现这个独立性,返回副本之前 有必要修改这个对象的一个or多个元素
-
*通常,这意味着复制组成这个对象深层结构的所有可变元素,并用副本的引用替换这些元素的引用
-
*如果一个类只包含原始字段、不可变元素的引用,那么super.clone返回的对象 没有字段需要修改
-
*大概意思: 浅拷贝 只复制引用的值,没有复制可变元素所引用的对象
*/
protected native Object clone() throws CloneNotSupportedException;
深克隆与浅克隆
/**
-
*返回这个对象的 字符串表示
-
*建议所有子类重写此方法
-
返回的字符串包括:类的名字、@、对象的16进制表示的哈希值
- @return
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
/**
- 唤醒在这个对象的监视器上的 一个等待线程
-
*如果有线程在等待队列中等待(通过调用wait方法,一个线程在对象的监视器上等待),其中的一个
-
*被选中唤醒。这种选择是任意的,根据算法进行竞争(最着急的线程)
-
唤醒的线程将无法继续(被其他对象使用?在等待) 直到当前线程放弃对这个对象的锁定
-
*被唤醒的线程 以通用的方式 与任何其他(积极竞争同步这个对象的)线程竞争
-
*同步,是说没有特权,都有机会成为能够锁定该对象的线程
-
这个方法只能被一个线程(这个线程是 对象的监视器的所有者)调用
-
*一个线程可以以3种方式 成为这个对象的监视器的所有者
-
1、在调用notify()之前,线程必须获得该对象的对象级别锁
-
* 2、执行完notify()方法后,不会马上释放锁,要直到退出synchronized代码块,当前线程才会释放
-
*锁
-
* 3、notify()一次只随机通知一个线程进行唤醒
-
原则:一次只能有一个线程 拥有一个对象的监视器
-
如果当前线程 不是这个对象的monitor的所有者,抛出IllegalMonitorStateException
*/
public final native void notify();
//唤醒所有 等待在这个对象的监视器上的线程
public final native void notifyAll();
//实现二:使线程进入等待状态,直到被notify or notifyAll调用
public final native void wait(long timeout) throws InterruptedException;
//第一种实现:使线程进入等待状态,直到被notify or notifyAll调用 or 等待时间达到限定值
//timeout - 要等待的最长时间(以毫秒为单位)。
//nanos - 额外时间(以毫微秒为单位,范围是 0-999999)
//超时时间=1000000*timeout+nanos(毫微秒)。
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);
}
//实现二:使线程进入等待状态,直到被notify or notifyAll调用
public final void wait() throws InterruptedException {
wait(0);
}
//当垃圾回收器将要回收对象所占内存之前被调用
protected void finalize() throws Throwable { }
---------------------------------------------------------------------------
国之殇,未敢忘!
南京大屠杀!
731部队!
以及核污染水排海等一系列全无人性的操作,购买他们的食品和为它们提供帮助只会更加变本加厉的害你,呼吁大家不要购买日本相关产品
昭昭前事,惕惕后人
吾辈当自强,方使国不受他人之侮!
---------------------------------------------------------------------------
作者:三号小玩家
出处:https://www.cnblogs.com/q1359720840/
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。 版权信息