万物之父—Object类

1.Object类的应用

1.1.Object作为参数

Object作为参数可以接受任何类型的对象。包括基本数据类型、引用数据类型。

1.2.Object作为返回值

Object作为返回值可以返回任意类型的值

无论作为哪种情况,都最好在特定的场景下才使用,不然对参数的处理比较麻烦

//Object类:所有类的父类或间接父类

public class ObjectTest {
	public static void main(String[] args) {
		//test1(new Integer(20));
		test1('a');
		System.out.println(test2(8));
	}
	
	//Object作为参数,可以接受任何类型的对象.基本数据类型、引用数据类型等等都可以
	//一定要在必要的场景下才使用这种,因为这样对于参数的处理非常麻烦
	public static void test1(Object obj) {
		/*Integer i=(Integer)obj;
		System.out.println(i);*/
		char ch=(char) obj;
		System.out.println(ch);
		//System.out.println(obj);
	}
	
	//object作为返回值,可以返回任意类型的值
	//也要在特定的场景下使用
	public static Object test2(int number) {
		if(number%5==0) {
			return 23;
		}
		else if(number%5==1) {
			return "hello java";
		}
		else if(number%5==2) {
			return 'h';
		}
		else if(number%5==3) {
			return new Object();
		}
		else {
			return  new Integer(29);
		}
	}
}
2.Object方法----getClass()

2.1.含义:

返回引用中存储的实际对象类型

2.2.应用:

通常用于判断两个引用中实际存储的对象类型是否一样

//getClass():获取对象的类全名
//通常用于判断两个引用中实际存储 "对象类型" 是否一样

public class ObjectGetClass {
	public static void main(String[] args) {
		Object obj1=new Person();
		Object obj2="abc";
		Object obj3=100;
		Object obj4=true;
		Object obj5="afaf";
		Object obj6=new Person();
		
		//obj1.getClass():意思就是得到这个具体的Person.class文件在java里面代表的对象
		
		System.out.println(obj1.getClass());//class com.qianfeng.kxf.day21.object.Person
		System.out.println(obj2.getClass());//class java.lang.String
		System.out.println(obj3.getClass());//class java.lang.Integer
		System.out.println(obj4.getClass());//class java.lang.Boolean
		System.out.println(obj5.getClass()==obj2.getClass());//true,都是String类型
		System.out.println(obj1.getClass()==obj6.getClass());//true,都是Person类型
		
		//jdk提供的Class对象,代表的就是所有的.class文件
		Class cls=obj1.getClass();//cls就是一个具体对象
		System.out.println(cls);//class com.qianfeng.kxf.day21.object.Person

	}
}
3.Object方法—hashCode()

3.1.含义

返回该对象的十六进制的哈希码值。是根据对象的 地址 、字符串、 数字 计算出来的int类型的数值

3.2.特点

a.对象只要有一个bit不一致,结果的哈希码就跟以前的不一样

b.相同的对象,返回的哈希码一定是一样的。

c.相同的哈希码,可能对应的对象不一样。概率小(哈希碰撞)

3.3.应用

通常用于判断两个对象是不是同一个。

/*hash:就是把一个物件经过一系列的算法,得到一串整形的数字
 * 哈希码:返回该对象的16进制的哈希码值.只要有一个bit不一致,结果就一定和上次不一样
 * 哈希算法是根据对象的'地址'、'字符串'、'数字' 计算出来的int类型数值
 * 
 * 相同的对象,返回的哈希码一定一样。
 * 不同的对象,可能返回的哈希码一样。(概率小)(hash碰撞)
 * 
 *常用来判断两个物件是不是同一个
 * public int hashCode(){}
 */

public class ObjectHashCode {
	public static void main(String[] args) {
		Object obj1=new Person();
		Object obj2=new Person();//obj1和obj2的地址不一样,hashcode就不一样
		Object obj3="abc";
		Object obj4="abc";
		Object obj33="abcd";
		Object obj5=100;
		Object obj6=100;
		
		System.out.println(obj1.hashCode());//366712642
		System.out.println(obj2.hashCode());//1829164700
		
		System.out.println(obj3.hashCode());//96354
		System.out.println(obj4.hashCode());//96354
		System.out.println(obj33.hashCode());//2987074
		
		System.out.println(obj5.hashCode());//100
		System.out.println(obj6.hashCode());//100
	}
}
4.Object类方法—toString()

