Java —— Object类

本文深入解析Java中对象的toString()方法、equals()方法的使用及原理,并探讨了Object类如何接收各种引用数据类型,包括数组、类、接口,以及基本数据类型的自动装箱。

1.取得对象信息——toString( )

  • 直接使用对象输出,默认输出一个地址编码;如果输出的是String对象,此时输出字符串内容而非地址。

原因:String类覆写了Object的toString( )方法

  • 系统输出默认会调用对象的toString( )
  • 如果默认给出的toString( )功能不足(想要输出本类信息),需要在子类中覆写toString( )方法。
/**
 * Object类的toString()
 */
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

代码示例:

public class ObjectTest1 {
    public static void main(String[] args) {
        fun(new Person("张三",25));   //覆写前:Person@1540e19d  覆写后:姓名:张三  年龄:25
        fun("hello");   //hello
    }
    public static void fun(Object obj) {
        System.out.println(obj.toString());
        //等同于下行代码
        System.out.println(obj);
    }
}

class Person {
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    //覆写toString()
    public String toString() {
        //大量拼接字符串-> StringBuffer/StringBuilder
        return "姓名:"+this.name+"  年龄:"+this.age;
    }
}

2.对象比较——equals( )

String类的equals( )方法就是覆写的Object类中的equals( )方法。

  • 要比较一个类中两个对象的属性,覆写equals( )
  1. 先判断obj是否是该类的实例(是->2)
  2. 再判断是否是与自己比较(是->3)
  3. 向下转型,取得属性并比较
/**
 * Object类的equals()
 */
public boolean equals(Object obj) {
    return (this == obj);
}
/**
 * String类的覆写equals()
 */
    public boolean equals(Object anObject) {
        //如果地址相等,则内容必然相等
        if (this == anObject) {
            return true;
        }
        //equals()中传入的是Object类的参数
        //需要先判断参数对象能否由String实例化
        //不能,则无法比较,返回false
        //能,转换 -> 比较每一个字符
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

代码示例:

/**
 * 自定义覆写equals()
 * Author:qqy
 */
public class ObjectTest2 {
    public static void main(String[] args) {
        Person per1=new Person("李四",20);
        Person per2=new Person("李四",20);
        System.out.println(per1.equals(per2));  //true
        System.out.println(per1.equals(new ObjectTest2())); //false
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    //如果不覆写equals则原equals(Object obj) 返回(this == obj)
    //相当于per1==per2
    public boolean equals(Object obj) {
        if(obj==null){
            return false;
        }
        //obj是自己(地址) —— 同一个对象
        if(obj==this){
            return true;
        }

        //判断obj是否是Person的实例
        if (!(obj instanceof Person)) {
            return false;
        }
       
        //同一个类的不同对象(内容)
        //因为Object类没有name、age属性
        //向下转型,取得Person类的name、age的属性
        Person per = (Person) obj;
        //分别比较name,age
        return per.name.equals(this.name)&&(per.age==this.age);
    }
}

3.接收引用数据类型

Object类可以接收Java所有引用数据类型的对象,包括数组、类、接口。对于基本数据类型对象,则是由jdk将基本数据类型自动装箱后,被Object类接收。

  • 类和接口等级相同,两者之间不可继承/实现,但是Java中强制要求Object可以接收接口
  • 包装类型 —— 引用数据类型

代码示例:

public class ObjectTest3 {
    public static void main(String[] args) {
        //Object接收数组对象
        Object obj = new int[]{1,3,5,7,9};
        //向下转型,需强转
        int[] data = (int[]) obj;  
        System.out.println(data[0]);  //1

        //Object接收接口对象
        IMessage msg = new MessageImpl();
        Object obj1 = msg;

        //Object中没有test(),所以将obj1向下转型
        ((IMessage) obj1).test();  //bonjour!
        System.out.println(obj1);  //默认调用to.String()  //MessageImpl@1540e19d

        //obj2接收整型(基本数据类型) —— 基本数据类型被包装为包装类型
        Object obj2 = 10;
        System.out.println(obj2);
    }
}

interface IMessage{
    void test();
}

class MessageImpl implements IMessage{
    @Override
    public void test() {
        System.out.println("bonjour!");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值