2017-04-26 4 views
0

私は継承について学び、以下に示すスーパークラスとサブクラスを持つこの単純なプログラムを使って作業しています。私の質問はこのプログラム特有のものではありません。しかし、これは私が最初にこれが起こったのを見たところで、より一般的な概念的な質問の例として使っています。

クラスをインスタンス化してコンストラクタを実行し、内容を出力するのはなぜですか?これまでの私の理解では、クラスをインスタンス化するだけでオブジェクトが作成されますが、何もしません。クラスをインスタンス化すると、クラスのコンテンツが出力されるのはなぜですか?

SuperClass1.java

public class SuperClass1 { 
      public SuperClass1(){   
       System.out.println("This is the superclass constructor."); 
      } 
     } 

SubClass2.java

public class SubClass2 extends SuperClass1 
{ 
    public SubClass2() 
    { 
     System.out.println("This is the subclass constructor."); 
    } 

} 

Main.java

public class Main { 

    public static void main(String[] args) 
    { 
     SubClass2 obj1 = new SubClass2(); // why should this print something? 
    } 
} 

出力
これはスーパークラスのコンストラクタです。
これはサブクラスのコンストラクタです。

+0

「クラスをインスタンス化する」とは、しばしば*何かをすることを意味します*。 Java自体は、各フィールドを0(またはnullまたはfalse)に設定する以外の方法を実際にはわかりません。それだけでは十分ではありませんので、実際にはクラスがインスタンス化されたときに何か*する必要があります。あなたのケースでは、 "インスタンス化"に 'println'が含まれます。 – markspace

+0

それがうまくいくからです。すべての基本的なことが説明されているので、Oracle Javaチュートリアルを読むことをお勧めします。 – Kayaman

答えて

0

まず、オブジェクトをインスタンス化するコンストラクタを呼び出す(および実行)を意味し、それはそれが何のためにあるのかです。

ので、この:

SubClass2 newInstance = <createNewInstance>; 
newInstance.<init()>; 

は、両方のJavaでコンストラクタ呼び出しnew SubClass2()によって行われます。オブジェクトの「構築」とそのプロパティの「初期化」との間には分離がありません。あなたが明示的にスーパークラスのデフォルトコンストラクタ(引数なし1)の別のコンストラクタを呼び出していない場合は、クラスのオブジェクトを作成するときに

さらに、自動的に最初に呼び出されます。したがって、サブクラスのオブジェクトをインスタンス化すると、スーパークラスのコンストラクタ(最初の行を出力します)が呼び出され、2行目が出力されます。詳細に

より、サブクラスは、シーンの背後にある次のようになります。あなたが呼び出すコンストラクタはprint文が含まれているため

public class SubClass2 extends SuperClass1 
{ 
    public SubClass2() 
    { 
     super(); // calls the superclass constructor 
     System.out.println("This is the subclass constructor."); 
    } 
} 
+0

http://www.geeksforgeeks.org/g-fact-67/これはあなたの例と非常によく似ており、パラメータ化されたコンストラクタを使ったもう1つの例が追加されています。 –

+0

ありがとう!これは私が理解しようとしていたものに完全に答える! –

+0

@MalteHartwigクラスが読み込まれてインスタンス化されるとき、コンストラクタを呼び出す必要はありません。オブジェクトを構築するとき、コンストラクタを使用して初期化されますが、クラスの初期化に関与するコンストラクタはありません。 –

0

あなたはそれにprint文を持つコンストラクタメソッドSubClass2()を呼び出します。

0

クラスISTがロードされたので、ステートメントがが印刷されるのではなく、インスタンス化およびコンストラクタが呼び出されるにそのクラスのオブジェクトのため:

クラスコンストラクタを使用せずにロードすることができることは、以下によって実証されますコード:

public class Test { 

    public static void main(String[] args) { 
     try { 
      Class.forName("Test$Inner"); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 

    static class Inner { 
     static { 
      System.out.println("static initializer"); 
     } 
     public Inner() { 
      System.out.println("inner ctor"); 
     } 
    } 
} 

このプログラムを実行すると、静的クラスの初期化子のみが呼び出され、コンストラクタはないことが示されます。

関連する問題