方法重写和多态
1.Object类
1.1 重写equals方法(面试题)
==和equals的区别? == 比较基本数据类型 比较的是值 比较引用数据类型比较的是内存中的地址 equals 只能比较引用数据类型 本身也使用==比较 两个对象在内存中的地址 String类对equals方法进行了重写 改为了比较内容 我们也可以对equals方法 进行重写 按照我们自己的比较规则来比较
package com.qfedu.test1;public class Person {private String name;private String idCard;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getIdCard() {return idCard;}public void setIdCard(String idCard) {this.idCard = idCard;}public Person() {}public Person(String name, String idCard) {this.name = name;this.idCard = idCard;}/*** 重写equals方法* 按照名字和身份证号来比较 如果两个对象的名字和身份证号都相同* 那么应该返回为true*/public boolean equals(Object obj) {// 第一步 先比较地址 如果地址相同 则直接return true 不需要继续比较 了if(this == obj) {return true;}// 代码执行到这里 表示 地址不同 那么我们应该比较内容 名字和身份证号// 因为obj是父类对象 而父类对象不能直接获取name属性的值 所以需要强制向下转换Person p1 = (Person) obj;if(this.getName().equals(p1.getName()) && this.getIdCard().equals(p1.getIdCard())) {return true;}// 如果代码能够执行到这里 表示 上述条件不成立return false;}}
package com.qfedu.test1;/*** 面试题* ==和equals的区别?* == 比较基本数据类型 比较的是值 比较引用数据类型比较的是内存中的地址* equals 只能比较引用数据类型 本身也使用==比较 表示比较两个对象在内存中的地址* String类对equals方法进行了重写 改为了比较内容* 我们也可以对equals方法 进行重写按照我们自己的比较规则来比较* @author WHD**/public class TestPerson {public static void main(String[] args) {// 如果有“两个人”身份证和名字信息都一致 那么肯定是同一个人 也就是说 使用equals比较应该为truePerson p1 = new Person("赵四", "45783315782121324561");Person p2 = new Person("赵四", "45783315782121324561");System.out.println(p1.equals(p2));}}
1.2 重写hashCode方法
重写hashCode方法 hashCode是根据地址 等一些信息计算出来的一个int类型的数值 杂凑算法特点 正向是快速的 不可逆的 为什么要重写hashCode ? 因为在一些散列数据结构中,如果两个对象使用equals比较为true 那么通常hashCode也要相同
package com.qfedu.test3;/*** 重写hashCode方法* hashCode是根据地址 等一些信息计算出来的一个int类型的数值* 杂凑算法特点 正向是快速的 不可逆的** 为什么要重写hashCode ?* 因为在一些散列数据结构中,如果两个对象使用equals比较为true* 那么通常hashCode也要相同* @author WHD**/public class Person {private String name;private String idCard;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getIdCard() {return idCard;}public void setIdCard(String idCard) {this.idCard = idCard;}public Person() {}public Person(String name, String idCard) {this.name = name;this.idCard = idCard;}public boolean equals(Object obj) {if(this == obj) {return true;}Person p1 = (Person) obj;if(this.getName().equals(p1.getName()) && this.getIdCard().equals(p1.getIdCard())) {return true;}return false;}public int hashCode() {// 权重 为31 表示计算hashCode的决定性因素int prime = 31;int result = 1;result = result * prime + (this.getName() == null ? 0 : this.getName().hashCode() );result = result * prime + (this.getIdCard() == null ? 0 : this.getIdCard().hashCode());return result;}}
1.3 使用getClass方法
getClass() 获取当前类类型的对象 getName()方法获取当前对象所属类的包名+类名
package com.qfedu.test4;/*** getClass() 获取当前类类型的对象* getName()方法获取当前对象所属类的包名+类名* @author WHD**/public class TestPerson {public static void main(String[] args) {Person p1 = new Person("赵四", "1242323565789");System.out.println(p1.getClass().getName());System.out.println(p1.toString());}}
