java的运行时多态

public class Student extends Person{

	private int stuNum;
	
	public Student(){
		
	}
	
	public Student(String name,int age,int stuNum){
		super(name,age);
		this.stuNum=stuNum;
	}
	
	public boolean equals(Object obj){
		if(this==obj){
			return true;
		}
		if(obj instanceof Student){
			Student s=(Student)obj;
			return this.stuNum==s.stuNum;
		}
		return false;
	}
}

public class Person {
	
	private String name;
	private int age;
	
	public Person(){
		
	}
	
	public Person(String name,int age){
		this.name=name;
		this.age=age;
	}
	
	public Person(Person p){
		this(p.name,p.age);
	}
	
	public String toString(){
		return "name:"+name+" ,age:"+age;
	}
	
	public boolean equals(Object obj){
		if(this==obj){
			return true;
		}
		
		if(obj instanceof Person){
			Person p=(Person)obj;
			return this.age==p.age&&this.name==p.name;
		}
		return false;
	}
	
	public static boolean equals(Object[] a,Object[] b){
		if(a.length!=b.length){
			return false;
		}
		
		for(int i=0;i<a.length;i++){
			if(!a[i].equals(b[i])){
				return false;
			}
		}
		return true;
	}
	
	public static void main(String[] args) {
		Person[] p1={new Person("张一",12),
			     new Person("张二",12),
		             new Person("张三",13)
		            };
		
		Person[] p2={new Person("张一",12),
			     new Person("张二",12),
			     new Student("张三",13,20153223)
	                 };
		
		System.out.println(equals(p1,p2));
	}
}

运行该段代码,得到的结果是true,

当把输出语句修改成如下时,输出结果为false.

System.out.println(equals(p2,p1));
这是因为第一条输出语句在执行
if(!a[i].equals(b[i])){  return false; }
        这条语句时调用的是Person的equals方法,而在Person的equals方法中只比较name和age,不会比较stuNum这个属性,因此得到的结果是true.

        第二条的输出结果是false的原因是调用的是Student的equals方法,Person 类不是Student 类的实例,Student的equals方法返回false. 正是运行时多态的性质,才会有这种不一样的结果,然而在实际中,显然这两种情况可能都不满足我们的需求。我们所需要的是:只有当两个对象的值完全一样时才看做相等,部分相等不能看做相等,另外还要做到只比较相同的类。

       为了适应实际需求,该Person中equals方法修改如下:

      if(!a[i].equals(b[i])||!b[i].equals(a[i])){  return false;  }
   
       这么修改的用意在于:当两个类的元素进行比较时,如果有一个子类,一个父类,无论怎么调用equals方法,返回结果都是false. 这样就解决了只比较相同类的问题(注意:在未修改Person的equals方法之前,只有当equals的第一个参数是父类,第二个参数是子类才会返回true)

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胖墩有点瘦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值