Object类的使用

  • Object类是所有Java类的根父类 。
  • 数组也作为Object类子类出现,可以调用Object类中声明的方法;
  • 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
  • Object类中的功能(属性、方法)就具通用性。

    • 属性:无
    • 方法:equals() 、 toString()、 getClass() 、hashCode()、 clone() 、 finalize()、 wait() 、notify()、notifyAll()
  • Object类只声明了一个空参的构造器

equals方法

  • 是一个方法,而非运算符,所以只能适用于引用数据类型
  • Object类中equals()的定义:

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

  • 说明:
    • Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同;即两个引用是否指向同一个对象实体
    • 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的”实体内容”是否相同。
    • 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的”实体内容”是否相同。那么,我们就需要对Object类中的equals()进行重写。
    • 重写的原则:比较两个对象的实体内容是否相同.

例:
//手写——-有漏洞:当子类对象和父类对象的属性赋值相等时,子类对象.equals(父类对象)会返回true
class Order{
private int orderId;
private String orderName;
@Override
public boolean equals(Object obj) {
if(this == obj){//比较的类与本类所指向的堆空间相同
return true;
}

if(obj instanceof Order){
Order order = (Order)obj;
return this.orderId == order.orderId && this.orderName.equals(order.orderName); //String类的equals方法已重写
}

return false;
}
}

  • == 运算符和equal()的不同:

    • 可以使用在基本数据类型变量和引用数据类型变量中
    • 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)
    • 如果比较的是引用数据类型变量:比较两个对象的地址值是否相同(即两个引用是否指向同一个对象实体)。
    • 补充: == 符号在比较引用数据类型变量时,必须保证符号左右两边的变量类型一致。(可以是子父类,不能是无关类)

      toString() 方法 :

  • toString()方法在Object类中定义,其返回值是String类型,返回类名和它的引用地址。

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

  • 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()

Customer cust = new Customer(“Tom”,21);
System.out.println(cust.toString());//com.atguigu.java1.Customer@15db9742—>Customer[name = Tom,age = 21]
System.out.println(cust);//com.atguigu.java1.Customer@15db9742—>Customer[name = Tom,age = 21]

  • 在进行String与其它类型数据的连接操作时,自动调用toString()方法

Date now=new Date();
System.out.println(“now=”+now);
相当于 System.out.println(“now=”+now.toString());

  • 可以根据需要在用户自定义类型中重写toString()方法 如String 类重写了toString()方法,返回字符串的值。

s1=“hello”;
System.out.println(s1);//相当于System.out.println(s1.toString());
S1=null;
System.out.println(s1)//null
System.out.println(s1.toString)//空指针异常

  • 基本类型数据转换为String类型时,调用了对应包装类的toString()方法

int a=10;
System.out.println(“a=”+a);

  • Java中,当打印一个数组名(除char型数组名)时,默认调用obj.toString,也就输出了地址。

char[] arr = new char[] { ‘a’, ‘b’, ‘c’ };
System.out.println(arr);// abc

int[] arr1 = new int[] { 1, 2, 3 };
System.out.println(arr1);// [I@15db9742

double[] arr2 = new double[] { 1.1, 2.2, 3.3 };
System.out.println(arr2);// [D@6d06d69c