JavaSE之Object类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HL_HLHL/article/details/83894982

Object类简介

Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父类。即,所有类的对象都可以使用Object进行接收。
范例:使用Object接收所有类的对象

class Father{};
class Child{};
public class Test {
    public static void main(String[] args) {
          fun(new Father());
          fun(new Child());
    }
    public static void fun(Object obj){
        System.out.println(obj);
    }
}

运行结果:
在这里插入图片描述
直接使用对象输出,默认输出一个地址编码。

Object类中的方法

在这里插入图片描述
object类中有很多方法,这里只是简单介绍几个常用的

取得对象信息->toString()

直接使用对象输出,默认输出一个地址编码。如果现在输出的是String对象,此时输出字符串内容而非地址,原因就在于String类覆写了Object的toString()方法。
范例:观察String类与Object类的输出

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) {
        fun(new Person("HL",18));
        fun("HL");
    }
    public static void fun(Object obj){
        System.out.println(obj.toString());
      //  System.out.println(obj);//系统默认会调用toString()方法,所以这两个代码是一样的
    }
}

如果觉得默认给出的toString()方法功能不足,就在需要的子类上覆写toString()方法。
范例:覆写toString()方法

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
      this.name=name;
      this.age=age;
    }
    public String toString(){
        return "姓名->"+this.name+"\n年龄->"+this.age;
    }
}
public class Test {
    public static void main(String[] args) {
        fun(new Person("HL",18));
        fun("HL");
    }
    public static void fun(Object obj){
        System.out.println(obj.toString());
    }
}

为什么object类直接使用对象输出,默认输出一个地址编码?
我们看它的内部实现就明白了,如下:

public String toString(){
       return getClass().getName()+"@"+Integer.toHexString(hashCode());
}

对象比较->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 String toString(){
        return "姓名->"+this.name+"\n年龄->"+this.age;
    }
}
public class Test {
    public static void main(String[] args) {
      Person per1=new Person("HL",18);
      Person per2=new Person("HL",18);
        System.out.println(per1==per2);//false
        System.out.println(per1.equals(per2));//false
    }
    
}

为什么两个输出的都是false呢?我们看object类中equals的实现就会明白。默认的object类中的equals()方法是比较对象的编码地址。

public boolean equals(Object obj){
  return (this==obj);
  }

所以要比较两个对象中的属性是否相等,就必须自己手动一个equals()方法来覆写object类中的equals()。
范例:

扫描二维码关注公众号,回复: 4065964 查看本文章
class Person{
    private String name;
    private int age;
    public Person(String name,int age){
      this.name=name;
      this.age=age;
    }
    public boolean equals(Object obj){
       //判断obj能否指向Person类实例
        if(!(obj instanceof Person)){
            return false;
        }
        if(obj==this){
            return true;
        }
        //向下转型,取得Person类的name与age属性
        Person per=(Person)obj;
        return per.name.equals(this.name)&&(per.age==this.age);
    }
}
public class Test {
    public static void main(String[] args) {
      Person per1=new Person("HL",18);
      Person per2=new Person("HL",18);
      System.out.println(per1.equals(per2));//true
    }
}

接收引用数据类型

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

使用Object来接收数组对象

范例:

public class Test {
    public static void main(String[] args) {
        //Object接收数组对象,向上转型
      Object obj=new int[]{1,2,3,4};
      //向下转型,需要强转
      int []data=(int[])obj;
      for(int x:data) {
          System.out.print(x + " ");
      }   
    }
}

使用Object来接收接口

范例:

interface IMessage{
    void test();
}
class MessageImp1 implements IMessage{
    public void test(){
        System.out.println("HL");
    }
}
public class Test {
    public static void main(String[] args) {
    //子类向父接口转型
        IMessage msg=new MessageImp1();
        //接口向Object转型
        Object obj=msg;
        System.out.println(obj);
    }
}

Object真正达到了参数的统一,如果一个类希望接收所有的数据类型,就是用Object完成。

猜你喜欢

转载自blog.csdn.net/HL_HLHL/article/details/83894982