当前位置: 首页 > 知识库问答 >
问题:

Java中的静态和动态绑定

鲜于岳
2023-03-14

请有人给我解释一下输出的最后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

共有1个答案

赵永新
2023-03-14

坚果壳:整个概念是关于方法重载和重写,以及它们如何与动态和静态绑定链接。

现在,首先查看下面的代码片段,这是对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中到底是如何工作的吗? 代码的正确输出是: