Pourquoi est-constructeur de la super classe appelée lorsque nous déclarons l'objet de la sous-classe? (Java)
Considérer ce code:
class Test {
Test() {
System.out.println("In constructor of Superclass");
}
int adds(int n1, int n2) {
return(n1+n2);
}
void print(int sum) {
System.out.println("the sums are " + sum);
}
}
class Test1 extends Test {
Test1(int n1, int n2) {
System.out.println("In constructor of Subclass");
int sum = this.adds(n1,n2);
this.print(sum);
}
public static void main(String[] args) {
Test1 a=new Test1(13,12);
Test c=new Test1(15,14);
}
}
Si nous avons un constructeur de la super classe, il sera appelé par chaque objet que nous construisons pour les enfants de la classe (ex. Objet a
pour la classe Test1
appels Test1(int n1, int n2)
et ainsi que son parent Test()
).
Pourquoi cela se produit?
La sortie de ce programme est:
Dans le constructeur de la Superclasse
Dans le constructeur de la sous-classe
les sommes sont 25
Dans le constructeur de la Superclasse
Dans le constructeur de la sous-classe
les sommes sont 29
Vous devez vous connecter pour publier un commentaire.
Car il permettra de s'assurer que lorsqu'un constructeur est appelé, il peut s'appuyer sur tous les champs de sa super-classe cours d'initialisation.
voir 3.4.4 dans ici
Oui. Une super-classe doit être construit avant une classe dérivée peut être construit trop, sinon certains champs qui devraient être disponibles dans la classe dérivée n'a pas pu être initialisé.
Une petite note:
Si vous avez d'appeler explicitement la super constructeur de la classe et de passer certains paramètres:
alors les super constructeur doit être le premier appel de la méthode en dérivé du constructeur.
Par exemple, cela ne compile pas:
Que nous savons bien que le constructeur par défaut est fourni par le compilateur automatiquement, mais il ajoute aussi super() pour la première déclaration.Si vous créez votre propre constructeur et vous ne disposez pas de ce() ou super() comme la première déclaration, compilateur fournira super() comme la première instruction du constructeur.
Classes Java sont instanciés dans l'ordre suivant:
(à classload temps)
0. les initialiseurs statiques des membres et de l'initialiseur statique blocs, afin
de la déclaration.
(à chaque nouvel objet)
de classe, d'évaluer les arguments et une boucle à l'étape précédente. Toutes les étapes
sont terminées pour que constructeur, y compris les nouvelles de la récursivité
constructeur appelle, avant de continuer.
la super-classe (à l'aide de la non-arg constructeur, si non spécifié). Comme #2,
passer par toutes ces étapes pour la super-classe, y compris la construction de
C'EST super classe, avant de continuer.
l'ordre de déclaration.
C'est comment Java fonctionne. Si vous créez un objet enfant, le super constructeur est (implicitement) appelé.
La sous-classe hérite des champs de sa super-classe(es) et les champs ont pour obtenir construit/initialisé (c'est le but d'un constructeur: init aux membres de la classe, de sorte que l'instance fonctionne selon les besoins. Nous savons que certaines personnes mais beaucoup plus de fonctionnalités dans ces pauvres constructeurs...)
Constructeur implémente la logique qui fait de l'objet prêt à l'emploi. Objet peut tenir de l'état dans les champs privés, de sorte que seule sa classe de méthodes d'accès. Donc, si vous souhaitez instance de votre sous-classe vraiment être prêt à travailler après l'appel du constructeur (c'est à dire l'ensemble de ses fonctionnalités, y compris hérité de la classe de base est OK) de la base du constructeur de la classe doit être appelée.
C'est pourquoi le système fonctionne de cette façon.
Automatiquement le constructeur par défaut de la classe de base est appelé. Si vous voulez changer cela, vous devez appeler explicitement le constructeur de la classe de base par écrit
super()
dans la première ligne de votre sous-classe' constructeur.Le constructeur de classe de base sera appelée avant que le constructeur de la classe dérivée. Cela a un sens parce qu'il garantit que la classe de base est construit correctement lorsque le constructeur de la classe dérivée est exécutée. Cela vous permet d'utiliser certaines des données à partir de la classe de base lors de la construction de la classe dérivée.
Lorsque nous créons un objet de la sous-classe, il doit prendre en considération toutes les fonctions de membre et de membre des variables définies dans la superclasse. Un cas peut arriver que certains membre de la variable peut être initialisée dans certains de la super-classe des constructeurs. C'est pourquoi, lorsque nous créons une sous-classe de l'objet, tous les constructeurs correspondant dans l'arbre d'héritage sont appelés dans le haut-fond de la mode.
En particulier lorsqu'une variable est définie comme protégé il sera toujours accessible dans la sous-classe indépendamment de savoir si une sous-classe est dans le même colis ou de ne pas. Maintenant à partir de la sous-classe si nous appelons une super-classe de la fonction d'impression de la valeur de ce protégé de la variable(qui peut être initialisé dans le constructeur de la superclasse) on doit obtenir le bon initialisé la valeur.Par conséquent, tous les super-classe constructeurs sont invoqués.
En interne Java appels super() à chaque constructeur. De sorte que chaque sous-classe constructeur appelle le constructeur de la superclasse de l'utilisation de super() et par conséquent, ils sont exécutés en haut-en bas de la mode.
Remarque : les Fonctions peuvent être remplacées de ne pas les variables.
Puisque vous êtes en héritant des propriétés de classe de base dans la classe dérivée, il peut y avoir certains cas où votre classe dérivée de constructeur requiert certains de la classe de base des variables à initialiser ses variables. Alors d'abord il a pour initialiser la base de variables de classe, puis de la classe dérivée des variables. C'est pourquoi Java appels en premier constructeur de classe de base, puis constructeur de classe dérivée.
Et aussi il n'a pas de sens pour initialiser la classe enfant avec l'initialisation de classe parent.
Constructeur de la Super classe en disant d'abord parce que toutes les méthodes dans le programme tout d'abord présenter dans le tas et après la compilation ils dans les magasins de la pile,en raison de laquelle super constructeur de la classe est appelée en premier.
Dans des mots simples, si super classe a un constructeur paramétré, vous devez explicitement appel à super(params) dans la première ligne de votre enfant le constructeur de la classe le reste, implicitement, tous les super-classe les constructeurs sont appelés jusqu'à la classe d'objet est reachead.
Il y a un appel super() dans votre constructeurs par défaut des sous-classes.
"Si un constructeur ne pas appeler explicitement un constructeur de la superclasse, le compilateur Java insère automatiquement un appel au constructeur sans argument de la classe mère. Si la super-classe ne possède pas de constructeur sans argument, vous obtiendrez une erreur de compilation. L'objet n'avoir un tel constructeur, de sorte que si l'Objet est la seule super-classe, il n'y a pas de problème."
(source: https://docs.oracle.com/javase/tutorial/java/IandI/super.html)
Je vais essayer de répondre à ce à partir d'un point de vue différent.
Supposons que Java n'a pas le super constructeur automatiquement pour vous. Si vous héritent de la classe, vous devez appeler le super constructeur implicitement, ou de réécriture de vous-même. Il faudrait que vous avez connaissance de la façon dont la super-classe fonctionne, ce qui est mauvais. Elle nécessiterait également de réécrire le code, qui est aussi pas bon.
Je suis d'accord que l'appel de la super constructeur de derrière les scènes, c'est un petit peu intuitive. D'autre part, je ne suis pas sûr de savoir comment ils auraient pu faire cela dans une manière plus intuitive.
Que nous savons que membre variables(champs)d'une classe doit être initialisé avant de créer un objet, car ces champs représentent l'état de l'objet. Si ces champs sont explicitement pas initilized puis compilateur implicitement leur fournit des valeurs par défaut à l'appel sans argument constructeur par défaut. C'est pourquoi la sous-classe constructeur invoque super classe sans argument constructeur par défaut ou implicitement invoquée par le compilateur .Les variables locales ne sont pas fournis valeurs par défaut par le compilateur.
ici votre extension de Test à votre classe test1 sens u peut accéder à toutes les méthodes et variables de test dans votre test1. gardez à noter que u peut accéder à une classe de méthodes ou variable seulement si la mémoire est allouée pour elle et pour ce est-il besoin de certains constructeur, soit par défaut ou paramétrable ,donc, ici, wen le compilateur trouve que c'est l'extension d'une classe, il va essayer de trouver la super constructeur de la classe, de sorte que u peut accéder à toutes ses méthodes.
Parents Sort En Premier!!
Et comme le monde réel de l'Enfant ne Peut pas exister sans les Parents..
Si l'initialisation des parents(super-classe) il est d'abord important afin d'utiliser thrm chez les enfants(sous-classe) Classes..