采访有关JVM堆栈中的内存和方法重载的问题

时间:2019-02-28 17:07:16

标签: java polymorphism java-memory-model

请帮助我找到以下两个问题的答案,均在Java访谈中问到:

  1. 在这种情况下,将使用new关键字在JVM堆栈中分配内存(堆中什么都没有)。

  2. 在这种情况下,将根据返回类型确定方法重载,方法名称和参数相同(我回答说在Java中是不可能的)

据我所知,以及从google上找到的内容,两者都无法完成,  我的答案是:

  1. New将始终在堆中分配内存,并且可以通过堆栈中的引用进行引用

  2. 重载是在编译时决定的,如果不遵循以下情况,将给编译器错误

    • 两者都必须具有相同的方法名称。
    • 两者都必须具有不同的参数列表。

但是他没有被说服。

2 个答案:

答案 0 :(得分:4)

这两种方法的答案都是从不,因为1)new从堆中分配,并且2)方法重载基于方法名称和参数类型,而不是返回类型。

>
  

[采访者]告诉我两种情况都是可能的

  1. 从理论上讲,JVM的优化器可以执行转义分析并决定在堆栈上分配对象,但这是无法预测的,并且完全取决于JVM的实现。

    “在这种情况下...”问题无法回答,因为您无能为力,因此无法设置“案例”。

  2. 在JVM本身中,在字节码级别上,方法签名实际上确实包含返回类型,因此在该级别上,可能有两个仅在返回类型上有所不同的方法。

    不可能在Java中编写两个仅返回类型不同的方法。

    可以编写代码来生成两个这样的方法,但是其中一个是内部的 synthetic 方法,它仅调用另一个方法。当您重写方法并缩小返回类型时,就会发生这种情况。

    class A {
        Number getNumber() { ... }
    }
    
    class B extends A {
        @Override
        Integer getNumber() { ... }
    }
    

    由于返回类型是字节码级别签名的一部分,因此编译器必须创建一个 synthetic 桥接方法,以实际覆盖Number getNumber()。该方法只是调用Integer getNumber()重载。

    直到Java 1.5才将覆盖时更改返回类型的功能添加到Java中。

    另请参阅:Can overridden methods differ in return type?

我认为这是面试中的愚蠢问题,因为您能否回答这个问题不会以任何方式影响您作为Java程序员的能力。仅当您被雇用编写 JVM实现时,这些问题才有意义,而如果您被雇用编写Java代码,则无关紧要。

答案 1 :(得分:-6)

1)定义为私有的诸如 int 之类的基元存储在堆栈中(而不是堆上)

阅读问题后...: 如果创建内部类优化器的新实例,则可以将其存储在堆栈中。更多信息: JVM Escape analysis