java-Object类中的方法

Object类

前面说了java中,万事万物都是对象。
Object类是祖先类,也就是它是源头。
如果我们写一个类不写extends继承某个类,那么系统默认继承Object类,
如果我们写了一个类继承某个类,那么就是间接继承Object类,因为父类的父类终究有个类继承Object类。

继承Object类,不建议写,class Son extends Object,因为java的单继承模式,你写了继承Object,那么就不能继承其他类了。

在多态里面有个 Father father = new Son();父类的引用指向子类的对象。
所以java中,所有对象都可以使用Object类型去引用。即Object object = new Son(); //这里的Son这个子类名字是方便理解,根据实际情况来。

getClass()方法:得到对象所对应的类

作用:判断一个对象是不是某个类的,也可以判断多个对象是不是同一个类的对象,这样就可以了解该对象可以调用类中哪些属性和方法。

上代码,这里有一个包,里面有Father类,一个子类Son,子类Son类继承Father类

public class GetClass {
    
    
	public static void main(String [] args) {
    
    
		Father father1 = new Son() ; //多态,实际是子类的对象
		Father father2 = new Son() ; //多态,实际是子类的对象
		if( father1.getClass() == father2.getClass() ) {
    
    
			System.out.println("这是同一个类的对象");
		}else {
    
    
			System.out.println("这不是同一个类的对象");
		}
	}
	
}		

getClass().getName()方法:获取当前对象是哪个包的哪个类的

上代码,证明上面的注释

package day16;

public class GetClass {
    
    
	public static void main(String [] args) {
    
    
		Father father1 = new Son() ; //多态
		Father father2 = new Son() ; //多态
		//输出Father father1 = new Son() ;,father1到底是哪个类的
		System.out.println(father1.getClass().getName());
		
	}
	
}

在这里插入图片描述
表示father1这个实际是day16这个包的Son类的

toString()方法:当前对象的描述信息

toString()就是返回当前对象的描述信息,这个是Object这个类里面的

看看里面的原码

//这个是Objext类里面的原生toString 方法,返回的是当前对象的类名以及hashcode值
 public String toString() {
    
    
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

这里给一个例子来说明一下。

public class GetClass {
    
    
	public static void main(String [] args) {
    
    
		Father father1 = new Son() ; //多态
		
		System.out.println(father1.toString());
	}
	
}

在这里插入图片描述
这个@前面显示的是day16这个包里面的Son类的对象,和getClass().getName()一样的,@后面的就是hashcode值,对我们是没有是没有什么作用的,但是计算机按照这个值去找保存的属性和方法。

所以我们一般重写这个toString方法,因为我们通常是要获得当前对象的属性值,而不是一个地址。
注意toString是只能用public 修饰的然后返回值是String
子类如下:

public class Son extends Father{
    
    
	
	private String name ;
	private int 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;
	}
//重写Object类的方法,获取当前对象的属性值
	public String toString() {
    
    
		return "姓名为:" + name + ",年龄为:" + age ;
	}
}

main函数如下:

package day16;

public class GetClass {
    
    
	public static void main(String [] args) {
    
    
		Son son1 = new Son();
		//因为是私有属性并且没有写有参构造函数,所以不能调用构造方法来创建对象,通过set属性()方法来设值
		son1.setName("王五");
		son1.setAge(18);
		//打印出来看看
		System.out.println(son1.toString());
	}
	
}

在这里插入图片描述
改写后输出当前对象设置的属性,这样才是我们想要获得的值。

equal()方法和hashCode()方法

hashCode()方法是通过对象的地址或者一些关键属性(比如字符串,数字,像每个人的身份证号码样)生成一个int类型的值。需要尽量保证不同的对象有不同的hashCode值,一定要保证相同对象有相同的hashCode值。
equals()方法是通过比较对象来看是不是相同。一般情况下是用= =来比较。一般是需要重写的,在重写equals方法时一定要重写hashCode方法,重写后根据主要属性来判断对象是否时相同的对象

重写后根据主要属性来判断对象是否时相同的对象
怎么重写呢,Eclipse里面是鼠标右键—> source ---->Generate hashCode() and equals()

@Override
	public int hashCode() {
    
    
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
@Override
	public boolean equals(Object obj) {
    
    
		if (this == obj) 
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Son other = (Son) obj;
		if (age != other.age)
			return false;
		if (name == null) {
    
    
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

main()方法

//创建两个对象
		Son son1 = new Son();
		Son son2 = new Son();
		//给私有属性赋值
		son1.setName("王五");
		son1.setAge(18);
		
		son2.setName("王五");
		son2.setAge(18);
		//输出看是不是同一个对象
		System.out.println(son1.equals(son2));
		

在这里插入图片描述
看来重写后的方法,可以通过判断属性值是不是相等来判断两个对象是不是相同的,因为对象里保存的是属性值,说明属性值相等,那么系统也会识别为相同的对象。

finalize()方法,提醒系统进行垃圾回收,仅仅是提醒

finalize()方法,属于JVM自动调用,用来标记垃圾对象,进入回收队列。

Java种垃圾回收是定时回收,可以使用System.gc()方法请求进行垃圾回收,并不能立即调用垃圾回收

猜你喜欢

转载自blog.csdn.net/toomemetoo/article/details/112481054