JAVA学习(object类及toString、hashCode、equals)

查看原文


object 类介绍

java.lang.Object(java.lang包在使用的时候无需显示导入,编译时由编译器自动导入。)

Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类(所有类的父类)

Object类是Java中唯一没有父类的类。

其他所有的类,包括标准容器类,比如数组,都继承了Object类中的方法。

如果你写一个封装的方法,不确定传进来的是什么类型的值,就可以使用Object作为一个笼统类


object 类中的方法


因为每一个类都直接或间接的继承object类,所以一般要重写object类中的方法 [常用:toString(),hashCode(),equals()],以实现相应的操作。接下来将用例子具体实现。

列表内容

1.String toString()


当打印引用,如调用System.out.println()时,会自动调用对象的toString()方法,打印出引用所指的对象的toString()方法的返回值,因为每个类都直接或间接地继承自Object,因此每个类都有toString()方法

原来的方法内容

public String toString(){
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public String toString(){
    return  this.getName();
}public String toString(){
    return  this.getName();
}


2.boolean equals(Object obj)

对于Object类的equals()方法来说,它判断调用equals()方法的引用于传进来的引用是否一致,即这两个引用是否指向的是同一个对象

Object类中的equals()方法如下: 

public boolean equals(Object obj){
    return (this == obj);
}

即Object类中的equals()方法等价于==。

  只有当继承Object的类覆写(override)了equals()方法之后,继承类实现了用equals()方法比较两个对象是否相等,才可以说equals()方法与==的不同。

  equals()方法需要具有如下特点:

  自反性(reflexive):任何非空引用x,x.equals(x)返回为true。

  对称性(symmetric):任何非空引用x和y,x.equals(y)返回true当且仅当y.equals(x)返回true。

  传递性(transitive):任何非空引用x和y,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)返回true。

  一致性(consistent):两个非空引用x和y,x.equals(y)的多次调用应该保持一致的结果,(前提条件是在多次比较之间没有修改x和y用于比较的相关信息)。

  约定:对于任何非空引用x,x.equals(null)应该返回为false。

  并且覆写equals()方法时,应该同时覆写hashCode()方法,反之亦然
一个应用了equal和toString方法的简单类——>

public class People {

    private String name;

//  构造方法
    public People(String name) {
        this.name = name;
    }
//  get set 方法
    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }   
//  重写toString方法
    @Override
    public String toString() {
        return this.getName();
    }
//  重写equal方法
    @Override
    public boolean equals(Object obj) {
        String name=((People)obj).getName();
        System.out.println(name);
        return this.name==name;
    }

    public static void main(String[] args) {
        People p1=new People("张三");
        People p2=new People("张三");
        People p3=new People("李四");
        System.out.println(p3);
        System.out.println("p1.equals(p2):"+p1.equals(p2));
        System.out.println("p1.equals(p3):"+p1.equals(p3));
    }
}

输出结果:

李四
张三
p1.equals(p2):true
李四
p1.equals(p3):false


3.hashCode()

hashCode方法实际上返回的就是对象的存储地址 

public class ArrayTest {

    public static void main(String[] args){

         String a = new String("aw");
        String b = new String("aw");
        String c= "aa";
        String d= "aa";
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
        System.out.println(c.hashCode());
        System.out.println(d.hashCode());
        System.out.println(a==b);//false
        System.out.println(c==d);//true
    }
}
3126
3126
3104
3104
false
true

由此可见,可见两个对象不相同,他们的hashCode值不一定不相同。

结论:
1、如果两个对象相同,那么它们的hashCode值一定要相同
2、如果两个对象的hashCode相同,它们并不一定相同
3.两个对象不相同,他们的hashCode值不一定不相同

4.两个对象的hashCode值不相同,他们一定是两个不同的对象 

参考资料:https://blog.csdn.net/sinat_34814635/article/details/79056151

你可能感兴趣的:(JAVA,JAVA基础学习,知识点总结)