2010-11-15 19 views
3

Je Hava léger doute quant à la sortie du programme de Constructor Enchaînement je l'ai montré ci-dessous:Constructor Enchaînement en Java

class Cube { 

    int length; 
    int breadth; 
    int height; 
    public int getVolume() { 
     return (length * breadth * height); 
    } 
    Cube() { 
     this(10, 10); 
     System.out.println("Finished with Default Constructor of Cube"); 
    } 
    Cube(int l, int b) { 
     this(l, b, 10); 
     System.out.println("Finished with Parameterized Constructor having 
            2 params of Cube"); 
    } 
    Cube(int l, int b, int h) { 
     length = l; 
     breadth = b; 
     height = h; 
     System.out.println("Finished with Parameterized Constructor having 
            3 params of Cube"); 
    } 
} 

public class SpecialCube extends Cube { 

    int weight; 
    SpecialCube() { 
     super(); 
     weight = 10; 
    } 
    SpecialCube(int l, int b) { 
     this(l, b, 10); 
     System.out.println("Finished with Parameterized Constructor having 
            2 params of SpecialCube"); 
    } 
    SpecialCube(int l, int b, int h) { 
     super(l, b, h); 
     weight = 20; 
     System.out.println("Finished with Parameterized Constructor having 
            3 params of SpecialCube"); 
    } 
    public static void main(String[] args) { 
     SpecialCube specialObj1 = new SpecialCube(); 
     SpecialCube specialObj2 = new SpecialCube(10, 20); 
     System.out.println("Volume of SpecialCube1 is : " 
       + specialObj1.getVolume()); 
     System.out.println("Weight of SpecialCube1 is : " 
       + specialObj1.weight); 
     System.out.println("Volume of SpecialCube2 is : " 
       + specialObj2.getVolume()); 
     System.out.println("Weight of SpecialCube2 is : " 
       + specialObj2.weight); 
    } 
} 

SORTIE:

Finished with Parameterized Constructor having 3 params of SpecialCube 
Finished with Parameterized Constructor having 2 params of SpecialCube 
Volume of SpecialCube1 is : 1000 
Weight of SpecialCube1 is : 10 
Volume of SpecialCube2 is : 2000 
Weight of SpecialCube2 is : 20 

Le doute est au sujet de la OutPut que la façon dont « 1000 "," 10 "," 2000 "&" 20 "sont achiueved?

Dans la classe principale Nous avons créé deux objets:

SpecialCube specialObj1 = new SpecialCube(); 
SpecialCube specialObj2 = new SpecialCube(10, 20); 

D'abord avec « Pas de paramètres » et deuxième avec « deux paramètres », Le Cube Premier constructeur() avec « Aucun paramètre » n'a que deux valeurs this(10,10) et celui avec « deux paramètres » a les valeurs

Cube(int l, int b) 
    {this(l, b, 10);} 

Je ne comprends pas comment les résultats ci-dessous sont générés.

Volume of SpecialCube1 is : 1000 
Weight of SpecialCube1 is : 10 
Volume of SpecialCube2 is : 2000 
Weight of SpecialCube2 is : 20 

S'il vous plaît Quelqu'un peut-il m'aider!

Merci, david

+2

essayer le débogage du code de son de la meilleure façon que vous pouvez suivre le flux –

+0

op semble erroné. Doit imprimer les déclarations contenues dans le cube() constructeur – shaunak1111

Répondre

3

Je pense que c'est évident. specialObj1 est créé lors du constructeur par défaut qui appelle le constructeur à 1 argument, qui appelle le constructeur à 3 arguments. Chaque invocation envoie 10 en tant que valeur de la dimension du cube. Ainsi, le volume est 10 * 10 * 10 = 1000;

Le poids n'est pas une méthode. C'est un champ initialisé par défaut et un constructeur à 3 arguments. En raison de la première chose que fait le constructeur est de (...) peu importe quelle valeur est assignée à cette variable dans d'autres constructeurs. Le premier constructeur de la chaîne écrase toutes les valeurs précédemment définies. C'est une raison pour laquelle poids = 10 pour le premier objet.

Le second objet est créé en utilisant un constructeur à 2 arguments appelé avec les paramètres 10 et 20, donc le volume est 10 * 20 * 10 = 2000. (le second 10 est défini lorsque le constructeur 2args appelle le constructeur 3args.) second objet le poids est défini par le constructeur 3-args, car le constructeur 2-args ne remplace pas cette valeur.

J'espère que cela aide.

+1

Un constructeur sans paramètre est un constructeur qui ne prend aucun argument Un constructeur par défaut est un constructeur sans paramètre d'un objet fourni par le compilateur quand aucun autre constructeur n'est disponible pour l'objet. ct. Il n'y a pas de constructeur par défaut dans cet exemple! –

4

Eh bien, nous allons prendre un cas à la fois. Pour la première version, la chaîne du constructeur va:

SpecialCube() 
Cube() 
Cube(10, 10) 
Cube(10, 10, 10) 

Ainsi, le cube se termine avec un volume de 1000, et le poids par défaut de 10 (tel que spécifié dans le constructeur SpecialCube parameterless).

Dans le second cas, la chaîne du constructeur ressemble à ceci:

SpecialCube(10, 20) 
SpecialCube(10, 20, 10) 
Cube(10, 20, 10) 

et le poids est fixé à 20 par le constructeur SpecialCube(int l, int b, int h) parameterless - nous avons donc un volume de 2000 et un poids de 20

Si cela ne vous explique pas tout, posez une question très précise - idéalement sur un des cas, en indiquant quel bit vous ne comprenez pas.

7

Lorsque vous appelez SpecialCube(), le flux est comme celui-ci (pseudo-code):

SpecialCube() 
    -> Cube() 
    -> Cube(10,10) 
     -> Cube(10,10,10) 
      l:=10, b:=10, h:=10 
      print message "Finished with Parameterized Constructor having 3 params of Cube" 
     print message "Finished with Parameterized Constructor having 2 params of Cube" 
    print message "Finished with Default Constructor of Cube" 
    weight:=10 

Et à la fin vous avez un cube construit avec (l,b,h) = (10,10,10)

0

Détaillez-le:

SpecialCube1 est par défaut construit, donc appelle le constructeur par défaut SpecialCube(), qui à son tour appelle super(), qui par défaut co nstructs Cube(), cela va expliquer les deux premiers. Où SpecialCube2 suit la chaîne de constructeur appropriée de SpecialCube.

0

ici ces sorties sont générés en raison

volume de SpecialCube1 est: 1000 // lors de la première fois la fonction getVolume est appelée, elle devient 10,10,10, comme arguments observent le code suivant où l, b, les valeurs de h sont affectés à la longueur, la largeur, la hauteur

Cube(int l, int b, int h) { 
//l=10,b=10,h=10 

System.out.println(l); 
System.out.println(b); 
System.out.println(h); 
    length = l; 
    breadth = b; 
    height = h; 

poids de SpecialCube1 est: 10 // dans le premier poids de construction est associé à 10 (c.-à-premier objet)

Le volume de SpecialCube2 est: 2000 // pour la deuxième fois, la fonction getVolume obtient des arguments de specialcube (3 argmted constr ie 10,20,10;

SpecialCube(int l, int b, int h) 
{ 
//l=10,b=20,h=10 
    super(l, b, h); 
    System.out.println(l); 
System.out.println(b); 
System.out.println(h); 
    weight = 20; 

Poids de SpecialCube2 est: 20 // dans le 2ème poids constr est affecté à 20 (ie 1er objet)

SpecialCube (int l, int b, int h) { // l = 10, b = 20, h = 10

super(l, b, h); 
    System.out.println(l); 
System.out.println(b); 
System.out.println(h); 
    weight = 20; 
1

Ci-dessous, le flux d'exécution,

étape 1: Lorsque "SpecialCube specialObj1 = new spéciale Cube();" exécuté, le constructeur par défaut "SpecialCube()" sera appelé.

Étape 2: Maintenant, "Super()" sera utilisé pour appeler le "Cube" de super classe "SpecialCube". Etape 3: Maintenant "this (10,10)" dans super classe "cube" sera exécuté, ce qui appellera constructeur de 2 paramètres de la même classe "cube", ie "Cube (int l, int b) "en passant des paramètres (l = 10, b = 10).

Étape 4: Maintenant, "this (l, b, 10) sera exécuté avec le paramètre actuel passé à l'étape # 3 est" this (10,10,10) ", qui appellera le constructeur 3 paramétré" Cube (int l, int b, int h) ", en passant les valeurs de l'étape 3, ce sera comme" Cube (int l = 10, int b = 10, int h = 10) "

Étape 5: instance variables comme longueur = 10, largeur = 10, hauteur = 10 pour l'objet "specialObj1" créé à l'étape 1.

Étape 6: Alors java affectera la variable "Poids" à 10 dans le constructeur "SpecialCube() ".System.out.println ("Volume de SpecialCube1 est:

Étape 7 (voir l'étape 1)

maintenant voir l'exécution de la méthode pour objet "SpecialCube()"(je suis envisagiez que "specialObj1".: "+ specialObj1.getVolume());, lorsque cette instruction est exécutée, java appellera la méthode super" Cube's "" getVolume() ", puisque la sous-classe" SpecialCube "hérite de son mot clé" extends ", référez-vous ci-dessous dans votre sous-liste.

public class SpecialCube étend Cube

étape 8: Etape 1-5, déjà attribué variable instanace comme « longueur = 10, largeur = 1 0, hauteur = 10 ", votre volume d'obtention de" 1000 ".

étape 9: "System.out.println (" Poids de SpecialCube1 est: « + specialObj1.weight); - cette déclaration imprimer la "" valeur variable "poids 10", en raison de l'étape 6

.

Hope, il expliquera le reason.Try le même flux pour objet « specialObj2 ».