2016-08-23 1 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] 

J'essaie d'appeler le constructeur de la classe Thread, Thread (String name) au lieu d'utiliser super (nom) mais quand j'utilise new Thread (String name) la sortie est différente. S'il vous plaît expliquer la sortie différente. Est-ce dû au super constructeur par défaut? Si oui, comment puis-je utiliser le constructeur parent Thread (String name) sans super()?comportement super() en Java lors de l'appel explicitement du constructeur parent

+1

'new Thread (name)' crée simplement un nouvel objet thread. Utiliser super (...) pour appeler le constructeur parent est la seule façon de le faire en Java (vous n'avez pas d'héritage multiple donc il n'y a pas de problème avec ça). – frenzykryger

+0

En règle générale, il est généralement mauvais de créer vos propres classes de threads. Utilisez 'Runnable', et même alors, il est généralement préférable de les exécuter sur un exécuteur au lieu de threads individuels. – chrylis

+0

@chrylis pouvez-vous expliquer ce que vous voulez dire par executer? –

Répondre

7

super(name) et new Thread(name); ne, à distance , faites la même chose

super(name) appelle le constructeur parent de l'instance en cours, lui donnant ainsi la possibilité d'initialiser son instance. partie de l'instance avant que la sous-classe commence le processus d'initialisation ses parties de l'instance.

new Thread(name) crée un Thread entièrement distinct et le rejette (car vous n'enregistrez jamais le résultat nulle part). C'est exactement comme toute autre fois que vous utilisez new: Vous créez un objet nouvel, n'appelant pas votre constructeur de superclasse.

Si oui, comment puis-je utiliser le constructeur parent Thread (String name) sans super()?

Votre sous-classe doit donner à la superclasse une chance de procéder à son initialisation. Si vous ne codez pas un appel à super(...), le compilateur Java insérera un appel à super() (aucun paramètre) pour vous. Donc, la question n'a pas vraiment de sens: Dans une sous-classe Thread, vous donnez Thread sa chance d'initialiser en utilisant super(...). Vous n'utilisez pas new Thread(...) pour cela.

Vous pouvez utiliser new Thread dans ce code pour créer un fil entièrement nouvelle, distincte, indépendante, tout comme vous pouvez utiliser new HashMap pour créer une nouvelle HashMap. Mais je doute beaucoup que tu le veuilles. Cela n'aurait rien à voir avec le fait que la superclasse de votre classe est Thread.

+0

Mais pourquoi le constructeur de superclasse n'est pas appelé quand j'écris un nouveau Thread (nom)? Il devrait appeler Thread (nom). Ça ne devrait pas? @ T.J.Crowder Est-ce que super (nom) ne fait pas la même chose que Thread (nom)? –

+1

@AyushN: 'new Thread (name)' appelle le constructeur 'Thread', mais ** not ** on' this', l'objet que votre constructeur est en train d'initialiser. Il l'appelle sur une nouvelle instance non liée à la place. Donc non, comme je l'ai dit plus haut, 'super (nom)' est complètement différent de 'nouveau Thread (nom)'. ** Sauf ** vous voulez créer un thread ** séparé **, utilisez 'super', pas' new Thread'. –

3

Si vous appelez new Thread(String name) au lieu de super(name), vous créez un nouvel objet Thread (qui ne se rapporte pas à l'instance NewThread1 que vous venez de construire), et lui passer le paramètre name. Par conséquent, votre NewThread1 instance a un nom par défaut dans ce cas (puisque le compilateur ajoute implicitement super() appeler le constructeur Thread parameterless.

NewThread1 (String name) { 
    new Thread(name); 
    System.out.println("child Thread:"+this); 
} 

est le même que

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

Thread (nom) alloue également un objet Thread, tout comme super (nom). Maintenant, super (nom) alloue à 'cet' objet mais n'appelle pas le même constructeur parent Thread (nom). alors comment alloue-t-il un objet de type Thread à NewThread1 type 'this'? @Eran –