質問: this.a 同じクラスのフィールドaを呼び出す super.a スーパークラスのフィールドaを呼び出す this(aaa) ほかのクラスのString型の引数一つが渡されたコンストラクタを呼び出す。ただこの場合" " は省いていいのでしょうか。 super().a 理解できません、教えてください Book.a 理解できません、教えてください super(aaa) スーパークラスのString型の引数一つが渡されたコンストラクタを呼び出す。ただこの場合" " は省いていいのでしょうか。
回答: いちおう推測はできますが、どのようなソースコードに対してそういっているのかが書いてないと曖昧にしか答えられないと思います。 下に書いたようなコードがある前提で。 > > this.a 同じクラスのフィールドaを呼び出す > > > クラスというより、**インスタンスフィールド**`a`といった方が正しいかと。 > > super.a スーパークラスのフィールドaを呼び出す > > > 同じく、スーパークラスの**インスタンスフィールド**`a`。 > > this(aaa) ほかのクラスのString型の引数一つが渡されたコンストラクタを呼び出す。ただこの場合" " は省いていいのでしょうか。 > > > `" "`を省くと、文字列リテラルではなく`aaa`という変数やフィールドを指すことになります。 > > super().a 理解できません、教えてください > > > 正しい構文ではありません。 > > Book.a 理解できません、教えてください > > > `Book`クラスの**クラスフィールド**`a`です。 下記コードではインスタンスフィールドと重複するので、`aa`としています。 > > super(aaa) スーパークラスのString型の引数一つが渡されたコンストラクタを呼び出す。ただこの場合" " は省いていいのでしょうか。 > > > `this(aaa)`の場合と同じです。 ... * コード例: ``` package local; public final class App { public static void main(String[] args) { Book.aa = "Bookのクラスフィールド"; Textbook.aa = "Textbookのクラスフィールド"; Book book = new Book("本"); Textbook textbook = new Textbook("教科書"); book.show(); textbook.show(); } } class Book { String a; // Bookのインスタンスフィールド static String aa; // Bookのクラスフィールド Book() { } Book(String title) { this.a = title; } void show() { System.out.println("Book.show()"); System.out.println("Book.aa = " + Book.aa); System.out.println("this.a = " + this.a); } } class Textbook extends Book { String a; // TextBookのインスタンスフィールド static String aa; // TextBookのクラスフィールド Textbook(String title) { super("super:" + title); this.a = title; } void show() { System.out.println("Textbook.show()"); System.out.println("Textbook.aa = " + Textbook.aa); System.out.println("this.a = " + this.a); System.out.println("super.a = " + super.a); } } ``` * 実行結果 ``` Book.show() Book.aa = Bookのクラスフィールド this.a = 本 Textbook.show() Textbook.aa = Textbookのクラスフィールド this.a = 教科書 super.a = super:教科書 ```