1

変数を持つabstractスーパークラスがありprotected Stringます。スーパークラスでは初期化されません。

私がやりたいのは、初期化してサブクラスで使用することだけです。だから、私はこのようなものを持っています:

    public class MySubclass extends MyAbstractSuperclass {        
        thing = "i'm a thing";
        [...]
    }

継承の全体的なポイントは、異なるコンテキストでクラスとそのフィールドを再利用することなので、十分に単純なようです。しかし、それは間違っています:Syntax error on token "thing", VariableDeclaratorId expected after this token

サブクラスの初期化を角かっこで囲むことでコンパイルできます。私が知りたいのは、なぜ最初の方法が間違っているのか、そしてなぜブラケットがそれを修正するのかということです。助けてくれてありがとう。

編集:コンストラクターを使用してこれを修正できるというヒントに感謝します。ただし、このようにスーパークラスフィールドを使用することの実際の問題点については、かなり直感的に思えるので、まだ興味があります。また、中かっこで修正するのはなぜですか。たとえば、ループ構造の外側で、ステートメントを中かっこで囲むとはどういう意味ですか。

4

3 に答える 3

3

これはScalaではありません。明示的なコンストラクターを作成する必要があります。

public class MySubclass extends MyAbstractSuperclass {        
    public MySubclass() {
        thing = "i'm a thing";
        [...]
    }
}

または、パラメーターを指定してコンストラクターを使用します。

public abstract class MyAbstractSuperclass {

    protected final String thing;

    protected MyAbstractSuperclass(String thing) {
        this.thing = thing;
    }

}

public class MySubclass extends MyAbstractSuperclass {
    public MySubclass() {
        super("i'm a thing");
    }
}
于 2013-02-04T20:37:01.663 に答える
1

私が知りたいのは、なぜ最初の方法が間違っているのか、そしてなぜブラケットがそれを修正するのかということです。助けてくれてありがとう。

public class MySubclass extends MyAbstractSuperclass {        
    thing = "i'm a thing";
    [...]
}

ここでステートメントを実行しようとし、変数の値thingをテキストに設定します。ここではステートメントを実行できません。ここでは変数宣言のみを実行できます。

public class MySubclass extends MyAbstractSuperclass { 
    {       
        thing = "i'm a thing";
    }
    [...]
}

これで、初期化ブロックができました。これはステートメントとして(コンストラクターの前に)実行されます。thingしたがって、可視性が保護されているため、にアクセスできます。たとえば、ここを参照してください:http: //docs.oracle.com/javase/tutorial/java/javaOO/initial.html

于 2013-02-04T20:46:50.393 に答える
0
public class MySubclass extends MyAbstractSuperclass {        

        public MySubclass(){
         super.thing= "i'm a thing";
         }
    }
于 2013-02-04T20:38:21.967 に答える