前言:
重写equals方法能够学习到多态、instanceof
代码实现:
1、仿照String类equals方法:
public class Super{
static class MyString{
private final char value[];
MyString(char[] value){
this.value = value;
}
@Override
public boolean equals(Object obj) {
if(obj == this){
return true;
}
if(obj == null){
return false;
}
if(obj instanceof MyString){
MyString anotherString = (MyString)obj;
int n = value.length;
if(n == anotherString.value.length){
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while(n-- != 0){
if(v1[i] != v2[i]){
return false;
}
i++;
}
return true;
}
}
return false;
}
}
public static void main(String[] args) {
char[] c1 = new char[]{'s','c','d'};
char[] c2 = new char[]{'s','c','d'};
Super.MyString s1 = new Super.MyString(c1);
Super.MyString s2 = new Super.MyString(c2);
System.out.println(s1.equals(s2));
}
}
2、通用型equals方法:
public class Super{
public static void main(String[] args) {
Super.User1 user1 = new Super.User1();
Super.User2 user2 = new Super.User2();
System.out.println(user2.equals(user1));
}
interface IUser{
int number = 0;
String name = "里斯";
public void doing();
public void toDo();
}
static class User1 extends User2{
private int studentId = 1342432423;
private String studentClass = "二班";
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getStudentClass() {
return studentClass;
}
public void setStudentClass(String studentClass) {
this.studentClass = studentClass;
}
public void doing(){
System.out.println("User1类正在做");
}
public void toDo(){
System.out.println("User1类已经做过");
}
}
static class User2 implements IUser{
private int studentId = 1342432423;
private String studentClass = "二班";
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getStudentClass() {
return studentClass;
}
public void setStudentClass(String studentClass) {
this.studentClass = studentClass;
}
public void doing(){
System.out.println("User2类正在做");
}
public void toDo(){
System.out.println("User2类已经做过");
}
//使用Object的原因是它是所有类的父类,于是有了Obejct obj = new User1();把User1类向上转型为obj对象
public boolean equals(Object obj){
//如果比较的是自己本身
if(obj == this){
return true;
}
//考虑到程序的健壮性,在方法的形参是引用类型的时候,建议做非null处理
if(obj == null){
return false;
}
// 两个对象的类型都不一致,对象肯定不一致
if (getClass() != obj.getClass())
return false;
// 检查obj是否是User2的实例。
// 无论对象是否经过向上转型或向下转型,instanceof检查都是有效的。
if(obj instanceof User2){
// 将obj向下转型为User2。注意,只有当对象原本就是这个子类(User2)或其子类的实例时,向下转型才是有效的。
User2 user = (User2) obj;
// 添加我们想要检查的条件。
// 在这个情况下,我们想检查'this'对象和'user'对象的'studentClass'和'studentId'是否相同。
if(this.getStudentClass().equals(user.getStudentClass()) && this.getStudentId() == user.getStudentId()){
// 如果'studentClass'和'studentId'都相等,那么返回true。
return true;
}
}
return false;
}
}
}
总结:
instanceof
左边必须是右边的类或者是子类的实现对象
向上转型和向下转型实际上都是指向“`子类对象““(子类对象的引用)。
本文来自博客园,作者:news_one,转载请注明原文链接:https://www.cnblogs.com/new-one/p/17832362.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/199424.html