Java:使函数不是虚拟的 - 在父引用上调用父方法

时间:2017-07-06 21:26:52

标签: java polymorphism

我认为之前已经问过这个问题,但是没有立即找到答案。

以某种方式说,为function loadData(file, colorForSex){ var region = $('select[name="region"] option:selected').val(); var file = file + '?q=' + Math.random(); $.get(file, function(data) { var processedData = $.csv.toArrays(data); var j = 1; for (var i = 1; i < processedData.length; i++) { processedData[i][j] = parseFloat(processedData[i][j]); } var data = google.visualization.arrayToDataTable(processedData); var options = { region: region, backgroundColor: 'none', chartArea: { width: '100%', height: '100%' }, colorAxis: {colors: ['#ddd', colorForSex]}, datalessRegionColor: 'white', legend: { numberFormat: '.##', textStyle: { fontName: 'Verdana', color: '#ff1a1a', fontSize: 14 } } }; chart.draw(data, options); }, 'text'); } 引用分配了一个Pet对象:

Dog

如果我写

Pet pet = new Dog();

由于Java中的所有函数都是虚拟的,因此调用子类(pet.attackInvader(); )的方法。

是否可以调用Dog&#39; Pet

(我知道我可以修改attackInvader()方法来调用Dog,但是,在这种情况下,假设我无法更改super的实现。 )

1 个答案:

答案 0 :(得分:1)

如果没有覆盖Dog中的方法而不将实例化对象从Dog更改为Pet,则不可能因为多态在这种方式下工作:
在运行时调用的方法始终是运行时对象的方法。
现在作为替代方案,您可以在Dog中提供一种方法,将其转换为Pet实例:

  public Pet toPet(){
      return new Pet(...);
 }

然后调用attackInvader()

myDog.toPet().attackInvader();

或者通过在Dog中创建提供此特定行为的新方法:

  public void attackInvaderPet(){
      super.attackInvader();
  }