一、Object类
Object类是java中所有类的超类,可以使用 Obect 类型的变量引用任何类型的对象
注意:java中只有基本类型(字符,数值,布尔)不是对象,其他包括数组都是对象
(1)equals 方法
Object类中equals() 方法用于判断两个对象是否具有相同的引用,一般无意义,而是常常需要检测两个对象状态的相等性。
使用 instanceof 代码示例:
@Override
public int hashCode() {
return Objects.hash(name, salary);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Employee))
return false;
Employee other = (Employee) obj;
return Objects.equals(name, other.name)
&& Double.doubleToLongBits(salary) == Double.doubleToLongBits(other.salary);
//other.getSalary()==getSalary()
}
使用 getClass() 代码示例:
@Override
public int hashCode() {
return Objects.hash(name, salary);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Employee other = (Employee) obj;
return Objects.equals(name, other.name)
&& Double.doubleToLongBits(salary) == Double.doubleToLongBits(other.salary);
//other.getSalary()==getSalary()
}
instanceof | getClass() |
---|---|
是否属于该类或者其子类 | 是否是同一个类,不考虑继承 |
由继承父类的唯一特征决定,ID,身份证等 | 子类有自己的相等概念 |
可以父子类做比较 | 只能同一个类进行比较 |
- 使用==比较基本类型域
- 使用equals比较对象域
- Arrays.equals() 比较数组
注:==与equals区别
基本数据类型: ==比较值不比较地址,不能使用equals
引用数据类型: ==比价地址,equals比较值
Objects.equals(a,b)
如果ab都为null,返回true;其中之一为null,返回false;否则返回e.equals(b)- 重新定义equals方法必须重新定义hashCode方法,以便用户可以将对象插入到散列表中
(2)toString方法
Object类中的toString方法打印输出类名和散列码,大多数情况需要这样定义格式:类名,方括号括起来域值Employee [name=a, salary=1.0]
Employee中代码示例:
@Override
public String toString() {
return getClass().getName()+" [name=" + name + ", salary=" + salary + "]";
}
Manager中代码示例:
@Override
public String toString() {
return super.toString()+"[bonus=" + bonus + "]";
}
- 只要对象与一个字符串用“+“连接,就自动调用toString方法
- println会直接调用toString方法
- 应该为每一个类重写toString方法
注:数组继承了Object类的toString,所以会照旧打印。解决方法就是使用Arrays.toSting() 方法
getClass().getName()
返回对象类名getClass.getSuperclass()
返回对象超类名