Object类

Object类是所有类的父类。
在Object类中主要包括clone()、finalize()、equal()、toString()等方法。所有的类都可以重写Object类中的方法。
注意:Object类中的getClass()、notify()、notifyAll()、wait()等方法不能被重写,因为这些类被定义为final类型。
equal()方法
equals()方法的默认实现是使用“==”运算符比较两个对象的引用地址,而不是比较对象的内容,所以想要真正做到比较两个对象的内容,必须在自定义类中重写此方法。
在重写equals方法的同时,必须重写hashCode方法。

hascode()方法
hashcode方法返回该对象的哈希码值。此方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。

hashCode的存在主要是用于查找的快捷性,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。

不同的对象可能会生成相同的hashcode值,所以不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。
在重写equals方法的同时,必须重写hashCode方法。原因是:
以上的例子中,重写的equals方法中两个Person对象只要年龄相同就可以判定为同一个Person,而hashCode方法是将对象的存储地址进行映射。必须得让equals方法和hashCode方法始终在逻辑上保持一致性。

在程序执行期间,只要equals方法的比较操作用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数。

getClass()方法
getClass()方法是Object类定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。
可以将getClass()方法与toString()方法联合使用。
toString()方法
此方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际应用中通常重写toString方法,为对象提供一个特定的输出模式。

class Person
{
    private int age;
    Person(int age)
    {
        this.age=age;
    }   
    public boolean compare(Person p)
    {
        return this.age==p.age;
    }
    /*复写,重写equals方法
    一般都会覆盖此方法,根据对象的特有内容,建立判断对象是否相同的依据。
    */
    public boolean equals(Object obj)
    {
        if(!(obj instanceof Person))
        {
            throw new ClassCastException("类型错误");
        }
        Person p=(Person)obj;
        return this.age==p.age;
    }   
    public int hashCode()
    {
        return age;
    }
}

class ObjectDemo
{
    public static void main(String[] args)
    {
        Person p1=new Person(20);
        Person p2=new Person(20);
        Person p3=p1;

        System.out.println(p1==p2);//false
        System.out.println(p1.equals(p2));//false  也是比较地址
                                            //复写后隐藏了子类的特性
        System.out.println(p1.equals(p3));//true

        System.out.println(Inter.toHexString(p1.hashCode()));

        System.out.println(p1);//Person@61de33   默认调用了toString  p1.toString
        System.out.println(p1.getClass().getName()+"$"+Integer.Inter.toHexString(p1.hashCode());//Person$61de33
    }
}
/*重写toString()方法*/
public class ObjectInstance{
    public String toString(){
        return "在"+getClass().getName()+"类中重写toString()方法";
    }
    public static void main(String[] args){
        System.out.println(new ObjectInstance());
    }
}
### Object 的作用 在 Java 中,`Object` 是所有的根。每个无论是否显式声明继承,都会直接或间接继承自 `Object` 。这使得 `Object` 的方法能够被所有对象使用,提供了基础功能支持。`Object` 的定义确保了所有对象都具备一些通用的行为,例如对象的比较、克隆、字符串表示等。 ### 常见方法及使用 #### 1. `toString()` 此方法返回对象的字符串表示形式。默认情况下,返回的字符串格式为 `名@哈希码`,例如 `java.lang.Object@1b6d3586`。在实际开发中,通常会重写此方法以提供更有意义的对象描述。 示例: ```java Object obj = new Object(); System.out.println(obj.toString()); // 输出:java.lang.Object@哈希码 ``` 重写示例: ```java @Override public String toString() { return "Custom String Representation"; } ``` #### 2. `equals(Object obj)` 默认情况下,`equals()` 方法用于比较两个对象的引用是否指向同一个对象实例。然而,在实际开发中,通常需要根据对象的实际属性来判断相等性,因此需要重写此方法。例如,当对象被存储在 `Map` 或 `Set` 中时,如果两个对象的 `hashCode()` 相同,则会调用 `equals()` 方法进行进一步比较。 #### 3. `hashCode()` 此方法返回对象的哈希码值。通常与 `equals()` 方法一起重写,以确保两个相等的对象具有相同的哈希码。这对于基于哈希的集合(如 `HashMap` 和 `HashSet`)的正确行为至关重要。 #### 4. `clone()` 此方法用于创建并返回对象的一个副本。要使用此功能,需要实现 `Cloneable` 接口并重写 `clone()` 方法,否则会抛出 `CloneNotSupportedException` 异常。 #### 5. `getClass()` 此方法返回运行时的 `Class` 对象,可以用于反射操作。 #### 6. `notify()` 和 `wait()` 这些方法用于线程间的协作。`wait()` 方法使当前线程等待,直到另一个线程调用 `notify()` 或 `notifyAll()` 方法。 ### Object 的重要性 由于 `Object` 是所有的超,因此它提供了一种统一的方式来处理所有对象。例如,可以通过 `Object` 型的引用变量来引用任何型的对象,从而实现多态性。 此外,`Object` 提供的方法为对象的基本操作奠定了基础。例如,`toString()` 方法使得对象可以以字符串形式输出,便于调试;`equals()` 和 `hashCode()` 方法确保了对象在集合中的正确行为;`clone()` 方法提供了对象复制的机制。 ### 示例代码 以下是一个重写 `toString()` 和 `equals()` 方法的示例: ```java public 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 "Person{name='" + name + "', age=" + age + "}"; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person person = (Person) obj; if (age != person.age) return false; return name != null ? name.equals(person.name) : person.name == null; } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值