Object类(覆写toString/equals/接收引用数据类型)

什么是Objetc类?
Object是JAVA默认提供的类。
在Java中除了Object类,所有的类都有继承关系,默认会继承Object父类,所有类对象都可以通过Object类进行接收,即向上转型。

////Object可以接收任何类
class A{}
class B{}
public class Ob
{
    public static void main(String[] args)
    {
        fun(new A()); //A@15db9742
        fun(new B()); //B@6d06d69c
    }
    public static void fun(Object obj)
    {
        System.out.println(obj);  //可以接收任何类型对象
    }
}

取得对象信息
在使用对象直接输出的时候,默认输出的是一个地址编码。如果现在使用的是String类,该类对象直接输出的是内
容,主要原因就是toString()方法的问题。

class Person
{
    private String name;
    private int age;
    public Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
}
public class Ob
{
    public static void main(String[] args)
    {
        //使用对象输出时,默认是地址编码,如果是String,向上转型后,调用String的toString(),输出的是对象内容
        fun(new Person("pick",18)); //Person@15db9742
        fun(new String("hello")); //hello
        System.out.println(new Person("pick",10));//Person@6d06d69c
    }
    public static void fun(Object obj)
    {
        System.out.println(obj); //默认输出对象调用obj.toString();
        //等同于 System.out.println(obj.toString());
    }
}

默认Object类提供的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()  //覆写toString
    {
        return this.name+" "+this.age;
    }
}
public class Ob
{
    public static void main(String[] args)
    {
        //使用对象输出时,默认是地址编码,如果是String,向上转型后,调用String的toString(),输出的是对象内容
        fun(new Person("pick",18)); //pick 18
        fun(new String("hello")); //hello
    }
    public static void fun(Object obj)
    {
        System.out.println(obj); //默认输出对象调用obj.toString();
    }
}

toString()的核心目的在于取得对象信息。
String作为信息输出的重要数据类型,在Java中所有的数据类型只要遇见了String并且执行了"+",那么都要求将其变为字符串后连接,而所有对象要想变为字符串就默认使用toString()方法。

对象比较

class Person
{
    private String name;
    private int age;
    public Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public boolean equals(Object ob)
    {
        //判断obj是否是Person实例,因为Object可以接受所有类的实例
        if(!(ob instanceof Person))  //如果形参是null,涵盖在这个条件中,即null不是Person类
        {
            return false; //obj不是Person实例,直接返回错,两个对象不是一个类就没必要比较
        }
        if(this==ob) //是同一个对象
            return true;
        Person p=(Person)ob; //需要向下转型,变回Person类,因为obj里没有Person里的属性
        return ((this.name==p.name)&&(this.age==p.age));
    }
}
public class Ob
{
    public static void main(String[] args)
    {
       Person p1=new Person("pick",18);
       Person p2=new Person("pick",18); 
       System.out.println(p1.equals(null)); //false
       System.out.println(p1.equals(p2)); //true 
       System.out.println(p1.equals(p2)); //如果没有在Person中覆写equals,将输出false,因为除了equals默认比较的对象地址
    }
}

Object接收引用数据类型
Object可以接收所有的引用类型,包括类、数组、接口。
Object 接收数组类型:

public class Ob
{
    public static void main(String[] args)
    {
        //Object接收数组类型
        Object ob=new int[]{1,2,3,4,5};  //Object接收引用数据类型
        int[] a=(int[]) ob;
        for(int num : a)
        {
            System.out.print(num+"、"); //1、2、3、4、5、
        }
    }
}

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

interface IA  //接口
{
    void func();//抽象方法,默认是public 和abstract
}
class AImpl implements IA
{
    public void func()
    {
        System.out.println("hello world");
    }
}
public class Ob
{
    public static void main(String[] args)
    {
        IA ia=new AImpl(); 
        Object ob=ia; //Object可以接收接口
        System.out.println(ob);//AImpl@15db9742
        IA a=(IA)ob; //将Object强转为IA
        a.func();//hello world
    }
}

猜你喜欢

转载自blog.csdn.net/sophia__yu/article/details/83513773