java.lang.Object类
1.Object类是所有Java类的根父类
2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
3.Object类中的功能(属性、方法)就具有通用性。
属性:无
方法:equals() / toString() / getClass() /hashCode() / clone() / finalize()
wait() 、 notify()、notifyAll()
4.Object类只声明了一个空参的构造器
面试题:
final、finally、finalize的区别?
- 前两个是关键字,finalize是方法名。
- 对象在回收之前回调用finalize方法,我们不要主动调用。
- 由垃圾回收器调用finalize方法即可。
equals方法:
面试题:==和equals的区别
一、回顾 == 的使用:
== :运算符
- 可以使用在基本数据类型变量和引用数据类型变量中
如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)
如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
补充: == 符号使用时,必须保证符号左右两边的变量类型一致(否则编译不通过!)。
二、equals()方法的使用:
是一个方法,而非运算符
只能适用于引用数据类型
Object类中equals()的定义:
1 2 3
| public boolean equals(Object obj) { return (this == obj); }
|
说明:Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是
两个引用的地址是否相同,而是比较两个对象的”实体内容”是否相同。
通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的”实体内容”是否相同。那么,我们
就需要对Object类中的equals()进行重写.
重写的原则:比较两个对象的实体内容是否相同.
重写的原则:比较两个对象的实体内容(即:name和age)是否相同
1. 手动实现equals()的重写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| @Override public boolean equals(Object obj) {
if (this == obj) { return true; } if(obj instanceof Customer){ Customer cust = (Customer)obj;
return this.age == cust.age && this.name.equals(cust.name); }else{ return false; } }
|
2.自动实现equals()的重写
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Customer other = (Customer) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; }
|
equals()练习1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
public class OrderTest { public static void main(String[] args) { Order order1 = new Order(1001, "AA"); Order order2 = new Order(1001, new String("BB")); System.out.println(order1.equals(order2)); Order order3 = new Order(1001, "BB"); System.out.println(order2.equals(order3));
} }
class Order{ private int orderId; private String orderName; public int getOrderId() { return orderId; } public void setOrderId(int orderId) { this.orderId = orderId; } public String getOrderName() { return orderName; } public void setOrderName(String orderName) { this.orderName = orderName; } public Order(int orderId, String orderName) { super(); this.orderId = orderId; this.orderName = 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);
} return false; } }
|
因为String类型的创建是在方法区的常量池中,当String被创建时,如果发现一个一样的值,则不会创建新的,而是会复用它,所以返回的是同一个地址值。
Object类中toString()的使用:
当我们输出一个对象的引用时,实际上就是调用当前对象的toString()
Object类中toString()的定义:
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
像String、Date、File、包装类等都重写了Object类中的toString()方法。
使得在调用对象的toString()时,返回”实体内容”信息
- 自定义类也可以重写toString()方法,当调用此方法时,返回对象的”实体内容”
Demo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class ToStringTest { public static void main(String[] args) { Customer cust1 = new Customer("Tom",21); System.out.println(cust1.toString()); System.out.println(cust1); String str = new String("MM"); System.out.println(str); Date date = new Date(4534534534543L); System.out.println(date.toString()); } }
|
重写toString方法:
自动实现