2016-08-23 5 views
2
class NewThread1 extends Thread{ 

    NewThread1(String name){ 

    super(name); //this line replaced by 'new Thread(name);' 

    System.out.println("child Thread:"+this); 

    } 
} 

public class ThreadCreationExtend { 
    public static void main(String[] args) { 
     new NewThread1("Thread1"); 
     new NewThread1("Thread2"); 
    } 
} 

output:child Thread:Thread[Thread1,5,main] 
     child Thread:Thread[Thread2,5,main] 

output after replacement: 
          child Thread:Thread[Thread-0,5,main] 
          child Thread:Thread[Thread-1,5,main] 

スレッド(String name)を使用する代わりにThreadクラスのコンストラクタ、Thread(String name)出力は異なって来ています。異なる出力を説明してください。 デフォルトのスーパーコンストラクタのためですか?もしそうなら、どのようにスーパーコンストラクタThread(String name)をsuper()なしで使うのですか?あなたがnew Thread(String name)代わりのsuper(name)を呼び出す場合親コンストラクタを明示的に呼び出すときのjavaのsuper()動作

+1

'new Thread(name)'は新しいスレッドオブジェクトを作成するだけです。スーパーコンストラクタを呼び出すためにsuper(...)を使用するのは、javaでそれを行う唯一の方法です(複数の継承を持たないため、問題はありません)。 – frenzykryger

+0

一般的に、独自のスレッドクラスを作成するのは悪い習慣です。 'Runnable'を使うと、個々のスレッドの代わりにエグゼキュータで実行する方が普通です。 – chrylis

+0

@chrylisあなたはexecuterが何を意味するのか説明できますか? –

答えて

7

super(name)new Thread(name);と同じではありませんです

super(name)は、現在のインスタンスの親コンストラクタを呼び出して、そのインスタンスを初期化する機会を与えます。サブクラスの前のインスタンスの一部は、のインスタンスの初期化プロセスを開始します。

new Thread(name)は、完全に別の新しいThreadを作成してから、結果をどこにも保存しないようにスローします。 newを使用しているときとまったく同じです。新しいオブジェクトを作成していて、スーパークラスのコンストラクタを呼び出していません。

もしそうなら、スーパーコンストラクタThread(String name)をsuper()なしで使用するにはどうすればよいですか?

サブクラスはスーパークラスに初期化の機会を与える必要があります。 super(...)への呼び出しをコーディングしないと、Javaコンパイラはsuper()(パラメータなし)の呼び出しを挿入します。したがって、質問は実際には意味をなさない:Threadサブクラスでは、super(...)を使用してThreadに初期化のチャンスを与えます。あなたはそのためにnew Thread(...)を使用しません。

あなた新しいHashMapを作成するためにnew HashMapを使用することができます同じように、全く新しい、独立した、独立したスレッドを作成するために、そのコードでnew Threadを使用することができます。しかし、私は非常にあなたがしたいことを疑う。あなたのクラスのスーパークラスがThreadであるという事実とは関係ありません。

+0

しかし、なぜ私は新しいスレッド(名前)を書くときにスーパークラスのコンストラクタが呼び出されないのですか?スレッド(名前)を呼び出す必要があります。それじゃない? @ T.J.Crowder スーパー(名前)はスレッド(名前)と同じことをしていませんか? –

+1

@AyushN: 'new Thread(name)'は 'Thread'コンストラクタを呼び出しますが、** thisではありません**、コンストラクタが初期化中のオブジェクトです。代わりに、関係のない新しいインスタンスで呼び出します。だから、上記のように、 'super(name)'は 'new Thread(name)'とはまったく異なります。 ** **別の**スレッドを作成しない限り、 '新しいスレッド 'ではなく' super'を使用してください。 –

3

、あなたは(あなただけの構築NewThread1インスタンスとは関係ありません)新しいThreadオブジェクトを作成し、それにnameパラメータを渡すされています。したがって、あなたのNewThread1インスタンスがリモートで、コンパイラが暗黙的にThreadパラメータなしのコンストラクタを呼び出すためにsuper()が追加されますので、

​​

。(この場合はデフォルトの名前を持つ

NewThread1 (String name) { 
    super(); // name is not passed to the super class constructor 
    new Thread(name); 
    System.out.println("child Thread:"+this); 
} 
+0

スレッド(name)もThreadオブジェクトを割り当てているため、super(name)です。 super(name)は 'this'オブジェクトに割り当てていますが、同じ親コンストラクタThread(name)を呼び出すわけではありません。それでは、スレッドタイプのオブジェクトをNewThread1型の 'this'オブジェクトにどのように割り当てますか? @Eran –

関連する問題