Java-Object

声明

1)该文章整理自网上的大牛和专家无私奉献的资料,具体引用的资料请看参考文献。
2)本文仅供学术交流,非商用。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。
3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。
4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进添砖加瓦。

类的结构图

在这里插入图片描述

1.Object的构造方法

只有一个构造方法,也就是默认的构造方法,public修饰的无参构造,可以创建Object类的对象

2.registerNatives()方法

private static native void registerNatives();
static {
     registerNatives();
}

含义:本地注册的意思
作用:加载本地方法
分析:
	该方法由static修饰,为静态方法,说明在类加载的时候便会加载
	该方法由private修饰,说明该方法只能在类的内部调用,或通过
	该方法由native修饰,native表示该方法的实现java本身并没有完成,而是有c/c++来完成,形成.dll文件。
	静态代码块,在类加载初始化的时候执行registernatives方法

3.getClass()方法

public final native Class<?> getClass();

作用:获取一个类的定义信息(也就是一个类的class对象),一般用于反射中,通过class对象去访问其全部信息
分析
	native修饰,本地方法
	public修饰,由于object为所有类的父类,所以任何对象都可调用getClass方法
	final修饰,不可被重写

4.hashCode()方法

public native int hashCode();

分析
	public修饰,公共,适合任何对象
	native修饰且无{},没有实现,即调用本地c/c++实现
	返回值int,由数据判断对象是否相同
	没有使用final修饰,说明是可以被重写的
HashCode
	hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值,也就是哈希码
	哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。
	在Java中,哈希码代表对象的特征。
HashCode拓展
	1.Object类的hashCode返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
	2.String类的hashCode根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同
	3.Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,
	//例如: 
		Integer  i1=new Integer(100)//i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。  
	由此可以看出Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的 字段等)映射成一个数值,这个数值称作为散列值。
注意
	一般新建对象的时候最好重写hashcode与equals方法
	两个内容相同,内存地址不同的对象,调用object类中的hashCode方法,返回的hashCode不相同

5.equals(odject obj)方法

public boolean equals(Object obj) {
   return (this == obj);
}
作用
	判断两个对象是否相同
	分析
		public修饰,因为object是所有类的父类,说明,任何对象都会有equals()方法
		返回值为boolean
		形参是Object类型,说明可以为使用任何对象
代码块
	retur (this==obj)

这里this代码调用该方法的对象,obj表示需要判断的对象
这里它们使用的==来进行比较,比较的是两个对象的地址值

注意
	一般来说,在使用的时候,都会进行重写
	一般来说,在重写equals的时候,都会重写hashCode方法
	在eclipse或idea中提供有重写的快捷方式
	如何重写equals方法

@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

6.clone()方法

protected native Object clone() throws CloneNotSupportedException;

protected:表示可以在同类中,或者子类的方法中使用,因为object是所有类的父类,
所以对象如果要使用clone()方法的话,只能重写后才可以使用,例如下,eclipse中有
@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
native:表示java调用非java代码的接口,是一个其他语言实现的方法。
Object:返回值:表示可以返回任何值,所以需要强转


作用:快速克隆出另一个对象
使用
	重写clone()方法
	否则无法调用,因为object中clone方法中protected修饰的
	实现CloneAble()接口
	否则会抛出CloneNotSupporteddException;异常
	使用对象调用clone()方法

7.toString()方法

public String toString() {
   return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
//public:任何对象可以调用
//返回值String:返回一个由 getClass().getName() + "@" + Integer.toHexString(hashCode());
//            组成的一个字符串,实质为  包名(非全限定).类名@十六进制的hashCode值
//参数:无

作用:快速克隆出另一个对象
使用
	重写clone()方法
	否则无法调用,因为object中clone方法中protected修饰的
	实现CloneAble()接口
	否则会抛出CloneNotSupporteddException;异常
	使用对象调用clone()方法
使用
	使用对象直接输出,都会调用toString方法,若对象本身的类没有,则会调用Object类中的toString方法
	一般来说,一个对象都应该重写该方法

8.notify()方法

public final native void notify();

//public:任何对象可调用
//final:不可被重写
//native:调用的是本地实现
//void:无返回值

作用
	随机选择一个使用了wait()方法的线程,赋予其对象锁,并解除其阻塞状态

9.notifyAll()方法

public final native void notifyAll();
//public:任何对象可调用
//final:不可被重写
//native:调用的是本地实现
//void:无返回值

作用
	唤醒在该对象上调用wait()方法等待的所有线程

10.wait(long timeout)方法

public final native void wait(long timeout) throws InterruptedException;

//public:任何对象可调用
//final:不可被重写
//native:调用的是本地实现
//void:无返回值
//参数 long timeout :输入一个long类型的超时时间,毫秒,等待的时间,可选,不填则默认为0。
作用
	使线程主动释放对象锁,并进入等待状态,直到notigy()或者notifyAll()唤醒或超过指定时间指定的等待时间
	在调用wait()方法前,线程获得该对象的对象锁
	wait方法执行前,该对象立即释放持有的对象锁

11.wait(long timeout,int 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);
}
//timeout -- 最大等待时间(毫秒)。
//nanos -- 附加时间在毫微秒范围0-999999。

作用
	进入等待,经过timeout 超时后,若未被唤醒,则自动唤醒。相对wait(long timeout) 更加精确时间。

12.wait()方法

源码

public final void wait() throws InterruptedException {
  wait(0);
}

作用
	直接使该线程进行等待状态

13.finalized()方法

protected void finalize() throws Throwable { }

作用
	在gc回收对象之前执行一些清除操作,比如说一些IO流对象和外部的连接尚未关闭,这个时候如果gc对这个对象		进行回收,那么finalize可以保证这个对象被回收之前其与外部的一些连接正常关闭。
	使用时机
	当jvm内存中的对象已经没有引用指向它的时候,此时GC垃圾回收器会自动调用该对象的finalized()方法
	在GC垃圾回收器,调用某个对象的finalized()方法后,jvm会再一次执行检查该对象是否还存在其他引用
使用方法
	类重写finalized()方法
	对象调用此方法

看源码解答问题

equals() 的作用是什么?
1equals()方法用来比较的是两个对象的内容是否相等

equals()== 的区别是什么?
1equals()方法用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断;
2"==" 比较的是变量()内存中存放的对象的()内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。

hashCode() 的作用是什么?
1:hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;
2:如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;
3:如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;
4:两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。

wait()方法与sleep()方法的区别
https://www.cnblogs.com/loren-Yang/p/7538482.html

为什么重写了equals就必须重写hashCode
https://zhidao.baidu.com/question/646965569075124765.html

关于Hashcode
https://baijiahao.baidu.com/s?id=1561228085482413&wfr=spider&for=pc

HashMap的实现原理
https://www.cnblogs.com/chengxiao/p/6059914.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值