四千岁爷 2022-07-11 20:34 采纳率: 66.7%
浏览 38

一道 Java 面试题,JVM编译原理

一道 Java 面试题

关于程序员对 Java 类型系统的理解,比较高级的一个面试问题是这样:

public static void f() {
    String[] a = new String[2];
    Object[] b = a;
    a[0] = "hi";
    b[1] = Integer.valueOf(42);
}


这段代码里面到底哪一行错了?为什么?如果某个 Java 版本能顺利运行这段代码,那么如何让这个错误暴露得更致命一些?

注意这里所谓的「错了」是本质上,原理上的,而不一定是 Java 编译器,IDE 或者运行时报给你的。也就是说,你用的 Java 实现,IDE 都可能是错的,没找对真正错误的地方,或者没告诉你真正的原因。

如果你知道哪里错了,并且知道「为什么」错了,可以联系我。

  • 写回答

1条回答 默认 最新

  • it_hao528 2022-07-11 22:50
    关注

    错误在第5行
    首先Object[] b = a; 此时b指向的就是a,b和a本质上就是一样的都是String类型的数组,但是b定义的是Object类型的数组,所以在编译时候,b存入的值只要是Object类型即不会报错,这也是多态的编译看左边,所以在写代码的时候编译阶段b[1] = Integer.valueOf(42);给b[1]赋值是Integer类型,Integer属于Object的子类,故编译不会报错。在运行时,会找b的真正类型进行确认再进行赋值,此时找到的b的真正类型是String数组,而要给b赋值是Integer类型就会报错了。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月11日

悬赏问题

  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Linux权限管理相关操作(求解答)
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表
  • ¥15 DbVisualizer Pro 12.0.7 sql commander光标错位 显示位置与实际不符
  • ¥15 求一份STM32F10X的I2S外设库
  • ¥15 android 打包报错
  • ¥15 关于stm32的问题
  • ¥15 ncode振动疲劳分析中,noisefloor如何影响PSD函数?