2017-06-20 5 views
0

quelqu'un pourrait-il m'expliquer pourquoi la sortie est "DDAC" et non "DAC"? Pourquoi il imprime "D" deux fois?Sortie d'un programme. Test type de questions

class A { 
    String text = "A"; 
    String getText(){ 
     return text; 
    } 
    public static void main(String[] args) { 
     System.out.println((new B()).getText()); 
    } 
} 
class B extends A{ 
    B(){ 
     text = getText() + "C"; 
    } 
    String getText(){ 
     return "D" + super.getText(); 
    } 
} 
+4

Exécutez-le dans votre ** débogueur **. –

+1

Vous devez passer par un débogueur. –

+2

Une fois que vous vous rendez compte que '' getText' 'B' est appelé deux fois, le" mystère "devrait être résolu pour vous. – dasblinkenlight

Répondre

2

Votre code est source de confusion car vous avez deux méthodes dans différentes classes portant le même nom. Vous avez appelé getText() dans votre constructeur B(), qui obtenait le texte de la classe B. Vous vouliez qu'il obtienne du texte de la classe A. Tout ce que j'ai fait était de changer le nom de getText() en classe B en getBText(), et j'ai appelé les méthodes correctement. Code ci-dessous:

class ScratchPaper { 
    String text = "A"; 
    String getText(){ 
     return text; 
    } 
    public static void main(String[] args) { 
     System.out.println((new B()).getBText()); 
    } 
} 
class B extends ScratchPaper { 
    B(){ 
     text = getText() + "C"; 
    } 
    String getBText(){ 
     return "D" + super.getText(); 
    } 
} 

Et la sortie est de savoir comment vous attendiez:

DAC 
2

Dans le code, si vous voyez quand

public static void main(String[] args) { 
    System.out.println((new B()).getText()); 
} 

est appelé en premier lieu, le constructeur de B est appelé c'est

B(){ 
    text = getText() + "C"; 
} 

ici si vous voir le texte de l'attribut est héritée de la superclasse A Ainsi, lorsque le constructeur est appelé

B(){ 
    text = getText() + "C"; 
} 
String getBText(){ 
    return "D" + super.getText(); 
} 

la valeur du texte est un attribut de la superclasse obtenir la valeur « DAC »

text = "DAC"; 

Maintenant, quand l'instance de B est créé, puis une nouvelle fois getText() de B est appelé

**(new B()).getText()** 

qui appelle le code ci-dessous

String getBText(){ 
return "D" + super.getText(); // here super.getText() = "DAC" 
} 

qui imprime "DDAC" !!!

+0

Cela n'a pas une réponse très claire au problème ... – CodingNinja

+0

Je viens d'expliquer l'attribut de texte de la superclasse est en cours de modification dans le constructeur de la sous-classe, ce qui provoque l'impression de D deux fois –