20、Java的Object类中的一些方法(getClass()方法、toString()方法、hashCode()方法、equals()方法、finalize()方法)

Object类:

所有类的直接或者间接父类,根类,任何一个类如果没有写继承的父类,则默认继承Object,所以Object类中定义的方法是所有类都具备的。

1.getClass():返回引用中存储的对象的实际类型(可以判断两个引用中存储的对象的实际类型是否一致)。
public class TestAnimal {
public static void main(String[] args) {
	Animal a1 = new Dog();
	Animal a2 = new Dog();
	Animal a3 = new Cat();
	System.out.println(a1.getClass());//返回引用中存储的对象的实际类型
	System.out.println(a2.getClass());
//判断a1引用中存储的对象的实际类型是否与a2引用中存储的对象的实际类型相同
	System.out.println(a1.getClass()==a2.getClass());//true
	System.out.println(a1.getClass()==a3.getClass());//false
}
}
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
2.hashCode():返回对象的哈希码值(一般是通过将该对象的内部地址转换成的一个整数)。
3.toString():返回该对象的String形式(一般为了方便打印输出对象的内容,可以选择覆盖toString())。
class Worker{
private name,age,sex,salary;
//如果父类提供的方法无法满足子类需求 可以选择覆盖父类中的方法 方法实现按照自己的要求书写
//覆盖要求:方法名,参数表,返回值类型相同,访问修饰符子类和父类相同或者比父类更宽
@Override
public String toString() {
return name+"\t"+age+"\t"+sex+"\t"+salary;
}
}
4.equals():比较两个对象的内容是否一致,内容相同返回true,否则返回false。

==:
如果等号两端是基本数据类型的变量,则比较数值
如果等号两端是引用数据类型的变量,则比较地址
equals()比较的是内容

class Worker{
//覆盖equals5步
@Override
public boolean equals(Object o) {//w1.equals(w2) Object o = w2;
 //自反性 (比较两个引用是否指向同一个对象)
 if(this==o)return true;
 //非空性(判断o引用是否为null)
 if(o==null)return false;
 //一致性(判断两个引用中存储的对象的实际类型是否一致)
 if(this.getClass()!=o.getClass())return false;
 //强转
 Worker w = (Worker)o;
 //比较两个对象的具体的属性值
 //注意:o为Object类型的引用 父类引用仅可调用父类中声明的属性和方法 不可调用子类中独有的属性和方法
 if(this.name.equals(w.name) && this.age==w.age && this.sex==w.sex
  && this.salary==w.salary) {//这些信息一样才算一样,返回true
   return true;
}else {
   return false;
}
}
}
class TestEquals{
	public static void main(String[] args){
		int a = 1;
		int b = 2;
		System.out.println(a==b);//false
		Worker w1 = new Worker("zs",20,'男',1000.0);
		Worker w2 = new Worker("li",30,'女',2000.0);
		Worker w3 = new Worker("ww",40,'男',3000.0);
		System.out.println(w1==w2);//false
		System.out.println(w1.equals(w2));//true
		System.out.println(w1.equals(w3));//false
}
}
5.finalize():垃圾回收器在回收垃圾对象时调用的方法。

1.垃圾对象:没有引用指向的对象

public class TestFinalize {
public static void main(String[] args) {
Student s = new Student();
s = null;//此引用没有指向实际的对象 此时刚创建的Student对象属于垃圾对象
}
}
class Student{}

2.垃圾回收:销毁垃圾对象,并释放数存储空间。
3.垃圾回收器(GC)何时回收垃圾对象?
1)自动回收机制:JVM内存耗尽,不能再为新创建的对象分配内存空间,一次性回收所有的垃圾对象(会自动调用Object类中的finalize()方法)

public class TestFinalize {
public static void main(String[] args) {
	Student s = new Student();
	s = null;//此引用没有指向实际的对象 此时刚创建的Student对象属于垃圾对象
	for(int i=0;i<1000000000;i++) {
	new Student();
	}
}
}
class Student{
	@Override
	protected void finalize() throws Throwable {
	super.finalize();
	System.out.println("垃圾回收了");
}
}

2)手动回收机制:使用System.gc(),通知JVM做垃圾回收,如果GC空闲则回收;如果繁忙则暂时不回收。

public class TestFinalize {
public static void main(String[] args) {
	Student s = new Student();
	s = null;//此引用没有指向实际的对象 此时刚创建的Student对象属于垃圾对象
	System.gc();
}
}
class Student{
	@Override
	protected void finalize() throws Throwable {
	super.finalize();
	System.out.println("垃圾回收中......");
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值