请有人给我解释一下输出的最后6行是如何打印出来的。我知道,由于静态绑定,前三行打印适当。
我不知道为什么第5行给出了输出,因为它是Ipod类型的,它没有任何歌曲方法,但它仍然打印输出。代码如下:
package myferrari;
import mycar.*;
class IPOD
{
void PlayMusic(Music m)
{
System.out.println("Music from Ipod");
}
}
class IpodPlayer extends IPOD
{
void PlayMusic(Music m)
{
System.out.println("Music from IpodPlayer");
}
void PlayMusic(Song m)
{
System.out.println("Song from IpodPlayer");
}
}
class Music{}
class Song extends Music{}
public class Main {
public static void main(String [] args)
{
IPOD ipod = new IPOD();
IpodPlayer iplayer = new IpodPlayer();
IPOD ipl = new IpodPlayer();
Music m = new Music();
Song s = new Song();
Music sm = new Song();
iplayer.PlayMusic(m);
iplayer.PlayMusic(s);
iplayer.PlayMusic(sm); // static binding refers to the reference type
ipod.PlayMusic(m);
ipod.PlayMusic(s);
ipod.PlayMusic(sm);
ipl.PlayMusic(m);
ipl.PlayMusic(s);
ipl.PlayMusic(sm);
}
}
输出如下所示:
Music from IpodPlayer
Song from IpodPlayer
Music from IpodPlayer
Music from Ipod
Music from Ipod
Music from Ipod
Music from IpodPlayer
Music from IpodPlayer
Music from IpodPlayer
坚果壳:整个概念是关于方法重载和重写,以及它们如何与动态和静态绑定链接。
现在,首先查看下面的代码片段,这是对case@run-time的简化,并了解运行时图片。使用您选择的任何IDE调试代码,您将看到完全相同的结果。
主要要点:在运行时,您的引用将解析为实际对象,这被称为动态绑定或多态性。运行时意味着对象。因此,无论是IpodPlayer ipplayer=new IpodPlayer();
还是ipodipl=new IpodPlayer();
,在运行时都将获得IpodPlayer
的实例,并调用其方法。
链接中的动态绑定,方法重写。因此,在运行时,将调用哪个重写的方法是通过检查对象类型来决定的。因此,您可以看到,无论引用类型是什么,在运行时都会调用实际对象的PlayMusic
方法。
这总结了您的动态绑定和方法重写。
new IpodPlayer().PlayMusic(new Music()); //Music from IpodPlayer
new IpodPlayer().PlayMusic(new Song()); //Song from IpodPlayer
new IpodPlayer().PlayMusic(new Song()); //Music from IpodPlayer
new IPOD().PlayMusic(new Music()); //Music from Ipod
new IPOD().PlayMusic(new Song()); //Music from Ipod
new IPOD().PlayMusic(new Song()); //Music from Ipod
new IpodPlayer().PlayMusic(new Music()); //Music from IpodPlayer
new IpodPlayer().PlayMusic(new Song()); //Music from IpodPlayer
new IpodPlayer().PlayMusic(new Song()); //Music from IpodPlayer
接下来是静态绑定和方法重载。
静态绑定清楚了java中重载的方法是如何在编译时使用类型信息绑定的。
在编译时,根据对象类型决定调用哪个重载方法,是playmusic(Music m)
还是playmusic(Song m)
。请注意,我只是在谈论方法,而不是哪个类或对象…
现在,在你的情况下没有。1、2和3,因为对象new IpodPlayer()
和您有两个重载方法,所以根据对象类型playmusic
调用适当的playmusic
方法
最后的案子-你的案子号。7、8和9,这是最令人头疼的情况,也是最重要的理解,因为它结合了动态绑定和静态绑定的概念。
同样在编译时根据对象类型决定调用哪个重载方法,但由于在编译时根据iPod IPL
而不是=new IpodPlayer();
,所以编译器决定并生成PlayMusic(Music m)
将在运行时调用的字节码(哪个对象的方法是PlayMusic(Music m)
方法),因为iPod
没有任何其他方法。最后,在运行时,将出现动态绑定,并调用IpodPlayer
的方法,因为=new IpodPlayer();
问题内容: 我目前正在为我的一个类进行分配,在其中,我必须使用Java语法给出 静态 和 动态绑定的 示例。 我了解基本概念,即静态绑定在编译时发生,而动态绑定在运行时发生,但是我无法弄清楚它们实际上是如何工作的。 我找到了一个在线静态绑定的示例,给出了以下示例: 并且这将显示“ animal is eating”,因为 对的调用使用了静态绑定,但是我不确定 为什么 将其视为静态绑定。 到目前为止
起初我是一个初学者 我看过很多教程,读过很多例子,甚至试图从JLS来理解这个主题,但我仍然有一些困惑或误解。 让我给你看我看不懂的问题。
问题内容: 我对动态绑定和静态绑定感到非常困惑。我已经读过,在编译时确定对象的类型称为静态绑定,而在运行时确定它的称为动态绑定。 下面的代码会发生什么: 静态绑定还是动态绑定? 这表明什么样的多态性? 问题答案: 您的示例是 动态绑定 ,因为在运行时确定类型是什么,并调用适当的方法。 现在假设您也具有以下两种方法: 即使您更改为 这将打印出来,因为对的调用使用 静态绑定 ,并且编译器仅知道其类型。
问题内容: 我正在为测试做练习,并且遇到了有关重载以及静态和动态绑定的练习。询问以下代码的输出: 我 认为 我获得了第一个,但在其他方面我完全迷失了。这是我解决第一个问题的方法: 在运行时,类型为,因此我们调用Curly的print方法。由于我们传递了要打印的类型的对象,因此在中运行了具有参数类型的相应打印方法。该方法的输出为,正确答案。 但是,当我将这种技术应用于以下几行时,我得到的答案是错误的
我想我得到了第一个,但在其他方面我完全迷失了。我是这样解决第一个问题的: 在运行时,的类型是,所以我们调用curly的print方法。因为我们将类型的对象传递给print,所以相应的参数类型为的print方法在中运行。此方法的输出是,正确答案。 然而,当我将此技术应用到以下行时,我最终得到了错误的答案。有人能解释一下这个概念在Java中到底是如何工作的吗? 代码的正确输出是: