A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王涵 中级黑马   /  2013-9-28 08:38  /  1597 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于多太的问题,具体问题写在注释里面的






public class Person

{
//年龄
private int age;
//身高
private double height;
private String name;

public Person(String name){
if (name==null||name==""){
System.out.println("人都有名字,初始化时请指定人名");
this.name=null;
}else this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//重写toString方法
public String toString()
{
return("Name:"+name+",Age:" + age + ",Height:" + height);
}
//重写equals方法
public boolean equals(Person person){
if(person!=null&&person.getName()!=null&&this.name==person.getName()){

return true;
}
return false;
}
public static void main(String[] args){
Person[] persons=new Person[5];
persons[0]=new Person("One");
persons[1]=new Person("Two");
persons[2]=new Person("Three");
//按我的想法,这里应该返回1,但是结果是返回-1,发现在调用equals方法时,总是调用
//Object对象的equals方法,为什么不调用Person类的equals方法呢?怎么不表现多态了?请高手指点!
int result= ArraysUitls.search(persons,new Person("Two"))



}
}
}

//ArraysUitls.java
public class ArrayUitls
{
/**
* 定义一个工具方法,工具方法从字符串数组中找到对应的字符串元素的位置
* @param array 搜索的数组
* @param target 搜索的对象
* @return 目标字符串出现的位置,-1表明找不到
*/
public static int search(String[] array, String target)
{
for (int i = 0 ; i < array.length ; i++ )
{
if (array!= null && array.equals(target))
{
return i;
}
}
return -1;
}
public static int search(Object[] array,Object target){
for(int i=0;i<ARRAY.LENGTH;I++){
if(array!=null&&array.equals(target)){
return i;
}
}
return -1;
}

}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 早知道 于 2013-9-28 09:10 编辑

你的equals方法写错了,没有实现覆盖。正确格式为equals(Object obj)
可以这样实现覆盖
  1. public boolean equals(Object obj){
  2. if(this==obj){
  3. return true;
  4. }
  5. if(!(obj instanceof Person)){
  6. return false;
  7. }
  8. Person person = (Person) obj;
  9. if(person!=null&&person.getName()!=null&&this.name==person.getName())
  10. return true;
  11. else
  12. return false;
  13. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
早知道 发表于 2013-9-28 09:00
你的equals方法写错了,没有实现覆盖。正确格式为equals(Object obj)

thank you
回复 使用道具 举报
多态:
条件:1.有继承或实现接口  2.有覆盖   3.父类引用指向子类对象
其中的第二条 有覆盖(也就是重写Override)
再看重写和重载的区别:
重载:只看同名方法的参数列表。只要参数列表不同,就是重载。
重写(覆盖):子类父类方法要一模一样,包括返回类型,参数列表(顺序、个数、类型)。还要主要权限,覆盖方法时,子类的方法权限不能小于父类。


所以,你写的equals(Person p){}仅仅是重载,
如果想达到覆盖必须按楼主的说法public boolean equals(Object b){}
因此,所有覆盖方法时,建议加行注释@Override  编译器助你查错的。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
看了下你的代码,发现你的equals方法写错了,没有实现覆盖。
给你提供两种解决方案:

方案1、
将代码
  1. public boolean equals(Person person) {
  2. if (person != null && person.getName() != null
  3. && this.name == person.getName()) {

  4. return true;
  5. }
  6. return false;
  7. }
复制代码
修改为
  1. public boolean equals(Object person) {
  2. if (person != null &&((Person) person).getName() != null
  3. && this.name == ((Person)person).getName()) {

  4. return true;
  5. }
  6. return false;
  7. }
复制代码
方案2、
将代码
  1. public static int search(Object[] array, Object target) {
  2. for (int i = 0; i < array.length; i++) {
  3. if (array[i] != null && array[i].equals(target)) {
  4. return i;
  5. }
  6. }
  7. return -1;
  8. }
复制代码
修改为
  1. public static int search(Person[] array, Person target) {
  2. for (int i = 0; i < array.length; i++) {
  3. if (array[i] != null && array[i].equals(target)) {
  4. return i;
  5. }
  6. }
  7. return -1;
  8. }
复制代码
说明:方案1是对Object父类的equals()方法进行重写
           方案2是 你既然对Object父类进行了继承,那么你在实例化的时候就应该使用你定义的子类实例化对象


评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马