java中的Object类

Object类

Object(类)
	public int hashCode()
	public final Class getClass()
	public String toString()
	public boolean equals(Object obj)

API概述以及Object类的概述

A:API(Application Programming Interface) 
	应用程序编程接口
B:Java API
	就是Java提供给我们使用的类,这些类将底层的实现封装了起来,
	我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。
C:Object类概述
	类层次结构的根类
	所有类都直接或者间接的继承自该类
D:构造方法
	public Object()
	子类的构造方法默认访问的是父类的无参构造方法

Object类的hashCode()方法

	public int hashCode()
		a:返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
		b:不同对象的,hashCode()一般来说不会相同。
	  	   但是,同一个对象的hashCode()值肯定相同。
		c:不是对象的实际地址值,可以理解为逻辑地址值。	

Object类的getClass()方法

	public final Class getClass()
		a:返回此 Object 的运行时类。
		b:可以通过Class类中的一个方法,获取对象的真实类的全名称。	
		public String getName()

Object类的toString()方法

	public String toString()
	a:返回该对象的字符串表示。
		源代码:
		 	public String toString() {
   					 return getClass().getName() + "@" + Integer.toHexString(hashCode());
				}
	b:它的值等于: 
		getClass().getName() + '@' + Integer.toHexString(hashCode()) 
	c:由于默认情况下的数据对我们来说没有意义,一般建议重写该方法。
	  怎么重写, 一般是将该类的所有的成员变量组成返回即可

Object类的equals()方法

	a:指示其他某个对象是否与此对象“相等”。 
		源代码: 	
				public boolean equals(Object obj) {
    					return (this == obj);
				}
	b:默认情况下比较的是对象的引用是否相同。
	c:由于比较对象的引用没有意义,一般建议重写该方法。一般用于比较成员变量的值是否相等

Object类的equals()方法代码优化

Object类的equals()方法代码优化
		a: 提高效率
		b: 提高健壮性(instanceof)	
equals 方法在非空对象引用上实现相等关系: 
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。 
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。 
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。 
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。 
对于任何非空引用值 x,x.equals(null) 都应返回 false。 
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 

Object类的clone() 方法

clone()的权限修饰符是受保护的,在用的时候,让该类重写该方法,并把该方法的权限修饰符改为public
 	对象的克隆:浅克隆和深克隆
​	使用clone()方法采用的是浅克隆的方式
 	对象浅克隆要注意的细节: 
    		1. 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
    		2. Cloneable接口只不过是一个标识接口而已,没有任何方法。
    		3. 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。
    		4. 对象的浅克隆也不会调用到构造方法的。
	/*
	 浅克隆示例
	 */
	import java.util.zip.DeflaterOutputStream;
	
	public class MyTest {
	    public static void main(String[] args) throws CloneNotSupportedException {
	        //创建一个狗粮类对象
	        DogFood dogFood = new DogFood("双汇王中王");
	        Dog dog = new Dog("小白", 23, dogFood);
	        dog.dogFood.name="金锣火腿肠";
	        //克隆狗对象
	        Dog dog2= (Dog) dog.clone();
	         dog2.name="旺财";
	         dog2.age=4;
	         dog2.dogFood.name = "泡面搭档火腿肠";
	
	        System.out.println("--------------------");
	        System.out.println(dog.name);
	        System.out.println(dog.age);
	        System.out.println(dog.dogFood.name); //泡面搭档火腿肠
	        System.out.println("--------------------");
	        System.out.println(dog2.name);
	        System.out.println(dog2.age);
	        System.out.println(dog2.dogFood.name); // 泡面搭档火腿肠
	    }
	}
	
	class Dog implements Cloneable{
	    String name;
	    int age;
	    //在这个Dog类里面维护着另一个类的对象
	    DogFood dogFood;
	
	    public Dog(String name, int age, DogFood dogFood) {
	        this.name = name;
	        this.age = age;
	        this.dogFood = dogFood;
	    }
	    public Object clone() throws CloneNotSupportedException {
	        return super.clone();
	    }
	}
	
	class DogFood{
	    String name;
	
	    public DogFood(String name) {
	        this.name = name;
	    }
	}
 	对象的深克隆:
 		采用IO流来实现  使用 ObjectOutputStream 将对象写入文件中,然后再用ObjectInputStream读取回来。
 		对象的深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
 		也就是c克隆出来的是一个全新的对象,引用地址不同,但是内容相同(跟新new对象进行相同赋值效果一样)。
 	下一篇文章将详述java中的深克隆
 		
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值