1.Object类
1.1 Object类简介
Object类是类层次结构的根类,每个类都使用Object 作为超类
该类中提供了一些非常常用的方法:例如toString()方法和equals()方法
1.2 toString()
作用: toString方法主要用来打印对象的信息。
打印内容:
-
重写前:包名类名@地址值
-
重写后:对象中的属性值
重写toString: Object类的toString方法,默认返回的是对象的地址值,看一个类是否重写了toString,直接打印这个类的对象即可,如果没有重写toString方法那么打印的是对象的地址值
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
判断一些类是否重写toString:
Random r = new Random();
System.out.println(r);//java.util.Random@3f3afe78 没有重写toString方法
Scanner sc = new Scanner(System.in); System.out.println(sc);//java.util.Scanner[delimiters=\p{javaWhitespace}+.. 重写toString方法
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list);//[1, 2, 3] 重写toString方法
toString() 可使用快捷键添加。 IDE Alt+insert
1.3 equals()
boolean equals(Object obj) //指示其他某个对象是否与此对象“相等”
方法源码:
public boolean equals(Object obj) {
return (this == obj);
}
//参数: Object obj,可以传递任意的对象
//==比较运算符: 返回的是一个布尔值 true false
// 基本数据类型:比较的是值
// 引用数据类型:比价的是两个对象的地址值
为什么重写equals: Object类的equals方法,默认比较的是两个对象的地址值,没有意义
所以我们要重写equals方法,比较两个对象的属性(name,age)
重写遇到的问题: 隐含着一个多态,而多态无法使用子类特有的属性和方法
Object obj = p2 = new Person(“青”,18);
**解决:**可以使用向下转型(强转)把obj类型转换为Person
重写equals():
@Override
public boolean equals(Object obj) {
//增加一个判断,传递的参数obj如果是this本身,直接返回true,提高程序的效率
if(obj==this){
return true;
}
//增加一个判断,传递的参数obj如果是null,直接返回false,提高程序的效率
if(obj==null){
return false;
}
//增加一个判断,防止类型转换一次ClassCastException
if(obj instanceof Person){
//使用向下转型,把obj转换为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;
//getClass() != o.getClass() 使用反射技术,判断o是否是Person类型 等效于 obj instanceof Person
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if(age!=person.age) return false;
return name!=null?name.equals(person.name):peson.name==null;
}
jdk7 版 本:添加了一个Objects工具类,这里使用了Objects工具类中的equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
//getClass() != o.getClass() 使用反射技术,判断o是否是Person类型 等效于 obj instanceof Person
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&Objects.equals(name, person.name);
}
2.Objects类:
jdk7 版 本:添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态方法组成,他们是空指针安全的。
空指针安全: 可防止空指针异常
2.1 equals()方法:
Objects类的equals()方法 使用:
public class Demo03Objects {
public static void main(String[] args) {
String s1 = "abc";
//String s1 = null;
String s2 = "abc";
//
//boolean b = s1.equals(s2); // NullPointerException null是不能调用方法的,会抛出空指针异常
//System.out.println(b);
boolean b2 = Objects.equals(s1, s2);
System.out.println(b2);
}
}
Objects类的equals()方法 源码:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}