Object类概述

本文深入探讨了Java.lang.Object类的构造方法、常见成员方法及其重要性,包括hashCode、getClass、toString、equals和clone方法。重点阐述了这些方法在实际编程中的应用与实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.lang.Object
1.java.lang包在使用的时候无需显示导入,编译时由编译器自动导入。
2.Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类。
3.Object类是Java中唯一没有父类的类。其他所有的类,包括标准容器类,比如数组,都继承了Object类中的方法。

构造方法
public Object()
Object类只有这一个构造方法,并且是无参构造,回想之前写构造方法方面的东西时有这样一句话:子类构造方法默认访问的是父类无参构造方法。或许原因就在这!

常见成员方法
1.public int hashCode()
返回该对象的哈希码值
注意:哈希值是根据哈希算法计算出来的值,这个值跟地址有关,但不是实际地址值,可以理解为地址值。(对应关系)

class Demo{//省略了“extends Object”

}
public class HashCodeDemo {
    public static void main(String[] args) {
        Demo d1=new Demo();
        Demo d2=new Demo();
        Demo d3=d1;
        System.out.println(d1.hashCode());//366712642
        System.out.println(d2.hashCode());//1829164700
        System.out.println(d3.hashCode());//366712642
    }
}

2.public final Class getClass()
返回此 Object 的运行时类。

Class类下也有一方法:public String getName()
以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

package blog_05;
class Demo{

}
public class GetClassDemo {
    public static void main(String[] args) {
        Demo d1=new Demo();
        Class c=d1.getClass();
        String str=c.getName();
        //链式编程:String str=d1.getClass().getName();
        System.out.println(str);//输出:blog_05.Demo

    }
}

3.public String toString()
返回该对象的字符串表示
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
由于此方法意义不大,所以建议子类重写该方法

package blog_05;
class Demo{

}
public class ToStringDemo {
    public static void main(String[] args) {
        Demo d1=new Demo();
        System.out.println(d1.toString());
        System.out.println(d1.getClass().getName() + '@' 
                + Integer.toHexString(d1.hashCode()));

    }
}
//输出:
//blog_05.Demo@15db9742
//blog_05.Demo@15db9742

eclipse提供的重写:

package blog_05;
class Demo{
    private int age;
    private String name;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Demo [age=" + age + ", name=" + name + "]";
    }//eclipse提供的重写

}
public class ToStringDemo {
    public static void main(String[] args) {
        Demo d1=new Demo();
        d1.setAge(18);
        d1.setName("huge");
        System.out.println(d1.toString());//Demo [age=18, name=huge]
        System.out.println(d1);//Demo [age=18, name=huge]
        //可见直接输出也是调用的对象的toString()方法

    }
}

4.public boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。
默认情况下比较的是地址值,意义不大,子类一般重写该方法。
源码:

public boolean equals(Object obj) {
        return (this == obj);//比较对象地址是否相同
    }

举例:

package blog_05;
class Demo{
    private int age;
    private String name;

    public Demo() {
        super();
    }
    public Demo(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }   
}
public class EqualsDemo {
    public static void main(String[] args) {
        Demo d1=new Demo(18,"huge");
        Demo d2=new Demo(18,"huge");
        Demo d3=d1;
        System.out.println(d1.equals(d2));//false
        System.out.println(d1.equals(d3));//true


    }
}

eclipse提供的重写:

package blog_05;
class Demo{
    private int age;
    private String name;

    public Demo() {
        super();
    }
    public Demo(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Demo other = (Demo) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }   

}
public class EqualsDemo {
    public static void main(String[] args) {
        Demo d1=new Demo(18,"huge");
        Demo d2=new Demo(18,"huge");
        Demo d3=d1;
        System.out.println(d1.equals(d2));//true
        System.out.println(d1.equals(d3));//true


    }
}

5.protected Object clone()
Creates and returns a copy of this object.
Object类中的说明是:
protected Object clone()throws CloneNotSupportedException
这个方法比较特殊:
  首先,使用这个方法的类必须实现java.lang.Cloneable接口,否则会抛出CloneNotSupportedException异常。
  Cloneable接口中不包含任何方法,所以实现它时只要在类声明中加上implements语句即可。
  第二个比较特殊的地方在于这个方法是protected修饰的,覆写clone()方法的时候需要写成public,才能让类外部的代码调用。
参考链接:
http://www.cnblogs.com/mengdd/archive/2013/01/03/2842809.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值