LntanoY 2024-01-31 23:48 采纳率: 100%
浏览 4
已结题

简单java多态问题,如下

public class Test {
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.num);
        a.display();
    }
}
class A{
    int num = 1;
    void display(){
        System.out.println(this.num);
    }
}
class B extends A{
    int num = 2;
    void display(){
        System.out.println(this.num);
    }
}

想问一下这个怎么理解为什么会输出2
运行结果是
1
2

  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-02-01 00:11
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    这个问题涉及到Java中的多态性以及变量隐藏(Variable hiding)和方法覆盖(Method overriding)的概念。

    首先,我们来解释一下为什么会输出数字2。在代码中,通过 A a = new B(); 创建了一个对象a,其类型是A,但实际上指向的是B类的实例。在Java中,成员变量不具有多态性,也就是说,无论使用的是父类的引用还是子类的引用,成员变量都是根据引用类型来访问的,而不是根据对象类型。因此,System.out.println(a.num); 打印的是A类的num,其值为1。

    接下来,a.display(); 调用的是B类中的display方法,因为Java中的方法调用是根据对象的实际类型来决定的(动态绑定),而不是根据引用类型。在B类中,display方法打印的是B类的num,其值为2。

    因此,程序输出的结果是12。

    解决方案:

    1. 要理解Java中的多态性概念,即使用父类的引用指向子类的对象,并调用方法时实际执行的是子类的方法。
    2. 理解变量隐藏和方法覆盖的区别。在这个例子中,变量num在父类和子类中都有,但由于变量不具有多态性,因此父类的num对于子类是隐藏的。而方法display则被子类覆盖了,因此调用时执行的是子类的display方法。

    针对这个问题,不需要修改代码,只需理解多态性、变量隐藏和方法覆盖的概念即可。

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月9日
  • 已采纳回答 2月1日
  • 修改了问题 1月31日
  • 创建了问题 1月31日

悬赏问题

  • ¥15 SPSS分类模型实训题步骤
  • ¥15 求解决扩散模型代码问题
  • ¥15 工创大赛太阳能电动车项目零基础要学什么
  • ¥20 limma多组间分析最终p值只有一个
  • ¥15 nopCommerce开发问题
  • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL
  • ¥15 QuartusⅡ15.0编译项目后,output_files中的.jdi、.sld、.sof不更新怎么解决
  • ¥15 pycharm输出和导师的一样,但是标红
  • ¥15 想问问富文本拿到的html怎么转成docx的
  • ¥15 我看了您的文章,遇到了个问题。