黑马程序员技术交流社区
标题:
关于多态的问题
[打印本页]
作者:
王涵
时间:
2013-9-28 08:38
标题:
关于多态的问题
关于多太的问题,具体问题写在注释里面的
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;
}
}
作者:
早知道
时间:
2013-9-28 09:00
本帖最后由 早知道 于 2013-9-28 09:10 编辑
你的equals方法写错了,没有实现覆盖。正确格式为equals(Object obj)
可以这样实现覆盖
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(!(obj instanceof Person)){
return false;
}
Person person = (Person) obj;
if(person!=null&&person.getName()!=null&&this.name==person.getName())
return true;
else
return false;
}
复制代码
作者:
王涵
时间:
2013-9-28 09:05
早知道 发表于 2013-9-28 09:00
你的equals方法写错了,没有实现覆盖。正确格式为equals(Object obj)
thank you
作者:
张云飞
时间:
2013-9-28 09:10
多态:
条件:1.有继承或实现接口 2.有覆盖 3.父类引用指向子类对象
其中的第二条 有覆盖(也就是重写Override)
再看重写和重载的区别:
重载:只看同名方法的参数列表。只要参数列表不同,就是重载。
重写(覆盖):子类父类方法要一模一样,包括返回类型,参数列表(顺序、个数、类型)。还要主要权限,覆盖方法时,子类的方法权限不能小于父类。
所以,你写的equals(Person p){}仅仅是重载,
如果想达到覆盖必须按楼主的说法public boolean equals(Object b){}
因此,所有覆盖方法时,建议加行注释@Override 编译器助你查错的。
作者:
深情小建
时间:
2013-9-28 18:09
看了下你的代码,发现你的equals方法写错了,没有实现覆盖。
给你提供两种解决方案:
方案1、
将代码
public boolean equals(Person person) {
if (person != null && person.getName() != null
&& this.name == person.getName()) {
return true;
}
return false;
}
复制代码
修改为
public boolean equals(Object person) {
if (person != null &&((Person) person).getName() != null
&& this.name == ((Person)person).getName()) {
return true;
}
return false;
}
复制代码
方案2、
将代码
public static int search(Object[] array, Object target) {
for (int i = 0; i < array.length; i++) {
if (array[i] != null && array[i].equals(target)) {
return i;
}
}
return -1;
}
复制代码
修改为
public static int search(Person[] array, Person target) {
for (int i = 0; i < array.length; i++) {
if (array[i] != null && array[i].equals(target)) {
return i;
}
}
return -1;
}
复制代码
说明:方案1是对Object父类的equals()方法进行重写
方案2是 你既然对Object父类进行了继承,那么你在实例化的时候就应该使用你定义的子类实例化对象
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2