【Java基础】第十四课:API-1-Object

一:Object工具类

简介:Object是类结构的根,所有的类都有Object作为超类,所有的对象,包括数组实现这个类的功能。

构造方法:Object()

常用方法:Object的常用方法有4个他们分别是:equls();   hashCode();    tostring();  getClass();  

1、equls();

equals()这个方法:是将两个类进行比较。返回值为true或者false。

使用方法:

public class Test_Equals {
	public static void main(String[] args) {
		Student s1=new Student("张亮",28);
		Student s2=new Student("张亮",28);
		System.out.println(s1.equals(s2));
	}
}
class Student{
	//属性
	String name;
	int age;
	//构造方法
	public Student(){}
//	source->Generate Constructor Using Field
	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;
	}
}

结果:

我们可以看到,即使给两个对象赋的值即使相等,这里的比较结果也为false,那是因为底层中比较的是两个对象的地址值,我们可以看一下底层代码:

public boolean equals(Object obj) {
        return (this == obj);
    }

在这里我们可以看到,是将两个类的对象进行==比较。这里的等等:如果进行比较的两个值是基本类型,那么,直接进行值的比较,如果要进行比较的是两个对象,那么,是两个对象在内存中的地址值在进行比较。

如果仅仅是想认为两个对象的属性相同就相等呢,再直接调用Object里的方法就不适用了。那么我们就需要在子类中进行重写:可以写成这样:

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) 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;
    }

这个重写的方法不需要我们自己重写,可以通过

鼠标右击-->source-->Generate hashCode and equals().....来创建。

再进行比较:

public class Test_Equals {
	public static void main(String[] args) {
		Student s1=new Student("张亮",28);
		Student s2=new Student("张亮",28);
		System.out.println(s1.equals(s2));
	}
}
class Student{
	//属性
	String name;
	int age;
	//构造方法
	public Student(){}
//	source->Generate Constructor Using Field
	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;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) 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;
	}
	
	
}

结果:

2、toString

toString方法可以更加方便我们获取对象的属性。如果没有toString,我们获取对象的属性值有两种方法,一种是创建对象,通过对象直接调用该对象的属性值,但是这种方法不是很安全,因为它不能将类中的属性定义成private类型,不能进行封装。第二种是在类中定义get方法,通过创建对象,来调用get方法,最终得到对象的属性。但是一个一个的获取,实在太麻烦了,这时候toString方法的好处就来了。

使用方法:

public class Test_Equals {
	public static void main(String[] args) {
		//equals方法的使用
		Student s1=new Student("张亮",28);
		Student s2=new Student("张亮",28);
//		System.out.println(s1.equals(s2));
		//toString
		System.out.println(s1.toString());
	}
}
class Student{
	//属性
	String name;
	int age;
	//构造方法
	public Student(){}
//	source->Generate Constructor Using Field
	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;
	}
	//重写equals
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) 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;
	}
	//
	
}

结果:

这里可以看到,直接输出的toString打印出了一串地址值,这是因为其源码是这样的:

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

我们可以看到,它输出的是通过hashCode方法得出的地址值与类名,包名进行拼接的,那么要想得到我们所希望的直接输出对象的属性,在子类里,需要进行重写。像这样:

@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	

这个方法我们也不需要自己写,可以通过:

鼠标右击-->source-->Generate toString()......来创建。

测试一下:

public class Test_Equals {
	public static void main(String[] args) {
		//equals方法的使用
		Student s1=new Student("张亮",28);
		Student s2=new Student("张亮",28);
//		System.out.println(s1.equals(s2));
		//toString
		System.out.println(s1.toString());
	}
}
class Student{
	//属性
	String name;
	int age;
	//构造方法
	public Student(){}
//	source->Generate Constructor Using Field
	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;
	}
	//重写equals
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) 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;
	}
	//重写toString
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	
}

结果:

3、hashCode

这个函数可以返回对象的哈希代码值。每个对象在创建的时候都会分配一串哈希代码值作为地址。可以通过hashCode()方法获得。

测试:

public class Test_Equals {
	public static void main(String[] args) {
		//equals方法的使用
		Student s1=new Student("张亮",28);
		Student s2=new Student("张亮",28);
//		System.out.println(s1.equals(s2));
		//toString
//		System.out.println(s1.toString());
		System.out.println(s1.hashCode());
	}
}
class Student{
	//属性
	String name;
	int age;
	//构造方法
	public Student(){}
//	source->Generate Constructor Using Field
	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;
	}
	//重写equals
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) 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;
	}
	//重写toString
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	
}

结果:

4、getClass

getClass这个方法可以返回Object运行时类,先不说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值