万物之父—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);//直接提示空指异常,因为对象被回收
}
}