Java之Object类简述

  • Object类是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。Object类是所有类的父类,所有类都默认继承Object类,即所有类的对象都可以使用Object进行接收。
class Person {}
class Student {}
public class JieShouDuiXiang {
    public static void main(String[] args) {
        fun(new Person());
        fun(new Student());
    }
    public static void fun(Object obj) {
        System.out.println(obj);
    }
}

在这里插入图片描述
所以在开发之中,Object类是参数的最高统一类型。但是Object类也存在有如下的定义好的一些方法:

1. 获取对象信息 – toString()

class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class HuoQuDuiXiangXinXi {
    public static void main(String[] args) {
        fun(new Person("张三", 20));
        fun("Hello");
    }
    public static void fun(Object obj) {
        System.out.println(obj.toString());
        System.out.println(obj);
        //不管是obj.toString()还是直接obj,结果都是一样的!!!
    }
}

在这里插入图片描述
所以在使用System.out.println()系统输出对象时,默认会调用该对象的toString方法。所有类都是Object的子类,Object有toString方法,则所有类都有toString方法。

  • 那么我们就像知道默认的toString方法到底干了个啥事儿?
//默认的Object类的toString方法
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

若自定义类需要进行内容的输出,需要覆写toString()方法。

class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //覆写之后的toString方法
    public String toString() {
        return "姓名是:"+this.name+"年龄是:"+this.age;
    }
}
public class HuoQuDuiXiangXinXi {
    public static void main(String[] args) {
        fun(new Person("张三", 20));
        fun("Hello");
    }
    public static void fun(Object obj) {
        System.out.println(obj.toString());
    }
}

在这里插入图片描述

  • 那么现在问题就是为什么String类可以输出内容???
  • 一定是因为String类的内部覆写了toString方法!!
//String类覆写后的toString方法
public String toString() {
    return this;//输出当前对象不再输出地址
}

***** 2. 比较两个对象内容 – equals()

Object类提供的equals方法默认比较两个对象的地址是否相同。String类对象的比较使用的是equals()方法,实际上String类的equals()方法就是覆写的Object类中的equals()方法。

class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        Person per1 = new Person("张三", 20);
        Person per2 = new Person("张三", 20);
        System.out.println(per1.equals(per2));
        //equals比较的不应该是内容吗?内容明明相等为什么结果是false???
    }
}

因为Person类是我们自己写的,调用的是Object类的equals方法。

  • 那么Object类的equals方法到底干了个啥事儿???
//默认的Object类的equals方法
public boolean equals(Object obj) {
    return (this == obj);
    //"=="比较的是地址,per1和per2肯定地址不一样,所以返回false
    //没覆写的情况下相当于 per1 == per2?
}

所以Object类提供的equals方法默认比较两个对象的地址是否相同!!和"=="一样的。

  • 如何进行内容的比较?即如何覆写equals方法?
class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //覆写之后的equals方法
    public boolean equals(Object obj) {
        //判断地址是否相等,相当于自己跟自己比
        if(obj == this) {
            return true;
        }
        //判断传进来的obj对象能否指向Person,"!"表示传进来的对象不是Person对象
        //不是一个类就没必要比较属性
        if(!(obj instanceof Person)) {
            return false;
        }
        //此时传进来的obj一定是Person对象且和this不是一个地址
        //此时需要比较两个Person对象的内容,现在还在Objectlei中需要向下转型转回Person对象后比较两者的属性内容
        Person per = (Person) obj;
        return this.age == per.age && this.name.equals(per.name);
    }
}
public class Test {
    public static void main(String[] args) {
        Person per1 = new Person("张三", 20);
        Person per2 = new Person("张三", 20);
        Person per3 = new Person("张三", 21);
        System.out.println(per1.equals(per2));
        System.out.println(per1.equals(per3));
    }
}

在这里插入图片描述

3. 接收引用数据类型

在之前已经分析了Object可以接收任意的对象,因为Object是所有类的父类,但是Object并不局限于此,它可以接收所有数据类型,包括:类、数组、接口。

① 使用Object来接收数组对象

public class JieShouShuZu {
    public static void main(String[] args) {
        //向上转型,Object类接收了一个数组
        Object obj = new int[]{1, 2, 3, 4, 5};
        //向下转型,强转
        int[] data = (int[]) obj;
        for(int i : data) {
            System.out.print(i + "、");
        }
    }
}

在这里插入图片描述
② 使用Object来接收接口对象

而Object可以接收接口是Java中的强制要求,因为接口本身不能继承任何类。

interface IMessage {
    void getMessage();
}
class MessageImpl implements IMessage {
    public void getMessage() {
        System.out.println("Hello world");
    }
    public String toString() {
        return "你好";
    }
}
public class JieShouJieKou {
    public static void main(String[] args) {
        //MessageImpl向上转型
        IMessage m = new MessageImpl();
        //接口向Object转型
        Object obj = m;
        System.out.println(m);
        //向下转型
        IMessage msg = (IMessage) obj;
        msg.getMessage();
    }
}

在这里插入图片描述
Object真正达到了参数的统一,如果一个类希望接收所有的数据类型,就是用Object完成。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值