2012-01-19 15 views
0

可能性の重複:私はちょうど学校ではなく、教師がいないことを学んだ
Why does this() and super() have to be the first statement in a constructor?Javaは:なぜ私は、コンストラクタの最初の行にsuper()を記述する必要があり

理由を知っている。

私はいくつかの良い理由があると思うかもしれませんが、私は、後でコンストラクタで初期化を行うことができると思います。変数は最初から初期化する必要がありますが、必ずしもそうである必要はありません。私は "推測し

は、スーパー()コンストラクタの最初の行に配置する必要があり、その理由のためのより多くの理由がある。だから、

、私は、コンストラクタの1行目に()スーパーを記述する必要がありますなぜ、とき、私はクラスを継承している?あなたがあなた自身のクラスの作業を開始する前に、その構成を完了できるようにする必要がありますから継承している

+2

「必ずしも必要でない」;しかし、なぜあなたがしてはならない理由を考えることができますか? – Viruzzo

+0

私はこれを意味しました。変数またはオブジェクトを使用する前に1行宣言することができます。だからなぜこれはsuper()でできないのでしょうか? Awoodlandは私に本当に良い答えをくれました。 – AlexSavAlexandrov

答えて

5

クラス。

これを行うことがなければ、あなたは多くを行うことができます「悪い」ものの例:

  1. を別のメソッドに渡します。このメソッドは、の基本クラスを使用し、のコンストラクタが実行されます。それはたくさんの前提を壊すでしょう。
  2. まだ "セットアップ"されていない多型関数を呼び出します。クラス自身が行うことと同様に、実装はコンストラクタ呼び出しを使用して実装内部を処理することもあります。

    フライドチキンと同じ方法でオブジェクトにアクセスするのは悪いです。実際にチキンにアクセスすることは嫌です。基底クラスを約束しようとしていたベースクラスの

  3. アクセスprotected/publicメンバ変数は、常にいくつかの状態に初期化されるだろう。

クラスのインスタンスが常に特定の状態にあることを約束することは、クラスにとって完全に合理的です。コンストラクタが呼び出される前に何かをする機会があれば、そのような約束を守る方法はありません。本質的に、「is-a」の関係は、それが「ある」という事実が実際にその事ではないなら、実際には保持されないでしょう!

+0

ここではたくさん説明します。ありがとう! – AlexSavAlexandrov

1

awoodlandsの回答に加えて、Javaコンパイラが階層の上にあるすべてのデフォルトコンストラクタを自動的に呼び出すため、super()を記述する必要はありません。

例外:基本クラスにデフォルトコンストラクタがない場合は、super(ConstructorArgs args)を使用してカスタムコンストラクタを呼び出す必要があります。

関連する問題