1、
-------------
class person{
void say(){System.out.println("I'm a person.");}
}
class student extends person{
void say(){System.out.println("I'm a person,but even a student.");}
}
class testOverlay{
public static void main(String args[])
{
person p=new student();
p.say();
}
}
为什么这个程序输出是I'm a person,but even a student?
2、
----------------
那么这个呢?
class person{
void say(person p){System.out.println("I'm a person.");}
}
class student extends person{
void say(student s){System.out.println("I'm a person,but even a student.");}
}
class testOverlay{
public static void main(String args[])
{
person p=new student();
student s=new student();
p.say(s);
}
}
为什么输出又是I'm a person.
-------------
class person{
void say(){System.out.println("I'm a person.");}
}
class student extends person{
void say(){System.out.println("I'm a person,but even a student.");}
}
class testOverlay{
public static void main(String args[])
{
person p=new student();
p.say();
}
}
为什么这个程序输出是I'm a person,but even a student?
2、
----------------
那么这个呢?
class person{
void say(person p){System.out.println("I'm a person.");}
}
class student extends person{
void say(student s){System.out.println("I'm a person,but even a student.");}
}
class testOverlay{
public static void main(String args[])
{
person p=new student();
student s=new student();
p.say(s);
}
}
为什么输出又是I'm a person.
因为p是根据person的类型信息创建的,所以p.say()会执行p的方法(第二种完全符合这种约定).至于第一种情况,嘿嘿,是因为它override了.
她调用的是这个方法。
p.say(s)-〉p.say((Person)s)
void say(person p){System.out.println("I'm a person.");}
}
class student extends person{
void say(student s){System.out.println("I'm a person,but even a student.");}
}
class testOverlay{
public static void main(String args[])
{
person p=new student();
student s=new student();
p.say(s);//
/********************************************
*s是student类型,同时也是person类型,所以p.say(s);能通过编译,
*p.say(person p)方法功能是什么,是System.out.println("I'm a person.");
********************************************/
}
} //类名应该大写,变量起始字母才应该小写
第二个例子,如果将:p.say(s) 改为:p.say((student)s) 输出还是: i'm a person
根据动态绑定,p不是student类型吗?为什么还是调用父类的方法?
但还是不能完全理解,觉得有点牵强了。
1、
---------------
我想问下欧阳,你说“person p=new student();p申明成父类,只有父类的方法对他来说是可见的。”,既然这样,那第一个程序就应该输出I'm a person.
2、
--------------
gccr既然你明白了我的问题,那可不可以把你的想法贴出来,让大家看看呢?
3、
-------------
很多人都叫我去看Think in java,我也知道看它会得到答案,但现在没有那时间看书啊。所以上来问各位高手了。俗话说得好,听君一言胜读万年书啊,请各位不啬赐教。小弟在此谢过!!!!!!!!
1、第一个例子:父类、子类的say()方法完全一样,属于正宗的多态性问题,这个就不解释了。
2、第二个例子:由于student 的say(student s) 与父类的say(person s) 自变量参数不同,属于方法重载,不是覆盖,不能用多态性的动态绑定来理解。正如欧阳所说的,父类看不到子类的say(student p) 方法,因此输出"I'm a person".
在声明时,p被声明成Person类,而被实例化成Student类,这时如果Student类中的有覆盖父类中的Say()方法则应该调用被覆盖的方法。但是在这个例子中没有被覆盖的方法,所以调用的还是父类的方法即say(person p)方法。而在传入参数时传的是person的继承类的对象,这也是允许的。反之如果方法中声明传入的是继承类的参数,则不允许传入父类的对象。