Object类概述
java.lang.Object
类是Java语言中的根(最顶层)类,即所有类的父(超)类。 它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object
。 所有对象(包括数组)都实现这个类的方法。 如果一个类没有特别指定父类,那么默认则继承自Object
类。
下面以Person类继承自Object类举例,介绍Object类的两种常用方法:toString()
方法和equals()
方法
toString()方法
Person
类默认继承了Object
类,所以可以使用Object
类当中的toString()
方法
String toString():
返回该对象的字符串表示
代码展示
首先写一个Person
类
import java.util.Objects;
public class Person {
private String name;
private int age;
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
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;
}
}
然后创建一个Person
类的对象,打印输出这个对象
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class Demo01ToString {
public static void main(String[] args) {
Person p=new Person("张三",18);
String s=p.toString();
System.out.println(s); //com.code.day01.demo01.Person@1b6d3586
/*
看一个类是否重写了toString方法,直接打印这个类对应对象的名字即可
如果没有重写toString方法,那么打印的就是对象的默认值(默认)
如果重写了toString方法,那么就按照重写的方式打印
*/
Random r=new Random();
System.out.println(r); //java.util.Random@4554617c,没有重写toString方法
Scanner scan=new Scanner(System.in);
System.out.println(scan); //java.util.Scanner[delimiters=\p{javaWhitespace}+] 重写了toString方法
ArrayList<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
System.out.println(list); //[1,2] 重写了toString方法
}
}
创建了这个类之后,用toString()
方法,直接打印的是对象的地址值,这样是没有意义的,所以我们需要重写Object
类中的toString()
方法,打印对象的属性值(name,age)。
在Person
类中重写toString()
方法,也可以快捷键生成( alt+insert 选toString)
//自己写的,打印对象的属性值(name,age)
@Override
public String toString(){
return "Person{name="+name+",age="+age+"}";
}
//快捷键生成的
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
这时候在打印输出对象,输出结果就为 Person{name=``张三,age=18}
,是这个对象的姓名和年龄了,此时就有意义了。
【注意】
看一个类是否重写了toString()
方法,直接打印这个类对应对象的名字即可。如果没有重写toString()
方法,那么打印的就是对象的默认值。如果重写了toString()
方法,那么就按照重写的方式打印出来。
equals()方法
Person
类默认继承了Object
类,所以可以使用Object
类的equals()
方法。
boolean equals(Object obj)
:指示其他某个对象是否与此对象“相等”
Object
类的equals
方法源码:
public boolean equals(Object obj) {
return (this == obj);
};
代码展示
public class Demo02Equals {
public static void main(String[] args) {
Person p1=new Person("迪丽热巴",18);
//Person p2=new Person("古力娜扎",18);
Person p2=new Person("迪丽热巴",18);
boolean b=p1.equals(p2);
System.out.println(b); //false,比较的是p1和p2的地址值
Random r=new Random();
System.out.println(p1.equals(r)); //false
}
}
在Person
类中没有重写Object
类的equals()
方法。Object
类的equals()
方法是默认比较的两个对象的地址值,没有意义。所以我们需要重写equals()方法,用来比较两个对象的属性值(name,age)对象的属性值一样,返回ture;否则返回false
问题:隐含着一个多态Object obj=p2=new Person(“古力娜扎”,18);
多态弊端:无法使用子类特有的内容(属性,方法)
解决:可以使用向下转型(强转)把Object
类型转换为Person
在Person
类中重写equals()
方法,比较的就是name和age的属性值是否一样
//自己重写的方法
@Override
public boolean equals(Object obj){
//增加一个判断,传递的参数是obj本身,直接返回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;
}
//快捷键生成equals方法的重写:alt+insert equals() and hashcode()
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
import java.util.Random;
public class Demo02Equals {
public static void main(String[] args) {
Person p1=new Person("迪丽热巴",18);
//Person p2=new Person("古力娜扎",18);
Person p2=new Person("迪丽热巴",18);
boolean b=p1.equals(p2);
System.out.println(b); //true
}
}
Object类——equals()方法概述
Objects的equals方法:对两个对象进行比较,可以防止空指针异常
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b)
);
代码展示
import java.util.Objects;
public class Demo03Objects {
public static void main(String[] args) {
String s1=null;
String s2="abc";
//String的equals()方法会报错NullPointerException,会抛出空指针异常
//null是不能调用方法的,会抛出空指针异常
boolean b=s1.equals(s2);
System.out.println(b);
boolean b2= Objects.equals(s1,s2); //Objects.equals()不会报错
System.out.println(b2);
}