java的Object类

来源:互联网 发布:红色痘印怎么消除 知乎 编辑:程序博客网 时间:2024/05/18 02:17

Object类的描述

    Object类是类层次结构的根类,每个类都使用Object类作为超类,所有对象都实现这个类的方法。    在java中只有基本类型不是对象,例如数值、字符和布尔类型的值。但是基本类型有包装类,包装类另做介绍。

Object类的摘要

这里写图片描述

Object类中的方法

equals方法

格式:public boolean equals(Object obj)作用:检测两个对象是否相等
equals与”==”的比较
"=="比较基本数据类型就是比较其值
    String s1 = "a";    String s2 = "a";    System.out.println(s1==s2); //true    int a = 3;    int b = 3;    System.out.println(a==b); //true
"=="比较对象是比较两个对象的内存地址
    String aa = new String("aa");    String bb = new String("aa");    System.out.println(aa==bb);  //false

注意:给Integer赋予in数值在-128~127之间时直接从cache中获取,这些cache引用对Integer对象地址是不变的,但不在这个范围内的数值就会new Integer()进行创建,地址不可能一样

    Integer i1 = 1;    Integer i2 = 1;    System.out.println(i1==i2); //true    Integer i3 = 150;    Integer i4 = 150;    System.out.println(i3==i4);  //false
equals
默认情况下,equals也是比较两个对象是否指向同一块地址空间,与"=="作用一致。对于自定义的类想要比较两个对象的内容,就必须重写equals方法,子类定义的equals方法必须先调用超类的equals方法,超类的检测成功了才继续检查子类的实例域注意:如果重新定义equals方法就必须重新定义hashCode方法,以便用户可以将对象插入散列表中
public class Person {    private String name;    private Double salary;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Double getSalary() {        return salary;    }    public void setSalary(Double salary) {        this.salary = salary;    }    @Override    public int hashCode() {        final int prime = 31;        int result = 1;        result = prime * result + ((name == null) ? 0 : name.hashCode());        result = prime * result + ((salary == null) ? 0 : salary.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;        Person other = (Person) obj;        if (name == null) {            if (other.name != null)                return false;        } else if (!name.equals(other.name))            return false;        if (salary == null) {            if (other.salary != null)                return false;        } else if (!salary.equals(other.salary))            return false;        return true;    }}

equals特性

  • 自反性:对于任何非空引用x,x.equals(x)返回true
  • 对称性:x.equals(y)返回true,则y.equals(x)也应该返回true
  • 传递性:x.equals(y)返回true,y.equals(z)也返回true,则x.equals(z)也应该返回true
  • 一致性:如果x,y引用的对象没有发生改变,则反复调用x.equals(y)应该返回同样的结果
  • 对于任意非空引用x,x.equals(null)应该返回false

hashCode方法

散列码
由对象导出的一个整数值,无规律,不同对象的散列值基本不会相同
字符串和对象的散列码
字符串的散列码由内容导出,而没有自定义hashCode方法的对象的散列码是由Object类默认的hashCode方法导出的对象存储地址
String s = "OK";  //2524StringBuilder sb = new StringBuilder(s); //930384804System.out.println(s.hashCode()+" "+sb.hashCode());String t = new String("OK");  //2524StringBuilder tb = new StringBuilder(t);  //1148967021System.out.println(t.hashCode()+" "+tb.hashCode());

注意:equals与hashCode的定义必须一致,如果x.equals(y)返回true,则x.hashCode()就必须与y.hashCode()值相同。

toString方法

用于返回表示对象值的字符串
绝大多数格式
类名,后跟方括号括起的域值
toString方法的调用
直接调用 或 对象与一个字符串通过+连接起来
自定义类
如果没有重写toString方法,那么输出来的默认的字符串内容是“类名+哈希编码”System.out.println(new Person().toString());//com.zhu.Person@3c1

clone方法

> 创建并返回此对象的一个副本> 默认的clone方法执行的是浅拷贝> 如果想要深拷贝一个对象, 这个对象必须要实现Cloneable接口,实现clone方法,并且在clone方法内部,把该对象引用的其他对象也要clone一份 , 这就要求这个被引用的对象必须也要实现Cloneable接口并且实现clone方法。

finalize方法

垃圾回收其清除对象释放内存之前调用。不能依赖于使用finalize方法回收资源,因为不知何时回调用该方法。对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。

wait方法

在其他线程调用此对象的notify()或notifyAll()方法,或者中断此线程,或者设置的等待时间到达之前,当前线程等待。

notify方法

唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。

notifyAll方法

唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个 wait 方法,在对象的监视器上等待。

注释:上述关于线程的三个方法在并发出在做详细介绍

原创粉丝点击