Nis*_*Raj -7 java polymorphism java-memory-model
请帮助我找到以下两个问题的答案,均在java面试中问到:
在这种情况下,将使用new关键字在JVM堆栈中分配内存(堆中没有任何内容)。
在这种情况下,方法重载将基于返回类型,方法名称和参数相同(我回答说在Java中是不可能的)
根据我的知识和从Google的发现,两者都无法完成,我的答案是:
New将始终在堆中分配内存,并且可以通过堆栈中的引用进行引用
重载取决于编译时间,如果不遵循以下情况,它将给编译器错误
但是他没有被说服。
两者的答案都是Never,因为1)new从堆中分配,并且2)方法重载基于方法名称和参数类型,但不是基于返回类型。
[采访者]告诉我两种情况都是可能的
从理论上讲,JVM的优化器可以执行转义分析并决定在堆栈上分配对象,但这是无法预测的,并且完全取决于JVM的实现。
无法回答“在这种情况下...”问题,因为您无能为力,无法实现,因此无法设置“情况”。
在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代码,则无关紧要。
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |