52 votes

Constructeurs et héritages par défaut en Java

J'ai une question à propos de constructeurs par défaut et héritage en Java.

Généralement, si vous écrivez une classe et ne comprennent pas de tout constructeur, Java fournit automatiquement un constructeur par défaut (sans paramètre), qui initialise toutes les variables d'instance de la classe (si il y en a) avec certaines valeurs par défaut (0, null ou false). Si vous écrivez un constructeur, cependant, avec certains paramètres, et vous n'écris pas de constructeur par défaut, puis Java ne fournit pas de constructeur par défaut. Ma question est: ce qui est le cas avec les classes qui héritent d'autres classes - si j'écris un constructeur avec certains paramètres, mais ne comprennent pas de constructeur par défaut, ils héritent par défaut, le constructeur de la super classe?

Je vous remercie.

63voto

paulmurray Points 1764
  1. Si vous ne créez pas de constructeur, le constructeur vide par défaut est automatiquement créé .

  2. Si un constructeur n'appelle pas explicitement un super ou ce constructeur en tant que première instruction, un appel à super () est automatiquement ajouté .

Toujours.

54voto

starblue Points 29696

Les constructeurs ne sont pas hérités.

En outre, l'initialisation des champs est effectuée par la machine virtuelle et non par le constructeur par défaut. Le constructeur par défaut appelle simplement le constructeur par défaut de la superclasse, et le constructeur par défaut de Object est vide. L'avantage de cette conception est qu'il n'y a aucun moyen d'accéder aux champs non initialisés.

11voto

Peter Lawrey Points 229686

Sauf si vous utilisez super (...), un constructeur appelle le constructeur vide de son parent. Remarque: Ceci s’applique à toutes vos classes, même à celles qui étendent Object.

Ceci n'hérite pas, les sous-classes n'obtiennent pas les mêmes constructeurs avec les mêmes arguments. Cependant, vous pouvez ajouter des constructeurs qui appellent l'un des constructeurs de la super classe.

6voto

Abhishek Nair Points 31

La règle de base est un appel (ou invocation) à un constructeur doit être la première instruction que la JVM doit exécuter,

Ainsi, lorsque vous avez un super classe avec seulement le constructeur paramétré et pas de constructeur par défaut, et de la classe de base n'a pas d'appel explicite au constructeur paramétré de la super-classe, JVM fournit le super(); appel qui déclenche une erreur car il n'y a pas de constructeur par défaut pour la super-classe, soit nous fournir un constructeur par défaut dans la super-classe ou nous appeler explicitement le constructeur paramétré de la super-classe dans le constructeur de classe de base. quand nous donnons de l'appel explicite, puis de la JVM n'est pas la peine de mettre la ligne de super(); en tant que constructeur d'invocation doit être la première instruction de la méthode, qui ne peut pas se produire (en raison de notre appel explicite).

3voto

potyl Points 1112

Si vous fournissez un constructeur, Java ne vous générera pas de constructeur vide par défaut. Ainsi, votre classe dérivée ne pourra appeler que votre constructeur.

Le constructeur par défaut n'initialise pas vos variables privées aux valeurs par défaut. La preuve en est qu'il est possible d'écrire une classe qui n'a pas de constructeur par défaut et dont les membres privés sont initialisés aux valeurs par défaut. Voici un exemple:

 public class Test {

	public String s;
	public int i;

	public Test(String s, int i) {
		this.s = s;
		this.i = i;
	}

	public Test(boolean b) {
		// Empty on purpose!
	}

	public String toString() {
		return "Test (s = " + this.s + ", i = " +  this.i + ")";
	}

	public static void main (String [] args) {
		Test test_empty = new Test(true);
		Test test_full = new Test("string", 42);
		System.out.println("Test empty:" + test_empty);
		System.out.println("Test full:"  + test_full);
	}
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X