2017-10-17 11 views
-9

私はちょうどこれの周りに私の頭を取得しようとしています。のは、私はスーパークラスのジオメトリのための次のコンストラクタを持っているとしましょう:Java:子クラスのコンストラクタ内のスーパークラスコンストラクタの呼び出しはどのように機能しますか?

public Geometry(double x, double y) 
    { 
     this.position = new Point(x,y); 
     this.collisionMesh = new ArrayList<Point>(); 
     this.displayMesh = new ArrayList<Point>(); 
    } 

ジオメトリは、メンバーの位置、collisionMeshを持ち、その子クラスのすべてが継承しますdisplayMesh、。

私は子クラスのParticleを持っています。有効なコンストラクタ以下の通りです:

public Particle(double x, double y) 
{ 
    super(x,y); 
    this.collisionMesh.add(this.position); 
    ... 
} 

私は何のことを確認したいのはこれです:私はする必要がないようにスーパーへの呼び出しは(x、y)は、自動的に、私の子オブジェクトののArrayListとポイントをインスタンス化そうする。

また、より深いレベルで、私がこれを行うことができると仮定すると、実際に何が起こっているのですか?私はコンストラクタ内でコンストラクタを呼び出すように感じます。パーティクルオブジェクトがまだ構築されていない場合、superへの呼び出し中に構築されるのは何ですか?

+0

Googleはあなたの友だちです。https://docs.oracle.com/javase/tutorial/java/IandI/super.html – Dinh

+3

あなたは、あまり似ていない多くの仮定をしています現実とヒント:そのすべてが素敵で広範に文書化されています。 – GhostCat

+2

"コンストラクタ"はあまり幸運な名前ではありません。オブジェクトを作成する意味では、 'new'キーワードがあります。 'new SomeClass'のように表示される型のオブジェクトを作成します。コンストラクターは、すでに作成されたオブジェクトを適切な状態に初期化するメソッドと似ています(提供された引数に基づいて 'new'演算子によって呼び出される特別なメソッドのようなものです)。 – Pshemo

答えて

1

オブジェクトを生成するには、スーパークラスのコンストラクタを呼び出す必要があります。コンストラクタの最初の行にある必要があります。その行を追加しないと、javaは引数なしでスーパークラスのコンストラクタを自動的に呼び出します(無理なsuper()などがあります)。これはクラスObject自体に戻ります。このように意図的にオブジェクトを構築する場合(またはsuper()を記述しない場合はそうでない場合)は、すべてのスーパークラスのコンストラクタを呼び出します。

スーパークラスに引数コンストラクタがない場合、スーパーコンストラクタを適切な引数でコールしないと、サブクラスでコンパイルエラーが発生します(これは自動的には機能しないためです)。

タイプパーティクルを作成すると、最初にオブジェクトが作成され、そのオブジェクトがジオメトリに、次にパーティクルに拡張されます。 )

関連する問題