2011-10-07 4 views
0

このJavaプログラムは、あなたがfast.howeverそれを理解することができますので、なぜ構造スタッフに[1]、プログラムは最初の文に行き、簡単なコメントでいっぱいです:Javaのコンストラクタ順

this("Employee #" + nextId, s); 

、その後行きますオブジェクトの初期化ブロックに、その後の文に戻って、this("Employee #" + nextId, s);はもちろん、実行されなければならないスーパークラスのコンストラクタへの暗黙的な呼び出しが含まれ

import java.util.*; 

public class ConstructorTest 
{ 
    public static void main(String[] args) 
    { 
     // fill the staff array with three Employee objects 
     Employee[] staff = new Employee[3]; 

     staff[0] = new Employee("Harry", 40000); 
     staff[1] = new Employee(60000); 
     staff[2] = new Employee(); 

     // print out information about all Employee objects 
     for (Employee e : staff) 
     System.out.println("name=" + e.getName() 
      + ",id=" + e.getId() 
      + ",salary=" + e.getSalary()); 
    } 
} 

class Employee 
{ 
    // three overloaded constructors 
    public Employee(String n, double s) 
    { 
     name = n; 
     salary = s; 
    } 

    public Employee(double s) 
    { 
     // calls the Employee(String, double) constructor 
     this("Employee #" + nextId, s); 
    } 

    // the default constructor 
    public Employee() 
    { 
     // name initialized to ""--see below 
     // salary not explicitly set--initialized to 0 
     // id initialized in initialization block 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public double getSalary() 
    { 
     return salary; 
    } 

    public int getId() 
    { 
     return id; 
    } 

    private static int nextId; 

    private int id; 
    private String name = ""; // instance field initialization 
    private double salary; 

    // static initialization block 
    static 
    { 
     Random generator = new Random(); 
     // set nextId to a random number between 0 and 9999 
     nextId = generator.nextInt(10000); 
    } 

    // object initialization block 
    { 
     id = nextId; 
     nextId++; 
    } 
} 
+2

どうしたのですか? – MasterCassim

+0

インスタンスイニシャライザブロックの前に 'this'文がなぜ実行されているのか聞いているようです。あれは正しいですか? –

答えて

4

ので、それは、最初のオブジェクトの初期化ブロックを使用しないconfusion.why方法のイニシャライザブロックの前にサブクラス。

インスタンスイニシャライザを使用することは、よく知られておらず、コンストラクタ以上に何もできないため、両方を混ぜると混乱するため、一般的には悪い考えです。

+0

thx.thisは本当に悪い考えです。 – huateng

1

このセクション8.8.7.1 of the JLSで指定された順序次の

(最後の二つの弾丸)

SはCの直接のスーパークラスであり、iはであるせましょう、Cがインスタンス化されるクラスであるとするとインスタンスが作成されます。明示的なコンストラクタ呼び出しの進行の評価を次のようにコンストラクタ呼び出し文は、スーパークラスのコンストラクタを呼び出し、 (それは私たちの場合にはないので切り取ら)

  • 次の場合

    • まず、コンストラクタが呼び出されます。
    • 最後に、コンストラクター呼び出しステートメントがスーパークラスのコンストラクター呼び出しで、コンストラクター呼び出しステートメントが正常に完了すると、Cのすべてのインスタンス変数初期化子とCのすべてのインスタンス初期化子が実行されます。 (Snip)代替のコンストラクター呼び出しは、この追加の暗黙のアクションを実行しません。
  • だから、インスタンス初期化子はsuperconstructorが呼び出された直後に実行される - (暗黙的に)public Employee(String n, double s)からです。これは、2つの引数のコンストラクタの本体が実行される前に発生します。

    0

    実際の質問は何か分かりませんが、少し混乱します。初期化の順序(静的、オブジェクト、コンストラクタ)はあらかじめ定義されており、コードにどの順序で表示されるかは関係ありません。一般的なスタイルに関しては、私は一般的にオブジェクトの初期化ブロックの使用をお勧めしません。これは非常に一般的なエラーの原因です。例外処理がより複雑になり、デバッグが難しくなります。さらに、それは非常に一般的なパターンではないので、開発者はバグを分析するときにそれを探して見逃す傾向があります。

    0

    Javaコンパイラは、オブジェクトの初期化ブロック内のコードが各コンストラクタから呼び出されるようにする必要があります。ほとんどのコンストラクタでは、super()への暗黙的または明示的な呼び出しの直後にコンストラクタにコードを挿入します。しかし、this()で始まるコンパイラでは、最初にに暗黙的に呼び出され、super()に暗黙的にコールされます。もう1つのコンストラクタがこれを処理します。第2に、そのようなコンストラクタでは、オブジェクト初期化子ブロックはまったく挿入できません。これは、2番目のコンストラクタが呼び出されたときにコードが取得されるためです。したがって、this()コールが発生した最初のことです。

    関連する問題