Java常用类:Object类
Object类
- Object是所有类的父类,是继承树的最顶层,所有类默认继承Object,或简介继承Object
- 所有类都具有Object中的定义的方法
- Object类型可以存储任何对象
- 作为参数,可以接受任何对象
- 作为返回值,可以返回任何对象
getClass()
- 返回引用中存储的实际对象类型
- 常用于判断两个引用中实际存储对象类型是否一致
Demo01 stu1 = new Demo01("a",12);
Demo01 stu2 = new Demo01("b",13);
//判断s1和s2是不是一个类型
System.out.println(stu1.getClass().equals(stu2.getClass()));//true
hashCode()
- 用于返回该对象的哈希值
- 哈希值根据对象的地址或字符串或数字使用hash算法出的int类型的数值
- 一般情况下,相同对象返回相同的哈希值
Demo01 stu1 = new Demo01("a",12);
Demo01 stu2 = new Demo01("a",12);
System.out.println(stu1.hashCode());//460141958
System.out.println(stu2.hashCode());//1163157884
Demo01 stu3 = stu1;//stu3和stu1是不同变量指向的相同地址,指向同一个对象
System.out.println(stu3.hashCode());//460141958
stu1
和 stu2
是两个不同的变量指向的不同对象,指向的地址和对象都不相同,虽然内容相同,但哈希值不同;
stu1
和 stu3
是两个不同的变量指向的相同对象,指向的地址也相同,内容相同,哈希值相同。
toString()
- 返回该对象的字符串表示(表现形式)
- 可以根据程序需求重写方法
toString源码:类名+@+hashCode的转换
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
使用测试:输出哈希值为十六进制
System.out.println(stu1.toString());//com.chachan53.class8common.object.Demo01@1b6d3586
System.out.println(stu2.toString());//com.chachan53.class8common.object.Demo01@4554617c
默认toString
- toString是Object的方法,作用是返回当前对象的内存地址
- 对象返回的内容与toString返回的内容相同,重写toString可以改变对象返回的内容
Day d = new Day();//Day为简单测试类
System.out.println(d.toString());
System.out.println(d);
输出结果同为该对象的地址(哈希值)
com.chachan53.pack.Day@1b6d3586
com.chachan53.pack.Day@1b6d3586
重写toString
- 在简单测试类中对toString进行重写,输出类的其他信息
class Day{
public int day;
//有参构造器
public Day(int day) {
this.day = day;
}
//对toString进行重写,使其输出内容为day
@Override
public String toString() {
return "day=" + day ;
}
}
应用测试
public class demo02 {
public static void main(String[] args) {
//toString
Day d = new Day(7);
System.out.println(d.toString());
System.out.println(d);
}
}
//运行结果======================================
day=7
day=7
equals()
- 比较两个参数指向的地址是否相同
this == obj
,判断是否为同一对象 - 可以进行重写,修改比较内容
Demo01 stu1 = new Demo01("a",12);
Demo01 stu2 = new Demo01("a",12);
System.out.println(stu1.equals(stu2));//false
System.out.println(stu1.equals(stu3));//true
默认比较地址,即使内容相同,指向不同对象,也判断为true
重写equals()为比较属性
- 比较两个引用是否指向同一个对象
- 判断obj是否为null
- 判断两个引用指向的实际对象类型是否一致:
getClass()
和instanceof
都是判断变量指向对象的类型是否相等 - 强制类型转换:在3中所得到的一致类可能是多态的类,因此对其进行强制转换
- 依次比较各个属性值是否相同
@Override
public boolean equals(Object obj) {
//1. 判断两个对象是否是同一个引用
if(this == obj){ return true; }
//2. 判断obj是否为null
if(obj == null){ return false; }
//3. 判断是否为同一个类型
//instanceof判断对象是否为某种类,判断是否有继承关系
if(obj instanceof Demo01){
//4. 强制类型转换
Demo01 s = (Demo01)obj;
//5. 比较属性
if(this.name.equals(s.getName()) && this.age == s.getAge()){
return true;
}
}
return false;
}
重写后:属性相同的比较结果为 true
Demo01 stu1 = new Demo01("a",12);
Demo01 stu2 = new Demo01("a",12);
System.out.println(stu1.equals(stu2));//true
System.out.println(stu1.equals(stu3));//true
finalize()
- 当对象被判定为垃圾对象是,JVM自动调用此方法,用以标记垃圾对象,进入回收队列
- 垃圾对象:没用有效引用指向此对象
- 垃圾回收:由GC销毁垃圾对象,释放数据存储空间
- 自动回收机制:JVM内存耗尽,一次性回收所有垃圾对象
- 手动回收机制:使用
System.gc()
,通知JVM执行垃圾回收