Java初学-Object类

Java初学7.1-Object类

在Java中,Object 类是最基础的类,所有其他的类都是直接或间接地继承自 Object 类。这意味着 Object 类提供了所有 Java 对象的基本功能和行为。以下是一些关键的概念和方法:

Object 类的构造函数

Object 类有一个无参构造函数,它没有任何特殊的行为。这个构造函数主要是为了满足 Java 类继承体系的要求,因为每一个类至少需要一个构造函数。

Object 类的关键方法

Object 类提供了一系列的核心方法,这些方法对于实现类的行为至关重要。以下是一些常用的方法:

toString()

作用:返回对象的字符串表示形式。

默认实现:返回类名@十六进制哈希码的形式。

开发者经常重写此方法以提供更有意义的字符串表示。

equals(Object obj)

作用:比较两个对象是否相等。

默认实现:比较两个对象的引用是否相同。

当需要基于对象的内容来比较时,通常会重写此方法。

hashCode()

作用:返回对象的哈希码值。

默认实现:基于对象的内存地址计算出一个整数值。

如果重写了 equals 方法,通常也需要重写 hashCode 方法,以保持一致性。

clone()

作用:创建并返回对象的一个浅拷贝。

默认实现:此方法抛出 CloneNotSupportedException。

若要启用对象的克隆,需要实现 Cloneable 接口并重写此方法。

finalize()

作用:垃圾回收前的一个机会,可以清理资源。

默认实现:不执行任何操作。

一般不建议开发者直接调用或重写此方法,因为它的执行时间和环境有关,不可预测。

getClass()

作用:返回对象所属类的 Class 对象。

此方法常用于反射编程。

notify() 和 notifyAll()

作用:唤醒等待线程。

这些方法与同步控制和线程通信有关。

wait()

作用:使当前线程等待,直到被唤醒或其他条件满足。

与 notify() 和 notifyAll() 配合使用,实现线程间的同步。

synchronized 关键字

虽然不是 Object 类的方法,但与 Object 类相关联,用于实现对象级别的锁。

总结

Object 类是Java中所有类的基础,提供了核心的、通用的行为和功能。理解 Object 类及其方法对于深入掌握Java编程非常重要,尤其是在进行对象的比较、字符串表示、克隆、线程同步等操作时。

==与equals的比较:

== 运算符

== 运算符用于比较两个变量的引用是否指向内存中的同一个对象。换句话说,它检查的是两个变量是否引用同一个对象实例。对于基本数据类型(如 int, double 等),== 直接比较它们的值是否相等。

Integer a = new Integer(5);

Integer b = new Integer(5);

System.out.println(a == b); // 输出 false,因为a和b指向不同的对象

//此时判断地址值是否相等,也就是是否指向同一对象。

int c = 5;

int d = 5;

System.out.println(c == d); // 输出 true,因为c和d的值相等

总的来说,==既可以判断基本类型,判断比较对象的值是否相等。也可以判断引用类型,比较两者的地址值是否相等,即判断是否指向同一对象。

equals 方法

equals 方法则用于比较两个对象的内容是否相等。它是由 Object 类定义的,所有Java类都继承了这个方法。默认情况下,Object 类中的 equals 方法的行为与 == 运算符相同,即比较引用。

然而,许多类(如 String, Integer, Date 等)重写了 equals 方法,使其比较对象的内容。例如:

String str1 = new String("Hello");

String str2 = new String("Hello");

System.out.println(str1.equals(str2)); // 输出 true,因为str1和str2的内容相等

Integer num1 = new Integer(5);

Integer num2 = new Integer(5);

System.out.println(num1.equals(num2)); // 输出 true,因为num1和num2的值相等

注意事项

使用 equals 比较 null:equals 方法可以安全地与 null 对象一起使用,因为如果对象是 null,equals 将返回 false。而 == 比较 null 则不会抛出异常,但它仅在两边都是 null 时返回 true。

重写 equals 方法:如果创建自己的类并希望使用 equals 方法比较对象的内容,应该重写 equals 方法。同时,如果重写了 equals 方法,通常还需要重写 hashCode 方法,以保持一致性。

性能考虑:对于基本类型和字符串字面量,使用 == 更快,因为它是直接比较值或引用。对于对象,equals 方法可能涉及更复杂的逻辑,因此可能会慢一些。

equals方法

equals方法的基本格式如下:

boolean isEqual = object1.equals(object2);

这里的object1是你想要比较的第一个对象,而object2是第二个对象。object2必须是object1的类型或者是其子类的实例,否则会抛出ClassCastException。

注意以下几点:

不要使用==比较对象: ==运算符用于比较两个对象引用是否指向内存中的同一个对象。如果你想比较对象的内容而不是它们的引用,应该使用equals方法。

null值检查:在调用equals方法前,最好检查对象是否为null,因为null值没有equals方法,尝试调用会抛出NullPointerException。你可以这样检查:

if (object1 != null && object1.equals(object2)) {

   // ...

}

默认情况下(没有重写的情况,String类除外),Object 类中的 equals 方法的行为与 == 运算符相同,即比较引用:

String str1 = new String("Hello");

String str2 = new String("Hello");

System.out.println(str1.equals(str2));//此时返回false,二者的地址值不同

要想equals比较内容,就需要在类中的重写equals方法。

重写equals方法

如果创建了自己的类,并且想让这个类的实例能够通过equals方法进行有意义的比较,需要在类中重写equals方法。重写时,通常还需要重写hashCode方法以保持一致性。

public class Person {

    private String name;

    private int age;

    public Person(String name, int age) {

        this.name = name;

        this.age = age;

    }

    @Override

    public boolean equals(Object obj) {

        if (this == obj) {

            return true;

        }

        if (obj == null || getClass() != obj.getClass()) {

            return false;

        }

        Person other = (Person) obj;//向下转型

        return name.equals(other.name) && age == other.age;

    }

    @Override

    public int hashCode() {

        return Objects.hash(name, age);

   }

}

在这个例子中,equals方法比较了Person对象的name和age属性,而hashCode方法则生成了基于这些属性的哈希码。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值