gpt4 book ai didi

inheritance - 使用构造函数参数在 Scala 中扩展类是否会向类添加 val(字段)?

转载 作者:行者123 更新时间:2023-12-03 17:56:36 25 4
gpt4 key购买 nike

说我有:

class A(val foo: String)

class B(foo: String) extends A(foo)
class C(val foo: String) extends A(foo)
class D(override val foo: String) extends A(foo)
class E(bar: String) extends A(bar)

我对每个类的内存实例占用多少感兴趣。类 A 的实例将有一个成员变量:foo。

B、C、D、E类怎么样?他们每个人有多少个成员变量?我怀疑 E 会有两个 (E.bar, A.foo),我希望 D 会有一个 (A.foo),但我想知道 B 和 C,他们可能有两个吗? (B.foo, A.foo)?

最佳答案

编译的所有示例( ABDE )占用的存储空间量完全相同。事实上,即使

class F(val bar: String) extends A(bar)

将数据存储在一个字段中——它只是为同一字段获取一个额外的访问器方法。然而,如果你
class G(var bar: String) extends A(bar)

然后构建一个新字段。

您可以通过编译上面的示例并查看来自 javap -c Classname 的字节码来检查所有这些。 (注意 2: 的构造函数中 A 处的 putfield):
public class Sizes$A extends java.lang.Object implements scala.ScalaObject{
public java.lang.String foo();
Code:
0: aload_0
1: getfield #11; //Field foo:Ljava/lang/String;
4: areturn

public Sizes$A(java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #11; //Field foo:Ljava/lang/String;
5: aload_0
6: invokespecial #18; //Method java/lang/Object."<init>":()V
9: return
}

(而且 F 中缺少额外的推杆……)
public Sizes$F(java.lang.String);
Code:
0: aload_0
1: aload_1
2: invokespecial #15; //Method Sizes$A."<init>":(Ljava/lang/String;)V
5: return

(并且再次出现在 G ...)
public Sizes$G(java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #11; //Field bar:Ljava/lang/String;
5: aload_0
6: aload_1
7: invokespecial #18; //Method Sizes$A."<init>":(Ljava/lang/String;)V
10: return

关于inheritance - 使用构造函数参数在 Scala 中扩展类是否会向类添加 val(字段)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3685129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com