4.1.含义:

返回该对象的字符串表现(地址)

4.2特点

a.返回的结果:当前对象全类名+@+对象在堆里面的地址结果hash以后的数值

b.对数组进行打印,会在开头加多 【 符号

c.打印的时候jvm会自动默认调用toString()方法

d.可以重写toString()方法。例如打印实体类型的属性

import java.util.Arrays;

//toString():返回该对象的字符串表现形式(地址)
//可以重写toString
/*
 * Object打印结果
 * 1.当前对象的全类名
 * 2.@
 * 3.当前对象在堆里面的地址经过hash以后的数字
 */

public class ObjectToString {
	public static void main(String[] args) {
		Object obj1=new Person();
		Object obj2="abc";
		Object obj3=123;
		Object obj4=new Person("kxf");
		
		int[] nums=new int[] {3,2,4,5};
		String[] str=new String[4];
		Object[] obj=new Object[4];
		
		System.out.println(nums.toString());//[I@15db9742
		System.out.println(str);//[Ljava.lang.String;@6d06d69c
		System.out.println(obj);//[Ljava.lang.Object;@7852e922
		//对数组进行打印的结果会在开头加上 [
		System.out.println("打印数组的字符串表现形式:"+Arrays.toString(nums));//打印数组的字符串表现形式:[3, 2, 4, 5]
		System.out.println(Arrays.toString(nums).length());//12
		
		//两个结果一模一样.因为对象在打印输出的时候会默认调用toString()方法
		//重写toString()方法之前,默认调用Object类的toString方法
//		System.out.println(obj1);//com.qianfeng.kxf.day21.object.Person@15db9742
//		System.out.println(obj1.toString());//com.qianfeng.kxf.day21.object.Person@15db9742
		
		//重写了之后,调用Person类中自定义的toString()方法
		System.out.println(obj1);//Person [name=null]
		System.out.println(obj1.toString());//Person [name=null]
		System.out.println(obj4.toString());//Person [name=kxf]

		
	}
}
5.Object类方法—equals()

5.1.含义

比较两个对象的地址是否相同。默认实现为(this==obj)

5.2.特点

a.object类中该方法默认比较的是对象的地址而不是值,相当于 ==

b.可以重写equals()方法,重写之后比较的是两个对象的 值。

//public boolean equals(Object obj)方法:
/*
 * 在Object类中,该方法默认比较的是对象的地址(this==obj),而不是值.
 * 经过重写之后比较的是值
 */

public class ObjectEquals {
	public static void main(String[] args) {
		Object obj1=new Person();
		Object obj2="abc";
		Object obj3="abc";
		Object obj33=new String("abc");
		Object obj4=200;
		Object obj5=new Person();
		
		//System.out.println(obj1.equals(obj5));//重写toString方法之前,调用的是Object类的.false
		System.out.println(obj2.equals(obj3));//true 重写之前或之后都是true,因为两个都是指向常量池中的同一个
		System.out.println(obj3.equals(obj33));//true 使用的是string的equalse,比较 是值
		//重写toString()之后,true
		System.out.println(obj1.equals(obj5));//true
	}
}
6.Object类方法—finalize()

6.1.含义

将对象添加到垃圾回收队列

6.2.特点

a.当对象被判定为垃圾对象时,由JVM自动调用此方法,标记为垃圾对象,进入回收队列

b.注意当该方法执行后,该对象只是被添加到回收队列,还没有被回收。

6.3什么是垃圾对象?

当对象没有有效引用时,就是垃圾对象

6.4.什么是垃圾回收?

由GC(垃圾回收器)销毁垃圾对象,释放存储空间(真正的销毁)

6.5回收机制

a.自动回收机制:JVM的内存消耗干净,一次性回收所有垃圾对象

b.手动回收机制:使用System.gc();方法,通过JVM执行垃圾回收

public class ObjectFinalize {
	public static void main(String[] args) {
		Person p=new Person();
		//使用p对象干活,干完活就设置为空
		//p=null;
		System.out.println(p.name);//直接提示空指异常,因为对象被回收
	}
}