迷糊了,一个简单的问题
两端代码,第一段代码如下:
class Father {
public Father() {
}
public void shout(Object word){
System.out.println( "object father shout: "+word);
}
}
class Son extends Father{
public Son() {
}
public void shout(String word){
System.out.println( "string son shout: "+word);
}
}
public class Dan{
public static void main(String[] args){
Son son=new Son();
Father father=son;
son.shout( "hello ");
father.shout( "hello ");
}
}
这段代码的输出结果是:
string son shout:hello
object father shout:hello
第二段代码,代码如下:
public class Demo{
public static void main(String[] args){
Professor p=new Professor();
Teacher t=p;
System.out.println (t.Teaching( "数学 "));
System.out.println (p.Teaching( "语文 "));
}
}
class Teacher{
protected String name;
public Teacher(){
}
public String Teaching(String className){
return "正在教小学 "+className;
}
}
class Professor extends Teacher{
public Professor(){
}
public String Teaching(String className){
return "正在教大学 "+className;
}
}
输出结果如下:
正在教大学数学
正在教大学语文
问题:
father.shout( "hello ");执行的时候是执行Father的shout方法,而第二段代码t.Teaching( "数学 ")为什么执行的不是Teacher的Teaching方法?
------解决方案--------------------Professor p=new Professor();
Teacher t=p;
t表示的是一个Professor类对象的引用,当然调用Professor的Teaching方法了
------解决方案--------------------两个方法的参数不一样。后面的参数是一样的,前面的不一样的
------解决方案--------------------也就是说,Teacher父类对象t 是 Professor子类对象p的上转型对象,
上转型对象不能操作子类新增的成员变量和方法,但可以操作子类对象继承或重写的方法,
如果子类重写了父类的某个方法,
上转型对象调用方法时,一定调用的是这个重写的方法
明白了吧?
------解决方案--------------------子类重写父类的方法的前提是:方法名一样,参数类型和个数一样.
对于楼主的问题,前面一个是因为参数类型不一样,而并没有重写,所以用父类和子类的引用来调方法时是调用的两个方法, 后面那个是参数类型和个数完全一样,所以是子类重写了父类的方法,用父类和子类的引用去调,最后都是调的子类重写后的方法.
------解决方案--------------------请查阅“多态”。