Object类的5个常用方法

Object类前言

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

Object类常用方法

1. getClass()方法

  • public final Class getClass(){ }
  • 返回引用中存储的实际对象类型
  • 应用:通常用于判断两个引用中实际存储对象类型是否一致
package com.zhuo.qf;

public class Student {
	private String name;
	private int age;
	
	public Student() {
		// 无参构造方法
	}
	
	//有参构造方法
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
package com.zhuo.qf;

public class TestStudent {
	public static void main(String[] args) {
		Student s1 = new Student("aaa",20);
		Student s2 = new Student("bbb",22);
		//判断s1和s2是不是同一个类型
		Class class1 = s1.getClass();
		Class class2 = s2.getClass();
		if(class1==class2) {
			System.out.println("s1和s2属于同一个类型");
		}else {
			System.out.println("s1和s2不属于同一个类型"); //输出
		}
	}

}

2. hashCode()方法

  • public int hashCode() { }
  • 返回该对象的哈希码值
  • 哈希值根据对象的地址字符串数字使用hash算法计算出来的int类型的数值
  • 一般情况下相同对象返回相同哈希码。
public class TestStudent {
	public static void main(String[] args) {
		Student s1 = new Student("aaa",20);
		Student s2 = new Student("bbb",22);
		//判断s1和s2是不是同一个类型
		Class class1 = s1.getClass();
		Class class2 = s2.getClass();
		if(class1==class2) {
			System.out.println("s1和s2属于同一个类型");
		}else {
			System.out.println("s1和s2不属于同一个类型");
		}
		
		//hashCode 方法
		System.out.println(s1.hashCode());  //804564176
		
		System.out.println(s2.hashCode());  //1421795058
		
		Student s3=s1;
		System.out.println(s3.hashCode());  //804564176
	}

}

那为什么s1和s3的内存相等呢?

可以这样想,在栈里面有两个变量s1和s3,然后这两个变量都指向了堆里面的同一个对象。

3. toString()方法

  • public String toString() { }
  • 返回该对象的字符串表示(表现形式)
package com.zhuo.qf;

public class TestStudent {
	public static void main(String[] args) {
// 3. toString方法
		System.out.println("----------3toString-------------");
		System.out.println(s1.toString()); //com.zhuo.qf.Student@2ff4acd0 -->十六进制
		System.out.println(s2.toString()); //com.zhuo.qf.Student@54bedef2
    }
}
  • 可以根据程序需求覆盖该方法,如:展示对象各个属性值。
package com.zhuo.qf;

public class Student {	
    //重写toString()方法
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
}

重写toString()方法后返回值为:

package com.zhuo.qf;

public class TestStudent {
	public static void main(String[] args) {
// 3. toString()方法
		System.out.println("----------3toString-------------");
		System.out.println(s1.toString()); //Student [name=aaa, age=20]
		System.out.println(s2.toString()); //Student [name=bbb, age=22]
    }
}

4.equals()方法

  • public boolean equals(Object obj) { }
  • 默认实现为(this == obj),比较两个对象地址是否相同。
  • 可进行覆盖,比较两个对象的内容是否相同。
    • equals()方法覆盖步骤
      • 比较两个引用是否指向同一个对象。
      • 判断obj是否为null
      • 判断两个引用指向的实际对象类型是否一致。
      • 强制类型转换。
      • 依次比较各个属性值是否相同。
package com.zhuo.qf;

public class Student {
	private String name;
	private int age;
		
	@Override
	public boolean equals(Object obj) {
		//1.判断两个对象是否是同一个引用
		if(this==obj) {
			return true;
		}
		//2.判断obj是否为null
		if(obj==null) {
			return false;
		}
		//3.判断是否是同一个类型
//		if(this.getClass()==obj.getClass()) {
//			
//		}
		// instanceof 判断对象是否是某种类型
		if(obj instanceof Student) {
			//4强制类型转换
			Student s = (Student)obj;
			//5比较属性
			if(this.name.equals(s.getName())&&this.age==s.getAge()) {
				return true;
			}
	}
		return false;
}

5. finalize()方法

  • 当对象被判断为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
  • 垃圾对象:没有有效引用指向此对象时,为垃圾对象。
  • 垃圾回收:由GC销毁垃圾对象,释放数据存储空间。
  • 自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。
  • 手动回收机制:使用System.gc();T通知JVM执行垃圾回收。
package com.zhuo.qf;

public class Student {
	private String name;
	private int age;
    
	// 无参构造方法
	public Student() {
	}
	
	//有参构造方法
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	protected void finalize() throws Throwable {
		System.out.println(this.name+"对象被回收了");
	}
}
package com.zhuo.qf;

public class TestStudent2 {
	public static void main(String[] args) {
//		Student s1 = new Student("aaa",18);
//		Student s2 = new Student("bbb",18);
//		Student s3 = new Student("ccc",18);
//		Student s4 = new Student("ddd",18);
//		Student s5 = new Student("eee",18);
		new Student("aaa",18);  //aaa被回收了
		new Student("bbb",18);	//bbb被回收了
		new Student("ccc",18);	//ccc被回收了
		new Student("ddd",18);	//ddd被回收了
		new Student("eee",18);	//eee被回收了
		//回收垃圾
		System.gc();
		System.out.println("回收垃圾");
	}
}

你可能感兴趣的:(#,JavaSE,java,哈希算法,开发语言)