2017-06-20 3 views
0

誰かが "DAC"ではなく "DDAC"である理由を私に説明することができますか?なぜ "D"を2回印刷するのですか?プログラムの出力。テストタイプの質問

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

**デバッガ**で実行してください。 –

+1

デバッガを使用してステップスルーする必要があります。 –

+2

'B'の' getText'が2回呼び出されたことに気がついたら、 "謎"を解決する必要があります。 – dasblinkenlight

答えて

2

同じ名前の異なるクラスに2つのメソッドがあるため、コードが混乱しています。あなたはコンストラクタB()getText()を呼び出し、クラスBのテキストを取得していました。クラスAのテキストを取得したかったのですが、クラスBのgetText()の名前をgetBText()に変更し、メソッドを正しく呼び出しました。

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(); 
    } 
} 

、出力は、あなたが期待する方法である::コードは、以下に示すコードで

DAC 
2

、あなたが

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

はBのコンストラクタは、最初に呼び出されたときに表示された場合それは

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

です今、「DAC」

text = "DAC"; 

ときにコンストラクタが呼び出されたときに

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

スーパークラスの属性でテキストの値が値を取得し、属性のテキストはそうスーパー から継承された参照Bのインスタンスが作成され、その後、再度BののgetText()が呼び出され、次のコードを呼び出し

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

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

「DDAC」を印刷します。

+0

これは問題に非常に明確な答えはありません... – CodingNinja

+0

私は、スーパークラスのテキスト属性がサブクラスのコンストラクタで変更されていることを説明しました。 –