ここでの答えは本当に良いですが、私はバイトコードを調べてこれに取り組んでいます。クラスに適用するjavap
と、渡されたクラスのパッケージ、保護、およびパブリックフィールドとメソッドが出力されます。Person.scalaクラスを作成し、次のコードを入力しました。
class Person(name: String, age: Int) {
def say = "My name is " + name + ", age " + age
}
class PersonVal(val name: String, val age: Int) {
def say = "My name is " + name + ", age " + age
}
class PersonVar(var name: String, var age: Int) {
age = happyBirthday(5)
def happyBirthday(n: Int) = {
println("happy " + n + " birthday")
n
}
}
コードをコンパイルするscalac Person.scala
と、名前が付いた3つのファイルが生成されますPerson.class, PersonVal.calass , PersonVar.cass
。javap
これらのクラスファイルごとに実行することで、構造がどのようになるかを確認できます。
>>javap Person.class
Compiled from "Person.scala"
public class Person {
public java.lang.String say();
public Person(java.lang.String, int);
}
この場合、valでもvalでも宣言されていないため、Personのクラス変数は作成されませんでした。したがって、nameとageはコンストラクター内で使用できます。
>>javap PersonVal.class
public class PersonVal {
public java.lang.String name();
public int age();
public java.lang.String say();
public PersonVal(java.lang.String, int);
}
この場合、入力コンストラクター用に2つ、コンストラクター内で宣言したメンバー用に1つ、3つのメンバーがあります。ただし、入力コンストラクターのセッターがないため、値を変更できません。
>>javap PersonVar.class
public class PersonVar {
public java.lang.String name();
public void name_$eq(java.lang.String);
public int age();
public void age_$eq(int);
public int happyBirthday(int);
public PersonVar(java.lang.String, int);
}
PersonValの例と同じですが、この場合、これらのvariable_$eq
メソッドを使用して値を変更できます。それは単なる短縮版ではありませんvariable =