JavaSE——三个特殊的类(4)

Object

1.Object简述

       Object是Java默认提供的一个类。Java里除了Object类,所有的类都是存在继承关系的,默认会继承Object父类,也就是说,所有类的对象都可以用Object来接收。如下

class Person{};
class Student{};
public class P1 {
    public static void main(String[] args) {
        fun(new Person());
        fun(new Student());
    }
    public static void fun(Object obj){
        System.out.println(obj);
    }
}
//输出
//Person@1b6d3586
//Student@4554617c

所以在开发中,Object类是最高的参数统一化,同时Object类中存在一些定义好的方法,如下

No. 方法名称 类型 描述
1. public Object() 构造 无参构造为子类服务
2. public String toString() 普通 取得对象信息
3. public boolean equals(Object obj) 普通 对象比较

2.取得对象信息

在使用对象直接输出的时候,默认输出的是一个地址编码,如果现在使用的是String类,该类对象直接输出的是内容,如下

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("xiaokeai",18));//Person@1b6d3586
        fun("Hello");//Hello
    }
    public static void fun(Object obj){
        System.out.println(obj.toString());//默认输出对象调用的就是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;
    }
    @Override
    public String toString(){
        return "名字:" + this.name + "  年龄:" + this.age;
    }
}

public class test{
    public static void main(String[] args) {
        fun(new Person("xiaokeai",18));//名字:xiaokeai  年龄:18
        fun("Hello");//Hello
    }
    public static void fun(Object obj){
        System.out.println(obj.toString());//默认输出对象调用的就是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;
    }
    @Override
    public String toString(){
        return "名字:" + this.name + "  年龄:" + this.age;
    }
}

public class test{
    public static void main(String[] args) {
        String msg = "Hello" + new Person("xiaokeai",18);
        System.out.println(msg);//Hello名字:xiaokeai  年龄:18
    }
}

3.对象比较

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;
    }
    @Override
    public String toString(){
        return "名字:" + this.name + "  年龄:" + this.age;
    }
    @Override
    public boolean equals(Object obj){
        //对象判空
        if(obj == null){
            return false;
        }
        //判断是不是当前对象
        if(this == obj){
            return true;
        }
        //判断是不是Person类对象
        if(!(obj instanceof Person)){
            return false;
        }
        //是当前类对象
        //向下转型比较属性值
        Person person = (Person)obj;
        return this.name.equals(person.name) && this.age == person.age;
    }
}

public class test{
    public static void main(String[] args) {
        Person per1 = new Person("zoujier",18);
        Person per2 = new Person("zoujier",18);
        System.out.println(per1.equals(per2));
    }
}

4.接收引用数据类型

Object是所有类的父类,它的特点不仅限于此,他可以接收所有数据类型,包括:类、数组、接口。

//使用Object来接收数组对象
public class test{
    public static void main(String[] args) {
        //object接收数组对象,向上转型
        Object obj = new int[]{1,2,3,4,5,6};
        //向下转型,需要强转
        int[] data = (int[])obj;
        for(int i = 0;i < data.length; i ++){
            System.out.println(data[i]);
        }
    }
}
//输出结果
//1
//2
//3
//4
//5
//6

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

//使用Object接收接口对象
interface IMessage{
    public void getMessage();
}

class MessageImpl implements IMessage{
    @Override
    public String toString(){
        return "i am father";
    }
    public void getMessage(){
        System.out.println("我是大帅哥");
    }
}

public class test{
    public static void main(String[] args) {
        //子类向父接口转型
        IMessage msg = new MessageImpl();
        //接口向Object转型
        Object obj = msg;
        System.out.println(obj);
        //强制转换类型
        IMessage temp = (IMessage) obj;
        temp.getMessage();
    }
}
//输出
//i am father
//我是大帅哥

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

猜你喜欢

转载自blog.csdn.net/LiLiLiLaLa/article/details/84996474