Java

Object类及其常用方法简介

Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类。

这里主要总结Object类中的三个常用方法:toString()、equals()、hashCode()

/**
 * 使用当前类测试Object相关方法
 * @author QAIU
 *
 */


public class Demo {
    public static void main(String[] args) {
        Point p = new Point(1, 2);
        /*
         * System.out.println(Object obj)
         * 该方法将给定的对象输出到控制台时,
         * 会调用该对象的toString将返回的字符串输出
         * 而Object定义的toString返回的字符串
         * 格式:类名@地址
         * 这对于实际应用中意义不大.
         */
        System.out.println(p);
        /*
         * 任何引用类型和字符串连接结果都是字符串
         * 而java运行时实际操作是调用其toString方法
         * 将返回的字符串与字符串连接的
         */
        String str = "point:" + p;
        System.out.println(str);
        
        Point p2 = new Point(1, 2);    
        /*
         * 对于引用类型而言,我们判断相等有两种方式,第一种是"=="
         * "=="成为等值判断,是比较两个变量的值是否相等
         * 对于引用类型而言,变量存的是地址,所以当"=="为true时
         * 说明两个引用指向的是同一个对象
         */
        System.out.println(p==p2);//false
        
        /*
         * 第二种是"equals"方法
         * equals方法是Object定义的方法,
         * 设计意图是比较两个引用类型变量指向的对象"内容相等"
         * 但是该方法需要重写,因为Object提供的该方法内部使用"=="比较的
         * 不重写没有任何意义
         */
        System.out.println(p.equals(p2));//true
    
        Integer aInteger;
        
    }
}

class Point {
    private int x;
    private int y;
    
    /**
     * @param x
     * @param y
     */
    public Point(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }
    

    public int getX() {
        return x;
    }


    public void setX(int x) {
        this.x = x;
    }


    public int getY() {
        return y;
    }


    public void setY(int y) {
        this.y = y;
    }

    /**
     * 重写toString方法,该方法经常被我们调用的API使用
     * 例如:System.out.println()
     * 重写该方法的原则:
     * 返回字符串的应当包含当前对象的相关信息
     * 具体格式没有要求,可以结合需求而定.
     */
    @Override
    public String toString() {
        return "("+x+","+y+")";
    }


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + x;
        result = prime * result + y;
        return result;
    }


    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Point other = (Point) obj;
        if (x != other.x)
            return false;
        if (y != other.y)
            return false;
        return true;
    }
    
}

hashcode() 函数 <暂时是做了解,用到再说>

hashcode值是通过哈希函数生成的散列表某些时候可能是一个对象的地址

不同的对象可能会产生相同的hashcode,所以不能通过hashcode直接判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。
也就是说对于两个对象,如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等;
如果equals方法得到的结果为false,则两个对象的hashcode值不一定不同;
如果两个对象的hashcode值不等,则equals方法得到的结果必定为false;
如果两个对象的hashcode值相等,则equals方法得到的结果未知。

评论

This is just a placeholder img.