2013-03-09 90 views
-1

这是一个奇怪的措词问题,所以我很抱歉,如果它是重复的。使用重写的子类方法的超类方法

说我有一类foo与方法a调用方法b

public class foo 
{ 
    public void a() 
    { 
     b(); 
    } 

    public void b() 
    { 
     gamma(); 
    } 
} 

现在我有一个扩展foo

public class bar extends foo 
{ 
    @Override 
    public void b() 
    { 
     theta(); 
    } 
} 

如果我叫bar.a()一个子类bar,将a使用来自超类的b方法还是来自子类的b方法?也就是说,bar.b()最终会执行gamma还是最终会执行theta

+5

询问没有问题,但是由于您已经编写了代码,您可以通过记录或直接将其写入控制台来自行检查。我总是乐于做这样的实验,以确定会发生什么 - 这种方式有时候可以找到新的方法来做某些事情,而这些事情你现在可能并没有缩进,但是稍后你会发现已经做到了。你有时可能会重新发明轮子,但是有好奇心,并且自己做所有的小事情你不仅仅是得到答案 – Wolfii 2013-03-09 20:47:26

回答

1

它将使用子类中的方法b。这是压倒一切的方法。扩展其父项的子类可以自由创建方法的更具体的实现。当在sublcass上调用重写的方法时,它的专用方法将被用来代替超类的方法。

0

f我打电话给bar.a(),会使用超类中的b方法还是使用子类中的b 方法?也就是说,bar.b()会执行gamma 还是最终会执行theta?

它将使用bar.b()方法。这是dynamic dispatch的结果。

相关问题