Object时是所有类的父类
类 Object 是类层次结构的根类。
每个类都使用 Object 作为超类。
所有对象(包括数组)都实现这个类的方法。
方法摘要
Obiect类的tostring方法
toString() 返回该对象的字符串表示。
直接打印对象的名字,其实就是调用tostring方法,
重写之前是获取地址值。
看一个类是否重写了tostring方法,直接打印这个类对应的对象的名字即可,
Person.java
package demo01.Object;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/*
直接打印对象的地址值没有意义,重写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;
}
}
Demo01ToString.java
package demo01.Object;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
/*
类 Object 是类层次结构的根类。
每个类都使用 Object 作为超类。
所有对象(包括数组)都实现这个类的方法。
*/
public class Demo01ToString {
public static void main(String[] args) {
//person默认继承了Object类,所以可以使用ToSting方法
/*toString()
返回该对象的字符串表示。*/
Person p = new Person("laoba",23);
String s = p.toString();
System.out.println(s);//重写之前:demo01.Object.Person@1b6d3586
System.out.println(p);//重写之前:demo01.Object.Person@1b6d3586
/*
直接打印对象的名字,其实就是调用tostring方法,重写之前是获取地址值
看一个类是否重写了tostring方法,直接打印这个类对应的对象的名字即可,
*/
Random r = new Random();
System.out.println(r);
Scanner sc = new Scanner(System.in);
System.out.println(sc);
ArrayList<Integer> list = new ArrayList<>();//此类重写了tostring方法
list.add(1);
list.add(2);
System.out.println(list);
}
}
由以上结果可见,ArrayList<>()类重写了tostring方法
Obiect类的equals方法
equals(Object obj) 指示其他某个对象是否与此对象“相等”。
equals方法默认比较的是两个对象的地址值,没有意义。
需要重写,比较两个对象的属性值(name,age)
问题:
有一个多态,equals方法传递的值Object类型,
可以使用向下转型(强转),将Object类型转换为Person类型
@Override
public boolean equals(Object obj) {
//如果是null,直接返回false,提高效率
if(obj == null) return false;
//如果是自身,则返回true,提高效率
if(obj == this) return true;
//是Person类型,可以使用向下转型(强转),
if(obj instanceof Person){
//将Object类型转换为Person
Person p = (Person)obj;
boolean b = this.name.equals(p.name) && (this.age == p.age);
return b;
}
else {
//不是Person类型,返回false
return false;
}
//比较两个对象的属性
}
Demo02Equals.java
package demo01.Object;
import java.util.Random;
/*
equals(Object obj) 指示其他某个对象是否与此对象“相等”。
*/
public class Demo02Equals {
public static void main(String[] args) {
Person p1 = new Person("laoba",17);
Person p2 = new Person("giao",22);
Person p3 = new Person("laoba",17);
/*
引用数据类型比较的是地址值。
*/
System.out.println(p1.equals(p2));//false
System.out.println(p1.equals(p3));//true
Random r = new Random();
System.out.println(p1.equals(r));//false
System.out.println(p1.equals(null));//false
}
}
Objects类的equals方法
为了防备可能为null的情况,需要使用Objects.equals方法。
如果两个参数都为null,Objects.equals(ab)调用将返回true;
如果其中一个参数为null,则返回false;
如果两个参数都不为null,则调用a.equals(b)。
package demo01.Object;
import java.util.Objects;
public class Demo03Objects {
public static void main(String[] args) {
String s1 = null;
String s2 = "aaa";
//boolean b1 = s1.equals(s2); //null不能调用方法,会抛出空指针异常
//System.out.println(b1);
//防止空指针异常
boolean b2 = Objects.equals(s1,s2);
System.out.println(b2);
b2 = Objects.equals(null,null);
System.out.println(b2);
}
}