Object类 —getClass() ,hashCode(),toString(),equals(),finalize()

Java学习基础知识思维导图

Object类

  • 超类、基类,所有类的直接或间接父类,位于继承树的最顶层
  • 任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承
  • Object类中所定义的方法,是所有对象都具有的方法
  • Object类型可以存储任何对象:
    作为参数,可以接受任何对象
    作为返回值,可返回任何对象

getClass()方法

  • public final Class<?> getClass(){}
  • 返回引用中存储的实际对象类型
  • 应用:通常用于判断两个引用中实际存储对象类型是否一致
public class TestMethodForGetClass {
	public static void main(String[] args) {
		Animal[] as = new Animal[] {new Dog(),new Cat()};

		//判断数组中两个对象的真实类型是否相同
		/*
		if(as[0] instanceof Dog) {
			if(as[1] instanceof Dog) {
				System.out.println("两个都为Dog对象");
			}
		}
		if(as[0] instanceof Cat){
			if(as[1] instanceof Cat) {
				System.out.println("两个都为Cat对象");
			}
		}*/
		System.out.println(as[0].getClass()==as[1].getClass());//获取引用中的真实类型
	}
}
class Animal{
	
}
class Dog extends Animal{}
class Cat extends Animal{}

hashCode()方法

  • public int hashCode(){}
  • 返回该对象的十进制的哈希码值
  • 哈希算法根据对象的地址或字符串或数字计算出来的int类型的数值
  • 哈希码并不唯一,可保证相同对象返回相同哈希码,尽量保证不同对象返回不同哈希码
public class TestMethodForHashCode {
	public static void main(String[] args) {
		Teacher t1 = new Teacher();
		System.out.println(t1.hashCode());
	}
}
class Teacher{}

toString方法

  • public String toString(){}
  • 返回该对象的字符串表示(表现形式)
  • 可以根据程序需求覆盖该方法,如:展示对象各个属性值
public class TestMethodForToString {
	public static void main(String[] args) {
		Fish fish = new Fish();
		System.out.println(fish.toString());
		System.out.println(fish);//打印对象,实质打印就是该对象的toString()的结果
		
		//打印出对象的结果后的数字由哈希码产生,由十进制的哈希码转换为十六进制的数值
		//getClass()获得对象的真实类型+@+十六进制哈希码
		System.out.println(fish.getClass().getName()+"@"+Integer.toHexString(fish.hashCode()));
	}
}
class Fish{}
public class TestMethodForToString1 {
	public static void main(String[] args) {
		Worker w1 = new Worker();
		w1.name="kunyan";
		w1.age =12;
		w1.sex ="女";
		w1.salary=8000;
		//System.out.println(w1.name+"\t"+w1.age+"\t"+w1.sex+"\t"+w1.salary);
		//若创建很多工人对象,每一个都需要输出,则输出语句重复写很多遍
		System.out.println(w1);
	}
}
class Worker{
	String name;
	int age;
	String sex;
	double salary;
	@Override
	public String toString() {
		return name + "\t" + age +"\t" + sex + "\t" + salary;
	}
}

equals()方法

  • public boolean equals(Object obj){}
  • 默认实现为(this==obj),比较两个对象地址值是否相同
  • 可进行覆盖,比较两个对象的内容是否相同

比较地址不同,但内容相同的对象需要覆盖。

public class TestMethodForEquals {
	public static void main(String[] args) {
		
		Student s1 = new Student("kunyan",20,"female",100);
		Student s2 = new Student("kunyan",20,"female",100);
		System.out.println(s1==s2);
		//有==判断地址值是否相等,仍用equals
		//字符串String类型中equals和==结果不一样,equals比内容,覆盖equals方法
		System.out.println(s1.equals(s2));//为返回true
		
		
	}
}

class Student{
	String name;
	int age;
	String sex;
	double score;
	
	public Student(String name, int age, String sex, double score) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.score = score;
	}
	public boolean equals(Object obj) {//比较内容
		//1.比较两个对象的地址是否一样
		if(this == obj) {
			return true;
		}
		//2.确认对象不为null
		if(obj== null) {
			return false;
		}
		//3.确认类型,但是值为null报错NullPointerExption
		if(this.getClass() != obj.getClass()) {
			return false;
		}
		//4.转型,传入进的参数是子类,但前提需要确认是否为Student
		Student stu = (Student)obj;//想获取子类属性,则需要将父类参数转箱,转为子类类型
		//5.比较内容
		if(this.name.equals(stu.name) && this.age==stu.age && this.sex.equals(stu.sex) && this.score == stu.score) {//此处应为equals,若传的属性为引用类型则用==又是比较地址,内容无法确定相同
			return true;
		}
		
		
		return false;
	}
}
class MyObject{
	public boolean equals(Object obj) {
		return(this == obj);
	}
}

finalize()方法

  • 当对象被判为垃圾对象时,由JVM自动给调用此方法,用以标记垃圾对象,进入回收队列。
  • 垃圾对象:没有有效引用指向此对象时,为垃圾对象
  • 垃圾回收:由GC销毁垃圾对象,释放数据存储空间。
  • 自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。
  • 手动回收机制:使用System.gc();通知JVM执行垃圾回收。
public class TestFinalize {
	public static void main(String[] args) {
		System.out.println("程序开始");
		
		Student s1 = new Student();
		
		s1 = null;
		
		System.gc();//手工触发垃圾收集的工作
		
		System.out.println("程序结束");
		
	}
}
class Student{
	@Override
	protected void finalize() throws Throwable {
		// TODO Auto-generated method stub
		super.finalize();//不要改
		System.out.println("Student finalize() Executed");
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章