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

Java编译器整数bug[重复]

禹智渊
2023-03-14

我有一个在测验中出现的代码

public class Main {
  public static void main(String[] args) {
    class b {
      int i = 32;
      b() { b(); }
      void b() { System.out.println(++i); }
    }

    class d extends b {
      int i = 8;
      d() {}
      void b() { System.out.println(--i); }
    }

    b b = new d();
  }
}

输出应该是什么?原来答案是-1,而我原本以为是7。Java破了吗?

共有1个答案

寇坚成
2023-03-14

让我们走一遍执行的顺序:

  1. new d()创建d的对象之前,它需要调用super()
  2. 控件被转移到b的默认构造函数。
  3. b
  4. 构造函数将调用方法b但由于类d中有可用的重写方法,因此将调用该方法。
  5. 注意,b的实例尚未创建,i的值被隐藏(d.i隐藏b.i),因此i的值为0。这样做--i将生成-1作为输出。
 类似资料:
  • 在stackoverflow中还没有讨论的情况下,我遇到了“不兼容类型”编译器错误(例如,为什么这个通用java代码不能编译?)。 我的期望很简单--我调用的是一个模板化方法,它不使用包含类的任何“泛型”类,因此它应该从方法参数中提取模板参数的类型,并且在所有情况下都应该编译--但我得到了“不兼容类型”编译器错误。 我注意到解决这个问题的奇怪方法--在方法参数中向泛型datatype添加“<?ex

  • 问题内容: 您可以推荐用于Eclipse的Java反编译器吗?我的其他问题是,使用来自其他Java程序的反编译代码有什么限制?非法还是什么?我对许可证知之甚少。谢谢阅读。 问题答案: 我建议在Google上弹出一个JD Java反编译器。它真的很好。 至于限制,您必须阅读特定软件的许可,否则可能会写明禁止任何反编译方式。

  • 我使用maven命令来清理、构建整个项目、创建war并部署到服务器。我不能使用Intellij来做这件事,因为我只有社区版。它在与intellij相同的目录中构建项目。 为了加快速度,我编写了一个脚本,可以在本地“target”目录中找到比服务器中更新的已编译文件,并进行复制。虽然一切正常,但问题是Intellij并没有将使用maven编译的类视为应该跳过并重新构建整个项目的类。 目前它的工作原理

  • 本章将介绍Rust编译器的参数。 Rust编译器程序的名字是rustc,使用它的方法很简单: $ rustc [OPTIONS] INPUT 其中,[OPTIONS]表示编译参数,而INPUT则表示输入文件。而编译参数有以下可选: -h, --help - 输出帮助信息到标准输出; --cfg SPEC - 传入自定义的条件编译参数,使用方法如 fn main() { if cfg!(he

  • 我有一个tableview,其中一列由整数值组成: null 编辑 好吧,我已经找到了原因,因为我在模型中使用了字符串…所以更新后的问题是,如何在表列上创建一个新的排序功能,以便即使其中有字符串,也可以将其排序为整数?