6.2 Object类

在开始学习使用class关键字定义类时,就应用到了继承原理,因为在Java中所有的类都直接或间接继承了java.lang.Object类。Object类是比较特殊的类,它是所有类的父类,是Java类层中的最高层类。用户创建一个类时,除非已经指定要从其他类继承,否则它就是从java.lang.Object类继承而来的。

Java中的每个类都源于java.lang.Object类,如String类、Integer类等都是继承于Object类。除此之外,自定义的类也都继承于Object类。由于所有类都是Object类的子类,所以在定义类时可省略extends Object。

class Anything{} 等价于 class Anything(extends Object{}

//定义类时可以省略extends Object

在Object类中,主要包括clone()、finalize()、equals()、toString()等方法,其中常用的两个方法为equals()和toString()方法。由于所有的类都是Object类的子类,所以任何类都可以重写Object类中的方法。

注意:

Object类中的getClass()、notify()、notifyAll()、wait()等方法不能被重写,因为这些方法被定义为final类型。

下面详细讲述Object类中的几个重要方法。

1.getClass()方法

getClass()方法是Object类定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。语法如下:

getClass().getname();

可以将getClass()方法与toString()方法联合使用。

2.toString()方法

toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际的应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString(方法。

【例1】让学生自我介绍

创建Student类,重写toString()方法,使该类的对象可以自定义输出自己的姓名和年龄。

java 复制代码
public class Student{
    String name;
    int age;

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

    public String toString(){
        return "我叫"+name +",今年"+age+"岁。";
    }

    public static void main(String[] args){
        Student s1 = new Student("张三",16);
        System.out.println(s1);
        Student s2 = new Student("李四",19);
        System.out.println(s2);
    }
}

运行结果如下:

我叫张三,今年16岁。

我叫李四,今年19岁。

3.equals()方法

在Java语言中,有两种比较对象的方式,分别为"=="运算符与equals()方法。两者的区别在于:"=="比较的是两个对象引用内存地址是否相等,而equals()方法比较的是两个对象的实际内容。来看下面的实例。

【例2】根据身份证号判断是否为同一人

为People类创建身份证号和姓名两个属性,重写equals()方法,仅以身份证号作为区分条件。创建n个People对象,用equals()方法和"=="运算符来判断是否存在多个对象代表同一个人。

java 复制代码
public class People {
    int id;    //身份证号
    String name;    //名字

    public People(int id,String name){
        this.id = id;
        this.name = name;
    }

    public boolean equals(Object obj){    //重写Object类的equals()方法
        if(this == obj)    //如果参数与本类是同一个对象
            return true;
        if(obj == null)    //如果参数是null
            return false;
        if(getClass() != obj.getClass())    //如果参数与本类类型不同
            return false;
        People other = (People) obj;    //将参数强转成本类对象
        if (id!=other.id)    //如果两者的身份证号不相等
            return false;
        return true;
    }

    public String toString(){    //重写Object类的toString()方法
        return name;    //只输出名字
    }

    public static void main(String[] args){
        People p1 = new People(220,"tom");
        People p2 = new People(220,"汤姆");
        People p3 = new People(330,"张三");
        Object o = new Object();

        System.out.println(p1+"与"+p2+"是否为同一人?");
        System.out.println("equals()方法的结果:"+p1.equals(p2));
        System.out.println("==运算符的结果:"+(p1==p2));

        System.out.println();
        System.out.print(p1+"与"+p3+"是否为同一人?");
        System.out.println(p1.equals(p3));

        System.out.print(p1+"与"+0+"是否为同一人?");
        System.out.println(p1.equals(o));
    }
}

运行结果如下:

tom与汤姆是否为同一人?

equals()方法的结果:true

==运算符的结果:false

tom与张三是否为同一人? false

tom与java.lang.Object@48cf768c是否为同一人? false

从这个结果可以看出,"tom"和"汤姆"虽然名字不同,但是两者的身份证号相同,所以equals()方法判断出了这两个对象实际上是同一个,而"=="运算符无法做出有效判断。如果两个对象的身份证号不同,或者两个对象类型都不同,equals()方法就会认为两者不是同一个人。

相关推荐
MichaelIp2 小时前
Python同步vs异步性能对比实验-2
开发语言·python·性能优化·可用性测试
程序员爱钓鱼2 小时前
Python编程实战:综合项目 —— Flask 迷你博客
后端·python·面试
程序员爱钓鱼2 小时前
Python编程实战:综合项目 —— 迷你爬虫项目
后端·python·面试
Eric_Makabaka2 小时前
微服务重要知识点
java
white-persist2 小时前
二进制movl及CTF逆向GDB解析:Python(env)环境下dbg从原理到实战
linux·服务器·开发语言·python·网络安全·信息可视化·系统安全
Michelle80232 小时前
24大数据 while循环
大数据·python
脏脏a2 小时前
类和对象(下):初始化列表、静态成员与友元深度解析
开发语言·c++
lkbhua莱克瓦242 小时前
Java进阶——集合进阶(MAP)
java·开发语言·笔记·github·学习方法·map