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

Nis*_*Raj -7 java polymorphism java-memory-model

请帮助我找到以下两个问题的答案,均在java面试中问到:

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

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

根据我的知识和从Google的发现,两者都无法完成,我的答案是:

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

  2. 重载取决于编译时间,如果不遵循以下情况,它将给编译器错误

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

但是他没有被说服。

And*_*eas 5

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

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

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

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

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

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

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

    class A {
        Number getNumber() { ... }
    }
    
    class B extends A {
        @Override
        Integer getNumber() { ... }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

    直到Java 1.5才向Java添加了重写时更改返回类型的功能。

    另请参见:重写方法的返回类型可以不同吗?

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