一、Object类概述
java.lang.Object类是Java语言中的根类,即所有类的父类。它中间描述的方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。所有对象都实现这个类的方法
如果一个类没有特别指定父类,那么默认继承来自Object类。
二、Object类的toString方法
作用:打印对象的信息
重写前:打印包名类名@地址值
重写后:打印的是对象中的属性值
package Day12_Demo01;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
/*
直接打印对象的地址值没有意义,重写Object类的toString方法
打印对象的属性(name,age)
*/
@Override
public String toString() {
return "Person [name=" + name + ", 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 Day12_Demo01;
/*
java.lang.Object类
类Object是类层次结构的根(最顶层)类。每个类都使用Object作为超(父)类
所有对象(包括数组)都实现这个类的方法
*/
public class Demo01ToString {
public static void main(String[] args) {
/*
Person类默认继承了Object类,所以可以使用Object类中的toString方法
String toString() 返回该对象的字符串表示
*/
Person p=new Person("张三",18);
String s=p.toString();
System.out.println(s);//Day12_Demo01.Person@2f92e0f4
//直接打印对象的名字其实就是调用对象的toString方法 p=p.toString();
System.out.println(p);//Day12_Demo01.Person@2f92e0f4//Person{name=张三+age=18}
/*看一个类是否重写了toString方法,直接打印这个类对应对象的名字即可
如果没有重写toString方法,那么打印的就是对象的地址值(默认)
如果重写了toString方法,那么就按照重写的方式打印
*/
}
}
三、Object类的equals方法
boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
Object类equals类方法的源码:
public boolean equals(Object obj){
return(this==obj);
}
参数:
Object obj:可以传递任意的对象
方法体:
==:比较运算符,返回的就是一个布尔值true,false
基本数据类型:比较的是值
引用数据类型:比较的是两个对象的地址值
重写前:比较对象的地址值
重写后:比较对象的属性值
package Day12_Demo01;
public class Demo02Equals {
public static void main(String[] args) {
/*
Person类默认继承了Object类,所以可以使用Object类的equals方法
boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
Object类equals类方法的源码:
public boolean equals(Object obj){
return(this==obj);
}
参数:
Object obj:可以传递任意的对象
方法体:
==:比较运算符,返回的就是一个布尔值true,false
基本数据类型:比较的是值
引用数据类型:比较的是两个对象的地址值
this是谁?哪个对象调用的方法,方法中的this就是哪个对象;p1调用的equals方法,所以this就是p1
obj是谁?传递过来的参数p2
this==obj-->p1==p2
*/
Person p1=new Person("迪丽热巴",18);
Person p2=new Person("古力娜扎",18);
boolean b=p1.equals(p2);
System.out.println(b);//重写前false
boolean c=p1.equals(p2);//重写后true
System.out.println(c);//true
}
}
四、重写Object类的equals方法
比较两个对象的地址值没有意义,如何比较其中的参数,需要对equals方法进行重写
@Override
public boolean equals(Object obj) {
//使用向下转型(强转)把Object类型转为Person
Person p=(Person)obj;
//比较两个对象的属性:一个是调用方法的this(p1),一个是转型之后的p(obj=p2);
boolean b=this.name.equals(p.name)&&this.age==p.age;
return b;
package Day12_Demo01;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
/*
直接打印对象的地址值没有意义,重写Object类的toString方法
打印对象的属性(name,age)
*/
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
/*
Object类的equals方法默认比较的是两个对象的地址值,没有意义
所以需要重写equals方法,比较两个对象的属性值(name,age)
对象的属性值一样返回true,不一样返回false
问题:隐含了一个多态
Object obj=p2=new Person("古力娜扎",18);
多态的弊端:无法使用子类特有的内容(属性,方法)
解决办法:可以使用向下转型(强转)把object类型转换为Person类型
*/
@Override
public boolean equals(Object obj) {
//增加一个判断,传递的参数obj如果是this本身,直接返回true,提高程序效率
if(obj==this) {
return true;
}
//增加一个判断,传递的参数obj是null,直接返回false,提高程序的效率
if(obj==null) {
return false;
}
/*
增加一个判断,是Person类型再进行转换,防止类型转换异常ClassCastException
*/
if(obj instanceof Person) {
//使用向下转型(强转)把Object类型转为Person
Person p=(Person)obj;
//比较两个对象的属性:一个是调用方法的this(p1),一个是转型之后的p(obj=p2);
boolean b=this.name.equals(p.name)&&this.age==p.age;
return b;
}
//不是Person类型直接返回false
return false;
}
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 Day12_Demo01;
import java.util.Random;
public class Demo02Equals {
public static void main(String[] args) {
/*
Person类默认继承了Object类,所以可以使用Object类的equals方法
boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
Object类equals类方法的源码:
public boolean equals(Object obj){
return(this==obj);
}
参数:
Object obj:可以传递任意的对象
方法体:
==:比较运算符,返回的就是一个布尔值true,false
基本数据类型:比较的是值
引用数据类型:比较的是两个对象的地址值
this是谁?哪个对象调用的方法,方法中的this就是哪个对象;p1调用的equals方法,所以this就是p1
obj是谁?传递过来的参数p2
this==obj-->p1==p2
*/
Person p1=new Person("迪丽热巴",18);
Person p2=new Person("迪丽热巴",18);
Random r=new Random();
//p1=p2;//p2地址值给p1,两个地址值相同
boolean c=p1.equals(p2);
System.out.println(c);//true
}
}
五、Objects类的equals()方法
比较两个对象是否相同,但是增加了一些健壮性的判断(空指针安全或者容忍空指针),
可以防止空指针异常