请帮助我找到以下两个问题的答案,均在Java访谈中问到:
在这种情况下,将使用new关键字在JVM堆栈中分配内存(堆中什么都没有)。
在这种情况下,将根据返回类型确定方法重载,方法名称和参数相同(我回答说在Java中是不可能的)
据我所知,以及从google上找到的内容,两者都无法完成, 我的答案是:
New将始终在堆中分配内存,并且可以通过堆栈中的引用进行引用
重载是在编译时决定的,如果不遵循以下情况,将给编译器错误
但是他没有被说服。
答案 0 :(得分:4)
这两种方法的答案都是从不,因为1)new
从堆中分配,并且2)方法重载基于方法名称和参数类型,而不是返回类型。
[采访者]告诉我两种情况都是可能的
从理论上讲,JVM的优化器可以执行转义分析并决定在堆栈上分配对象,但这是无法预测的,并且完全取决于JVM的实现。
“在这种情况下...”问题无法回答,因为您无能为力,因此无法设置“案例”。
在JVM本身中,在字节码级别上,方法签名实际上确实包含返回类型,因此在该级别上,可能有两个仅在返回类型上有所不同的方法。
不可能在Java中编写两个仅返回类型不同的方法。
可以编写代码来生成两个这样的方法,但是其中一个是内部的 synthetic 方法,它仅调用另一个方法。当您重写方法并缩小返回类型时,就会发生这种情况。
class A {
Number getNumber() { ... }
}
class B extends A {
@Override
Integer getNumber() { ... }
}
由于返回类型是字节码级别签名的一部分,因此编译器必须创建一个 synthetic 桥接方法,以实际覆盖Number getNumber()
。该方法只是调用Integer getNumber()
重载。
直到Java 1.5才将覆盖时更改返回类型的功能添加到Java中。
我认为这是面试中的愚蠢问题,因为您能否回答这个问题不会以任何方式影响您作为Java程序员的能力。仅当您被雇用编写 JVM实现时,这些问题才有意义,而如果您被雇用编写Java代码,则无关紧要。
答案 1 :(得分:-6)
1)定义为私有的诸如 int 之类的基元存储在堆栈中(而不是堆上)
阅读问题后...: 如果创建内部类优化器的新实例,则可以将其存储在堆栈中。更多信息: JVM Escape analysis