赞
踩
Animal类(父类):
package com.yyh; import lombok.Data; /** * 动物类 * @Author: yyh * Date: 2022/5/21 * Time: 8:03 */ @Data public class Animal { /** * 名称 */ private String name; /** * 颜色 */ private String color; }
Cat类(子类):
package com.yyh; import lombok.Data; import lombok.EqualsAndHashCode; /** * 猫类 * @Author: yyh * Date: 2022/5/21 * Time: 8:04 */ @Data public class Cat extends Animal { /** * 价格 */ private Double price; /** * 雌雄性别 */ private String sex; }
测试一:
当Cat类上只有@Data注解,也就相当于:
@EqualsAndHashCode(callSuper=false)
package com.yyh; /** * @Author: yyh * Date: 2022/4/30 * Time: 22:23 */ public class TestLombok { public static void main(String[] args) { Cat cat1 = new Cat(); cat1.setName("小白"); cat1.setColor("白"); cat1.setPrice(88d); cat1.setSex("雌"); Cat cat2 = new Cat(); cat2.setName("小蓝"); cat2.setColor("蓝"); cat2.setPrice(88d); cat2.setSex("雌"); System.out.println(cat1.equals(cat2)); //true System.out.println(cat1 == cat2); //false } } 【说明】@EqualsAndHashCode(callSuper="false")时,即在equals、hashCode方法中不会引用父类Animal中的nama、color属性,所有即使 cat1、cat2的name、color属性不同,仅子类Cat中的price、sex属性 相同时,cat1.equals(cat2)结果为true; cat1==cat2比较地址,所有肯定为false。
测试二:
当Cat类上除了@Data注解外,还有
@EqualsAndHashCode(callSuper=true)
package com.yyh; import lombok.Data; import lombok.EqualsAndHashCode; /** * 猫类 * @Author: yyh * Date: 2022/5/21 * Time: 8:04 */ @Data @EqualsAndHashCode(callSuper = true) public class Cat extends Animal { /** * 价格 */ private Double price; /** * 雌雄性别 */ private String sex; }
package com.yyh; /** * @Author: yyh * Date: 2022/4/30 * Time: 22:23 */ public class TestLombok { public static void main(String[] args) { Cat cat1 = new Cat(); cat1.setName("小白"); cat1.setColor("白"); cat1.setPrice(88d); cat1.setSex("雌"); Cat cat2 = new Cat(); cat2.setName("小蓝"); cat2.setColor("蓝"); cat2.setPrice(88d); cat2.setSex("雌"); System.out.println(cat1.equals(cat2)); //false System.out.println(cat1 == cat2); //false } } 【说明】@EqualsAndHashCode(callSuper = true),则会引用到父类Animal中的color、name属性,因cat1、cat2的name、color属性值不同,即使子类Cat的price、sex属性值相同,最终cat1.equals(cat2)结果为false。
测试三:
当Cat类上除了@Data注解外,还有
@EqualsAndHashCode(callSuper = true, of = {“price”})
package com.yyh; import lombok.Data; import lombok.EqualsAndHashCode; /** * 猫类 * @Author: yyh * Date: 2022/5/21 * Time: 8:04 */ @Data @EqualsAndHashCode(callSuper = true, of = {"price"}) public class Cat extends Animal { /** * 价格 */ private Double price; /** * 雌雄性别 */ private String sex; }
package com.yyh; /** * @Author: yyh * Date: 2022/4/30 * Time: 22:23 */ public class TestLombok { public static void main(String[] args) { Cat cat1 = new Cat(); cat1.setName("小蓝"); cat1.setColor("蓝"); cat1.setPrice(88d); cat1.setSex("雌"); Cat cat2 = new Cat(); cat2.setName("小蓝"); cat2.setColor("蓝"); cat2.setPrice(88d); cat2.setSex("雄"); System.out.println(cat1.equals(cat2)); //true System.out.println(cat1 == cat2); //false } } 【说明】@EqualsAndHashCode(callSuper = true, of = {"price"}), callSuper = true表示会引用到Animal中的name、color属性,此处cat1、cat2 对象的name、color值相同; of = {"price"}表示equals、hashCode方法仅使用Cat类中的price属性作比较, 此处cat1、cat2的price值也相同,尽管sex属性不相同,但是equals()结果却是true;因为of属性指定了price属性,所有只要是price属性值相同时,equals()方法就返回true。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。