三个特殊类——Object类:

三个特殊类——Object类:

一、Object类介绍:

  • Object类是Java默认提供的一个类;
  • 在Java中,除了Object类,其他所有的类都存在着继承关系,默认继承的类是Object类;
  • 所有类的对象都可以使用Object类接收;
  • 在开发中,Object类是参数的最高统一类型(实现了参数统一化,也就是说所有类都可以通过向上转型变为Object类);

[示例1]:
使用Object类接收所有类的对象

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

1.1 在Object类中已经实现好的方法:
在这里插入图片描述

二、取得对象信息(toString()方法):

<1>、在使用对象直接输出的时候,默认输出的是一个地址编码;如果使用的是String()类,该类对象直接输出内容,因为String类重新覆写了toString()方法,实例如下:

class Person{
    private String name;
    private int age;
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
}
public class test2{
    public static void main(String[] args) {
        //调用了类的对象——默认输出地址编码
        fun(new Person("zhangsan",20));
        //调用String类对象——直接输出内容
        fun("hello");
    }
    public static void fun(Object obj){
        //取得对象内容:
        //系统会默认调用对象的toString()方法,所以写与不写效果一样。
        System.out.println(obj.toString());
        //System.out.println(obj);
    }
}

输出结果:

在这里插入图片描述

<2>、通过上面的代码,会发现Object类提供的toString()方法默认得到的是一个对象的地址(注意:所有类的对象调用toString()方法得到的都是一个地址编码),如果认为默认的toString()方法功能不足,可以通过在需要的子类中覆写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 "姓名:"+name+"; 年龄:"+age;
    }
}
public class test2{
    public static void main(String[] args) {
        fun(new Person("zhangsan",20));
        fun("hello");
    }
    public static void fun(Object obj){
        //此时调用的就是覆写之后的toString()方法:
        System.out.println(obj.toString());
    }
}

输出结果:
在这里插入图片描述

[小总结]:

	toString()的核心目的在于取得对象信息!

<3>、String作为信息输出的重要数据类型,在Java中所有的数据类型只要遇见了String并且执行了"+",那么就会将其变为字符串后进行拼接。而所有对象要想变为字符串默认使用的是toString()方法:

——观察toString()方法:

class Person{
    private String name;
    private int age;
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    //在子类中进行toString()方法的覆写:
    @Override
    public String toString() {
        return "姓名是:"+this.name+"; 年龄是:"+this.age;
    }
}
public class test2{
    public static void main(String[] args) {
        String str  = "hello"+new Person("张三",20);
        fun(str);
    }
    public static void fun(Object obj){
        //打印的是覆写后的toString()方法:
        System.out.println(obj.toString());
    }
}

[注意]:

如果没有在需要的子类中覆写toString()方法,输出结果就是:

三、对象比较(equals()方法):

<1>、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;
        }
        //Object类 > Person类;向下转型,进行属性值的比较:
        Person person = (Person) obj;
        return this.name.equals(person.name) && this.age == person.age;
    }
}

public class test2{
    public static void main(String[] args) {
        Person per1 = new Person("张三",20);
        Person per2 = new Person("张三",20);
        System.out.println(per1.equals(per2));
    }
}

四、Object接收引用数据类型(类、数组、接口):

<1>、Object类接收数组:

public class test2{
    public static void main(String[] args) {
        //代码从右往左看:
        //Object类接收数组对象,小—>大进行向下转型:
        Object obj = new int[]{1,2,3,4,5,6};
        //大—>小,向下转型,需要进行强转!
        int[] data = (int[]) obj;
        for(int i: data){
            System.out.print(i+"、");
        }
    }
}

<2>、Object类接收接口对象:

  • 在Java中,Object类接收接口对象是强制要求的,因为接口本身是不继承任何类的!
  • Object类真正达到了参数的统一,可以通过使用Object类接收所有的数据类型!

——例如:
在这里插入图片描述

interface IMessage{
    //在接口中,只声明方法,而是在子类中实现方法体:
    public void getMessage();
}

class MessageImpl implements IMessage{
    @Override
    public String toString() {
        return "hello";
    }
    @Override
    public void getMessage() {
        System.out.println("world!!!");
    }
}
public class test2{
    public static void main(String[] args) {
        // ① 子类向父类接口转型:
        IMessage msg = new MessageImpl();
        // ② 接口向Object转型:
        Object obj = msg;
        //会调用toString()方法:
        System.out.println(obj);
        // ③
        // ‘强制类型转换:
        IMessage tmp = (IMessage) obj;
        tmp.getMessage();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值