什么是Object类?
java.lang.Object类是Java语言中的根类,即所有类的父类(超类)。Object中所描述的所有子类方法都可以使用。在对象实例化的时候,最终找到的父类就是Object类
// 如果不写,也默认继承Object
public class Myclass /*extedns Object*/ {
// 类体
}
Object类中的toString方法
1、Object中toString方法的作用:
返回该对象的字符串表示(就是返回对象的地址值)
举例说明:
// 写一个人类
public class Person{
private String name;
private int age;
// 这里为了方便就不写getter和setter方法了
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age
}
/* 因为toString方法返回对象的内存地址
* ,没有什么意义,
* 所以我们将toString方法重写为显示对象的属性的一个方法
*/
public String toString(){
return "Person{name="+name+",age="+age+"}";
}
}
// 新建一个类包含main方法
public class ToString{
public static void main(String[] args) {
Person p = new Person("张三", 18);
String s = p.toString();
System.out.println(s);// 得到的是p对象的地址值
System.out.println(p);// 直接打印对象的名字,其实就是调用对象的toString方法
// p = p.toString
}
}
注意:
① 在我们直接打印对象的名字的时候返回的是对象在堆内存中的地址值,其实打印名字这个过程就是调用了toString这个方法
② 但是直接打印对象的地址值是没有意义的,我们可以重写Object类中的toString方法,用来打印对象的属性
③ 当然我们不需要自己手动改写toString方法的内容,我们可以通过编译器的快捷键自动添加
④ 如果我们打印对象名返回的不是地址值,那么它一定重写了toString方法(已知Scanner和ArrayList< Integer >重写了toString方法)
Object中的eqluals方法
1、方法的摘要
public boolean equals(Object obj):指的是其他某个对象是否与此对象“相等”。
调用成员方法equals并指定一个参数为另一个对象,则可以半段这两个对象是否相等。这里的“相同”有默认和自定义两种方式
equals方法源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
注意:
① Object obj:可以传递任意的对象
② 两个等号比较运算符 ,返回的是一个布尔值
③ 基本数据类型比较的是值
④ 引用数据类型比较的是两个对象的地址值(但是String类型的对象已经重写了queals方法可以直接比较字符串的内容是否相等)
⑤ this是谁?哪个对象调用的这个方法,方法中的this就是这个对象
⑥ obj是我们传输到方法中的参数
2、equals方法的默认地址的比较
举例说明:
// 写一个人类
public class Person{
private String name;
private int age;
// 这里为了方便就不写getter和setter方法了
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age
}
}
// 新建一个类包含main方法
public class ToString{
public static void main(String[] args) {
Person p1 = new Person("张三", 18);
Person p2 = new Person("张三", 18);
boolean b = p1.equals(p2);
System.out.println(b);// 很显然返回的是false,因为p1和p2的地址值不一样
}
}
3、equals方法是默认地址的比较没什么实际意义,所以我们需要重写equals方法,比如重写equals方法用于比较两个对象的属性值是否相等
举例说明:
// 创建了一个人类
public class Person{
private String name;
private int age;
// 这里为了方便就不写getter和setter方法了
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age
}
// 覆盖重写Object中的equals方法
@Override
public boolean equals(Object obj) {
// 使用向下转型将obj转换为Person类型
Person p = (Person)obj;
// 比较两个对象的属性,
//一个对象是this(p1),一个对象是p(obj ->p2)
boolean b = this.name.equals(p.name) && this.age == p.age;
return b;
}
}
// 新建一个类包含main方法
public class Equals{
public static void main(String[] args) {
Person p1 = new Person("张三", 18);
Person p2 = new Person("张三", 18);
boolean b = p1.equals(p2);
System.out.println(b);// 这里返回的就是true,
// 因为我们覆盖重写了equals方法,
// 此时这个方法用于比较对象的属性是否相等
}
}
① 在我们重写equals方法时出现了一个问题:
我们传入的参数是一个多态
Object obj = p2 = new Person("李四",19)
p2是子类,向上转型为了Object,成为了一个多态写法,但是多态写法有一个弊端,是无法使用子类特有的内容(属性和方法)
解决方法:
可以使用向下转型,把obj的类型转换为Person类
② 注意:
equals方法可以快捷键重写
Objects的equals方法
1、Objects类的equals方法的作用:
对两个对象进行比较,防止空指针异常
2、Objects类的equals方法的源码:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}