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
    评论
### 回答1: Object 是 Java 中的根类,是所有类的父类。所有的 Java 类(除了八个基本类型)都继承于 Object 类,因此可以调用 Object 类的方法。例如:toString()、equals()、hashCode() 等。 ### 回答2: jmu-java-03面向对象基础-object 是一门介绍面向对象编程的基础知识的课程。面向对象编程是一种思想,它的目标是把程序中的各个元素抽象成对象,并通过对象之间的交互实现程序的功能,是现代编程语言的主流之一。在这门课程中,学生将学习到对象的定义、类的概念、封装、继承和多态等基本概念和原则。 在面向对象编程中,对象是指具有特定属性和行为的实体,例如一个人、一辆车、一本书等。对象拥有自己的状态和行为,其行为可以通过方法来实现。类是对象的模板,可以看作是一种具有相似特征和行为的对象的集合。在类中,可以定义属性、方法和构造函数等。封装是面向对象编程的一个重要原则,它通过将对象的内部状态信息封装起来,从而实现了信息的隐藏和保护。 继承是指通过继承父类的属性和方法来创建一个新的子类的机制。子类可以继承并扩展父类的行为,从而实现了代码的重用性和可维护性。多态是指不同对象对同一消息做出不同的响应的能力。多态是面向对象编程中的一种普遍机制,它可以让程序具有更好的灵活性和扩展性。 这门课程将通过理论和实践相结合的方式来教授相关知识和技能。学生将通过编写程序来巩固所学内容,并提高编程能力。本门课程是学习Java编程的基础课程,也是后续Java编程课程的前置课程。具备面向对象编程基础的学生,将更容易掌握高级Java编程知识和技能。 ### 回答3: 面向对象编程(Object-Oriented Programming, OOP)是一种编程方式,它基于对象的概念,强调对数据的封装、继承和多态等特性,从而使得程序的结构更加清晰、易于维护和扩展。 OOP中最基本的概念是对象(Object),它是程序中的一个实体,有其自身的状态(state)和行为(behavior)。在Java语言中,对象由类(Class)定义,类是一组具有相同特征和行为的对象的模板。 类通常由属性(fields)和方法(methods)组成,属性可以理解为数据单元,方法则是实现类的动作。例如,一个人(Person)类可以包含属性如姓名、年龄等,方法如呼吸、吃饭等。 封装(Encapsulation)是OOP中的重要概念之一,它指对类的属性和方法进行隐藏和保护,只能通过类提供的公共接口访问。这样能够保证程序的安全性,同时也能够减少程序的耦合度,便于维护和扩展。在Java语言中,可以通过访问修饰符(private、protected、public)来实现封装。 继承(Inheritance)是另一个重要的OOP概念,它允许一个类(子类)从另一个类(父类)继承属性和方法,并在此基础上进行扩展。这样能够避免重复编写代码,同时也能够保持代码的一致性和可读性。在Java语言中,使用关键字extends来实现继承。 多态(Polymorphism)是OOP的另一个重要概念,它指同一个方法调用在不同情况下会产生不同的行为。在Java语言中,通过方法的重载(overloading)和重写(overriding)来实现多态。 总之,面向对象编程已经成为现代软件开发的主流,它使程序的开发更加清晰和高效,也更加适应复杂应用的开发。在学习Java编程的过程中,理解面向对象编程的基本概念,对于学习Java语言和掌握Java编程技能是至关重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值