class SuperClass {
public void f() {
System.out.println("SuperClass.f()/");
}
}
class SubClass extends SuperClass {
public void f() {
System.out.println("SubClass.f()/");
}
}
public class ThirdClass { public void g(SuperClass arg){
System.out.println("g(SuperClass)/");
arg.f();
} public void g(SubClass arg){
System.out.println("g(SubClass)/");
arg.f();
} public static void main(String[] args){
ThirdClass tc = new ThirdClass();
SuperClass sc = new SubClass();
tc.g(sc);
}
}求详细解释!

解决方案 »

  1.   

    tc调用的是public void g(SuperClass arg){ 
    System.out.println("g(SuperClass)/"); 
    arg.f(); //此处是多态的体现,调用子类的f()方法;
      

  2.   

    楼主疑惑的应该是tc调用的为什么是g(SuperClass arg)吧!这个我好像也说不好!等待!
      

  3.   

    运行结果:g(SuperClass)/
              SubClass.f()
    子类可是说“是父类”,父类不能说“是子类”,例如:可以说奔驰是汽车,不能说汽车是奔驰,汽车是父类,奔驰是汽车的
    子类,SuperClass sc = new SubClass(); sc是SubClass的引用,调用tc.g(sc)时,向上转型为SuperClass,即调用的是tc的
    public void g(SuperClass arg)的方法,在g(SuperClass arg)方法内调用arg的f()方法时,因为arg是SubClass的引用,所以
    输出的是SubClass.f()/。
    明白否?多态。
      

  4.   

    多态只会发生在方法的覆写上,
    对属性,类型都无效。SuperClass sc = new SubClass(); 
    这里sc是superClass类型,所以匹配public void g(SuperClass arg)
      

  5.   

    运行结果是:
    g(SuperClass)/
    SubClass.f()/SuperClass sc = new SubClass();
    sc的编译时类型是SuperClass,运行时类型是SubClass。
    tc.g(sc); 编译器在编译这句时:发现sc的类型是SuperClass
    把调用的函数指定为:
    public void g(SuperClass arg){
    System.out.println("g(SuperClass)/");
    arg.f();

    运行到arg.f()的时候,由于arg的运行时类型是SubClass,所有调用
    public void f() {
    System.out.println("SubClass.f()/");

    理解这个帖子的关键是知道什么是在编译是决定,什么在运行时决定。