4

scalaのいくつかの概念を明確にしたいと思います

class Test(a:Int) {
 def print = println(a)
}

class Test1(val a:Int) {
 def print = println(a)
}

class Test2(private val a:Int) {
 def print = println(a)
}

val test = new Test(1)
val test1 = new Test1(1)
val test2 = new Test2(1)

ここで、テスト、test1、test2 にアクセスしようとすると、.

Scalaプリント

scala> test.a
<console>:11: error: value a is not a member of Test

scala> test1.a
res5: Int = 1

scala> test2.a
<console>:10: error: value a cannot be accessed in Test2

Integer a は Test1 と Test2 のフィールドであることを理解しています。しかし、Integer a とクラス Test の関係は何ですか? どうやら Integer a はクラス Test のフィールドではありませんが、print 関数でアクセスできます。

4

1 に答える 1

6

何が起こっているかを確認する最善の方法は、結果の Java クラスを逆コンパイルすることです。どうぞ:

public class Test
{
  private final int a;

  public void print()
  {
    Predef..MODULE$.println(BoxesRunTime.boxToInteger(this.a));
  }

  public Test(int a)
  {
  }
}

public class Test1
{
  private final int a;

  public int a()
  {
    return this.a; } 
  public void print() { Predef..MODULE$.println(BoxesRunTime.boxToInteger(a())); }


  public Test1(int a)
  {
  }
}

public class Test2
{
  private final int a;

  private int a()
  {
    return this.a; } 
  public void print() { Predef..MODULE$.println(BoxesRunTime.boxToInteger(a())); }


  public Test2(int a)
  {
  }
}

ご覧のとおり、いずれの場合もメンバー変数aになります。private final int唯一の違いは、生成されるアクセサーの種類です。最初のケースでは、アクセサーは生成されません。2 番目のケースではパブリック アクセサーが生成され、3 番目のケースではプライベート アクセサーが生成されます。

于 2012-12-26T23:44:40.240 に答える