2013-08-16 32 views
0

In which of the following case i get output "Hello World" ?如果子類不覆蓋超類所覆蓋的字符串,則輸出是什麼?

class A{ 

@Override 
public String toString() { 
    return "Hello World"; 
} 

} 

public class B extends A{ 

public void print(){ 
     //replace code that displays "Hello World" 
    } 

    public static void main(String args[]){ 
     new B().print(); 
    } 

} 

I.的System.out.println(新A());

二, System.out.println(new B());

III.System.out.println(this);

1. only I 
2. I and III 
3. I and II 
4. all I,II and III 

answer is 4all I,II and III

i understood about I but why II and III is also right ?

EDIT : Also specify which section of jls provides this specification ?

+0

'toString()'被所有子類覆蓋。 – Santosh

+0

但是爲什麼在創建子類實例的情況下打印輸出到超類的字符串 – Prateek

+0

請檢查我的答案。 – Santosh

回答

1

如果您在類中引用了一個方法,那麼它將在同一個類中搜索到,如果沒有找到,請在超類中搜索等等,直到您到達Object類。

無論你什麼時候做System.out.println(object),它總是會調用對象的toString()方法。如果您沒有實現它,則調用超類toString()

  • 對於System.out.println(new B());它的超AtoString()被稱爲B沒有覆蓋它。

  • 對於System.out.println(this);;因爲this指的是B類的對象,A的另一個toString()被稱爲B並不是重寫它。

+0

謝謝Santosh。但是不知道jls的哪一部分爲此提供了理由。 – Prateek

+0

[JLS中的特定部分](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8)沒有明確提及此。但這是繼承的自然含義。 [此鏈接](http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html)提供了一些信息。 – Santosh

2

類B是擴展到類A,所以B 繼承 A的所有方法(即B的toString()也會返回「Hello World」)。這就是爲什麼當你在類B對象(即this和new B())上調用print()時,它會說「Hello World」。

你將不得不重新定義/再覆蓋B級了toString()函數,如果你希望它返回一個不同的字符串。

0
  • 的System.out.println(新A());

    創建一個新對象,並作爲要直接打印由默認的toString一個對象()方法將被調用。

  • System.out.println(new B());

    創建了B的新對象,並且現在將一個對象作爲參數傳遞給println()。因此默認情況下再次調用toString()。但因爲你還沒有在A類類B.So的toString()中定義的toString()將被稱爲

  • 的System.out.println(本);

    這與第二種情況相同。

p.s for better understanding將class B中的print()方法更改爲toString()。然後你可以看到差異。