日期:2014-05-20  浏览次数:20659 次

迷糊了,一个简单的问题
两端代码,第一段代码如下:
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的上转型对象,
上转型对象不能操作子类新增的成员变量和方法,但可以操作子类对象继承或重写的方法,
如果子类重写了父类的某个方法,
上转型对象调用方法时,一定调用的是这个重写的方法
明白了吧?


------解决方案--------------------
子类重写父类的方法的前提是:方法名一样,参数类型和个数一样.
对于楼主的问题,前面一个是因为参数类型不一样,而并没有重写,所以用父类和子类的引用来调方法时是调用的两个方法, 后面那个是参数类型和个数完全一样,所以是子类重写了父类的方法,用父类和子类的引用去调,最后都是调的子类重写后的方法.
------解决方案--------------------
请查阅“多态”。