package com.day12.object;
/**
* boolean equals(Object obj)
* 判断当前对象的内容是否和参数中的对象相等
*/
public class Point {
private int x;
private int y;
public Point() {
}
public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public String say() {
return "x : " + x + ", y : " + y;
}
/** 这是从Object类直接继承过来的方法, 烂得很, 不能完成对象内容的比较
public boolean equals(Object obj) {
return (this == obj);
}*/
@Override // 必须重写equals才能完成对象的内容的比较
public boolean equals(Object obj) {
// 在这里重写时, 真正完成对象的内容的比较
// 比较this对象和obj对象
if (obj instanceof Point) {
Point p2 = (Point)obj;
if (this.x == p2.x && this.y == p2.y) {
return true;
}
}
return false;
}
// public native int hashCode();
@Override
public int hashCode() {
// 特征码要和内容相关
return Integer.parseInt(x + "" + y);
}
/** 这是默认的toString方法, 不好, 根本看不清对象的详细信息
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}*/
@Override
public String toString() {
return say();
}
}
package com.day12.object;
/**
* boolean equals(Object obj)
* 判断当前对象的内容是否和参数中的对象相等
*
* 如果 obj1.equals(obj2) 为真, 那么 obj2.equals(obj1)也必须为真
* 如果 obj1.equals(obj3) 为真, 那么 obj2.equals(obj3)也必须为真
*
* int hashCode()
* 可以获取对象的哈希码(散列码或特征码)
*
* 如果两个对象的equals为true, 说明两个对象的内容相等, 和内容相关的特征码必须一致
* 如果两个对象的equals为false, 说明两个对象的内容不等, 必须体现散列性, 散列码必须不一样.
*
* String toString()
* 把对象变成字符串, 字符串内容是对象的详细信息(所有属性值拼接)
*
*/
public class PointTest {
public static void main(String[] args) {
Point p1 = new Point(10, 30);
Point p2 = new Point(10, 30);
System.out.println(p1 == p2); // 两个引用判断 == 时比较的是两个引用中的地址值
System.out.println(p1.equals(p2)); // 判断两个对象的内容是否相等
System.out.println(p2.equals(p1)); // 判断两个对象的内容是否相等
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
//p1 = null;
System.out.println(p1); // 打印对象时不需要调用toString()
System.out.println(p1.toString());// 和上面效果一样
String s = "abc " + p2; // 字符串和对象拼接时, 也会自动调用它的toString()
System.out.println(s);
}
}