package method; import method.ColorPoint.Color; public class OverrideEquals { /* * 在重写equals方法时候,请遵守通用规定 */ public static boolean isOverride = false; public static void main(String[] args) { OverrideEquals overrideEquals = new OverrideEquals("admin"); //测试一,重写equlas必须保持对称性 boolean zflag = overrideEquals.equals("Admin");//true boolean fflag = "Admin".equals("admin");//false //测试一,重写equlas必须保持传递性 Point p1 = new Point(1, 2); Point p2 = new ColorPoint(1,2,Color.BLUE); //注释掉子类equals方法 isOverride = false; System.out.println("-------------子类未重写 equals方法----------------------"); System.out.println("完全不考虑子类的颜色了..,这样做虽然没有违反equals约定,但显然是不能接受的,因为颜色忽略掉了"); System.out.println("p1.equals(/"p2/") ="+p1.equals(p2));//true System.out.println("p2.equals(/"p1/") ="+p2.equals(p1));//true System.out.println("-------------子类重写 equals方法----------------------"); isOverride = true; //加上子类equals方法 //ColorPoint如果我们不重写equals方法虽然是正确的,但是如果我们需要比较颜色的话,就需要重写equals方法了 System.out.println("考虑子类的颜色了.."); System.out.println("1同子类比较............................"); Point p3 = new ColorPoint(1,2,Color.BLUE);//true System.out.println("p2.equals(/"p3/") ="+p2.equals(p3)); System.out.println("p3.equals(/"p23/") ="+p3.equals(p2)); System.out.println("2父子类比较............................"); //但是问题又来了,对称性又不成立了,说明我们重写子类的equals方法失去了对称性,虽然获得了一致性 System.out.println("p1.equals(/"p2/") ="+p1.equals(p2)); System.out.println("p2.equals(/"p1/") ="+p2.equals(p1)); //这时候,记得复合优先继承所以我们可以让子类不继承Point就可以解决了 } private String name; public OverrideEquals(String name) { this.name = name; } @Override public boolean equals(Object obj) { if(obj instanceof OverrideEquals){ return name.equalsIgnoreCase(((OverrideEquals)obj).name); } //如果写这个就违反对称性(如果对于x.equals(s1)成立 那么,s1.equals(x)也成立)原则 if(obj instanceof String){//建议去掉这个方法 return name.equalsIgnoreCase(((String)obj)); } return false; } } class Point{ private int x; private int y; public Point(int x,int y) { this.x = x; this.y = y; } @Override public boolean equals(Object obj){ if(obj instanceof Point){ Point p = (Point)obj; return x==p.x && y==p.y; } return false; } } class ColorPoint extends Point{ private Color color; public static enum Color{ RED,BLUE,YELLOW; } public ColorPoint(int x, int y,Color color) { super(x, y); this.color = color; } @Override public boolean equals(Object obj){ //要求子类对父类方法重写 if(OverrideEquals.isOverride){ if(obj instanceof Point){ return false; } if(obj instanceof ColorPoint){ ColorPoint p = (ColorPoint)obj; return super.equals(obj) && p.color == color; } return false; }else{//不要求重写,依然调用父类的方法 return super.equals(obj); } } }