1. super();
1.1. super.i = 7;
1.2. this.setI(20) => this.i = 60;
1.3. System.out.println("i from a is " + super.i) => 7;
2. this();
2.1. this.i = 10;
2.2. System.out.println("i from b is " + this.i) => 10;
A.i et B.i sont tous deux privés de package, B.i n'a pas de remplacement A.i, les deux sont indépendants
;
A.setI et B.setI sont tous deux publics, B.setI Override A.setI, ce que A appelle pendant la construction est B.setI;
L'initialisation du membre de B en dehors du constructeur est exécutée après que super() soit d'abord défini à 60 par B.i en super, puis défini à 10 par l'initialisation du membre de B ;B.setI
.
Après avoir supprimé
dans B, si A et B sont dans le même package, int i = 10; accédera à B.setI, et il n'y aura aucun changement une fois que A.i sera réglé sur 60 pendant super(), et ce sera être imprimé deux fois. Les deux ont 60 ansA.i
Si je déclare un membre dans la sous-classe qui existe déjà dans la classe parent, n'y aura-t-il pas d'erreur ? Cela devrait au moins être un avertissement.
Je peux seulement dire que la question est trop méchante. Il est impossible d’écrire ainsi dans le développement réel. Vous allez vous creuser un trou.
7.10 1. Accédez à la méthode de construction de A et terminez la construction des paramètres vides de l'objet. 2.int I=7 3.setI(20) appelle le setI() de la sous-classe À ce stade, le I de la sous-classe est de 60 et le I de la classe parent est toujours de 7. 4.Imprimez ceci .i vaut 7 dans la classe parent à ce moment-là ; (remarque : la variable dépend de l'appelant réel, il s'agit de la classe parent actuelle ; la méthode est appelée la sous-classe car elle a été remplacée) 5.int I=10 écrase le 60 original. 6, imprime ceci.i Cette fois, c'est 10.
60.60 Remarque : Si vous supprimez le I de la sous-classe, le I de la classe parent est appelé par défaut 3 Appelez setI de la sous-classe et attribuez-le à la classe parent. la classe parent passe à 60. 5 Il n'y a pas de remplacement pour le moment, this.i appelle par défaut le I hérité de la classe parent, qui est 60.
La séquence d'exécution est la suivante :
A.i
etB.i
sont tous deux privés de package,B.i
n'a pas de remplacementA.i
, les deux sont indépendantsA.setI
etB.setI
sont tous deux publics,B.setI
OverrideA.setI
, ce que A appelle pendant la construction estB.setI
;L'initialisation du membre de B en dehors du constructeur est exécutée après que
.super()
soit d'abord défini à 60 parB.i
en super, puis défini à 10 par l'initialisation du membre de B ;B.setI
Après avoir supprimé
dans B, si A et B sont dans le même package,
int i = 10;
accédera àB.setI
, et il n'y aura aucun changement une fois que A.i sera réglé sur 60 pendant super(), et ce sera être imprimé deux fois. Les deux ont 60 ansA.i
Si je déclare un membre dans la sous-classe qui existe déjà dans la classe parent, n'y aura-t-il pas d'erreur ? Cela devrait au moins être un avertissement.
Je peux seulement dire que la question est trop méchante. Il est impossible d’écrire ainsi dans le développement réel. Vous allez vous creuser un trou.
7.10
1. Accédez à la méthode de construction de A et terminez la construction des paramètres vides de l'objet.
2.int I=7
3.setI(20) appelle le setI() de la sous-classe À ce stade, le I de la sous-classe est de 60 et le I de la classe parent est toujours de 7.
4.Imprimez ceci .i vaut 7 dans la classe parent à ce moment-là ; (remarque : la variable dépend de l'appelant réel, il s'agit de la classe parent actuelle ; la méthode est appelée la sous-classe car elle a été remplacée)
5.int I=10 écrase le 60 original.
6, imprime ceci.i Cette fois, c'est 10.
60.60
Remarque : Si vous supprimez le I de la sous-classe, le I de la classe parent est appelé par défaut
3 Appelez setI de la sous-classe et attribuez-le à la classe parent. la classe parent passe à 60.
5 Il n'y a pas de remplacement pour le moment, this.i appelle par défaut le I hérité de la classe parent, qui est 60.
Sur l'importance de Degbug...