对java中的转换对象的运行时方法调用

时间:2015-11-09 05:34:55

标签: java casting

plz帮助我理解下面片段的第2行上的mehtod调用,它调用了Orange类的bMethod(),即使Orange对象在第1行被转换为Fig类型

     interface a{public void aMethod();}
     interface b{public void bMethod();}
     interface c extends a,b{public void cMethod();}
    class Fig implements b{
     @Override
    public void bMethod() {
        System.out.println("Fig a");
    }
    }

    class Orange extends Fig implements c{

    @Override
    public void aMethod() {
        System.out.println("Orange a");
    }

    @Override
    public void bMethod(){
        System.out.println("Orange b");
    }

    @Override
    public void cMethod() {
        System.out.println("Orange c");     
    }

   }
    public class Q71 {
      public static void main(String...args){
     Fig e = (Fig)(new Orange()); //line 1  -- 
        e.bMethod();              //line 2--invokes Orange's bMethod()?
     }
   }

Plz帮助我无法用正确的理由弄清楚运行时方法调用? 提前致谢

2 个答案:

答案 0 :(得分:0)

多态性在这里起作用。

变量' e'正在引用一个子对象' Orange'。 Orange已经覆盖了' bMethod()',因此对于类型为' Orange'的对象,方法将输出' Orange b'。当在第2行调用bMethod()时,它调用了对象的方法并输出了' Orange b'而不是'图a'。

为了检查,只需评论被覆盖的' bMethod()'在Orange类中,它将调用父调用方法打印'图a'。

答案 1 :(得分:0)

在Java中,它非常简单,无论你怎么称呼它,一切都取决于你如何创建你的实例。

因此,当您创建isntance new Orange()时,它将始终为橙色实例,并且无论您是否投射它都会使用橙色方法。

此行Fig e = (Fig)(new Orange());与此Fig e = new Orange();

没有区别