方法重写和多态

1.Object类

1.1 重写equals方法(面试题)

==和equals的区别? == 比较基本数据类型 比较的是值 比较引用数据类型比较的是内存中的地址 equals 只能比较引用数据类型 本身也使用==比较 两个对象在内存中的地址 String类对equals方法进行了重写 改为了比较内容 我们也可以对equals方法 进行重写 按照我们自己的比较规则来比较

  1. package com.qfedu.test1;
  2. public class Person {
  3. private String name;
  4. private String idCard;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public String getIdCard() {
  12. return idCard;
  13. }
  14. public void setIdCard(String idCard) {
  15. this.idCard = idCard;
  16. }
  17. public Person() {
  18. }
  19. public Person(String name, String idCard) {
  20. this.name = name;
  21. this.idCard = idCard;
  22. }
  23. /**
  24. * 重写equals方法
  25. * 按照名字和身份证号来比较 如果两个对象的名字和身份证号都相同
  26. * 那么应该返回为true
  27. */
  28. public boolean equals(Object obj) {
  29. // 第一步 先比较地址 如果地址相同 则直接return true 不需要继续比较 了
  30. if(this == obj) {
  31. return true;
  32. }
  33. // 代码执行到这里 表示 地址不同 那么我们应该比较内容 名字和身份证号
  34. // 因为obj是父类对象 而父类对象不能直接获取name属性的值 所以需要强制向下转换
  35. Person p1 = (Person) obj;
  36. if(this.getName().equals(p1.getName()) && this.getIdCard().equals(p1.getIdCard())) {
  37. return true;
  38. }
  39. // 如果代码能够执行到这里 表示 上述条件不成立
  40. return false;
  41. }
  42. }
  1. package com.qfedu.test1;
  2. /**
  3. * 面试题
  4. * ==和equals的区别?
  5. * == 比较基本数据类型 比较的是值 比较引用数据类型比较的是内存中的地址
  6. * equals 只能比较引用数据类型 本身也使用==比较 表示比较两个对象在内存中的地址
  7. * String类对equals方法进行了重写 改为了比较内容
  8. * 我们也可以对equals方法 进行重写按照我们自己的比较规则来比较
  9. * @author WHD
  10. *
  11. */
  12. public class TestPerson {
  13. public static void main(String[] args) {
  14. // 如果有“两个人”身份证和名字信息都一致 那么肯定是同一个人 也就是说 使用equals比较应该为true
  15. Person p1 = new Person("赵四", "45783315782121324561");
  16. Person p2 = new Person("赵四", "45783315782121324561");
  17. System.out.println(p1.equals(p2));
  18. }
  19. }

1.2 重写hashCode方法

重写hashCode方法 hashCode是根据地址 等一些信息计算出来的一个int类型的数值 杂凑算法特点 正向是快速的 不可逆的 为什么要重写hashCode ? 因为在一些散列数据结构中,如果两个对象使用equals比较为true 那么通常hashCode也要相同

  1. package com.qfedu.test3;
  2. /**
  3. * 重写hashCode方法
  4. * hashCode是根据地址 等一些信息计算出来的一个int类型的数值
  5. * 杂凑算法特点 正向是快速的 不可逆的
  6. *
  7. * 为什么要重写hashCode ?
  8. * 因为在一些散列数据结构中,如果两个对象使用equals比较为true
  9. * 那么通常hashCode也要相同
  10. * @author WHD
  11. *
  12. */
  13. public class Person {
  14. private String name;
  15. private String idCard;
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public String getIdCard() {
  23. return idCard;
  24. }
  25. public void setIdCard(String idCard) {
  26. this.idCard = idCard;
  27. }
  28. public Person() {
  29. }
  30. public Person(String name, String idCard) {
  31. this.name = name;
  32. this.idCard = idCard;
  33. }
  34. public boolean equals(Object obj) {
  35. if(this == obj) {
  36. return true;
  37. }
  38. Person p1 = (Person) obj;
  39. if(this.getName().equals(p1.getName()) && this.getIdCard().equals(p1.getIdCard())) {
  40. return true;
  41. }
  42. return false;
  43. }
  44. public int hashCode() {
  45. // 权重 为31 表示计算hashCode的决定性因素
  46. int prime = 31;
  47. int result = 1;
  48. result = result * prime + (this.getName() == null ? 0 : this.getName().hashCode() );
  49. result = result * prime + (this.getIdCard() == null ? 0 : this.getIdCard().hashCode());
  50. return result;
  51. }
  52. }

1.3 使用getClass方法

getClass() 获取当前类类型的对象 getName()方法获取当前对象所属类的包名+类名

  1. package com.qfedu.test4;
  2. /**
  3. * getClass() 获取当前类类型的对象
  4. * getName()方法获取当前对象所属类的包名+类名
  5. * @author WHD
  6. *
  7. */
  8. public class TestPerson {
  9. public static void main(String[] args) {
  10. Person p1 = new Person("赵四", "1242323565789");
  11. System.out.println(p1.getClass().getName());
  12. System.out.println(p1.toString());
  13. }
  14. }