2009-09-21 62 views
0
interface I 
    { 
     void show(); 
    } 

    class A implements I 
    { 
    void show() 
    { 
     System.out.println("class A"); 
    } 
    public static void main(String s[]) 
    { 
     I i=new A(); 
     i.show(); 
     i.toString(); 
    } 
    } 

Q> As接口I不包含抽象方法toString()但仍然編譯下面的代碼。怎麼樣?覆蓋使用接口的方法

當超類變量用於引用子類obj時,編譯器首先搜索超類中的類似方法,如果未找到會給出錯誤。 這裏接口不包含方法toString()。

EX =>

class A 
{ 
    void show() 
    { 
    System.out.println("show"); 
    } 
} 

class B 
{ 
    void show() 
    { 
    System.out.println("show B"); 
    } 

    void display() 
    { 
    System.out.println("display B"); 
    } 

    public static void main(String s[]) 
    { 
    A a=new B(); 
    a.show();   //will execute 
    a.display();  //give error 
} 

回答

7

所有類自Object繼承。對象有一個toString。

要使用任何接口,它必須由實際的類支持。所以Java編譯器知道它可以在處理接口時使用java.lang.Object中定義的任何方法。

說得稍微不同的方式:

interface I { ... } 

有一個「神奇」的

interface I extends Object { ... } 

當一細節但是你不能使用任何方法,所以,你可以使用對象的方法沒有出現在界面中的具體類。因此,要你把兩個例子:

interface Car { 
    void drive(); 
} 

class Convertible implements Car { 
    void drive() {} 
    void openRoof() {} 

    public static void main() { 
    Car porscheBoxster = new Convertible(); 
    porscheBoxster.drive(); // OK - exists in interface 
    porscheBoxster.toString(); // OK - exists in java.lang.Object. 
    porscheBoxster.openRoof(); // Error. All we know is the porscheBoxster is of type Car. 
     // We don't know if it is a Convertible or not. 
    } 
} 
+0

當超類變量用於引用子類obj時,編譯器首先搜索超類中的類似方法,如果未找到會給出錯誤。 這裏接口不包含方法toString()。 ex => A級 { void show() { System.out。println(「show A」); } } B類 { 空隙顯示() { 的System.out.println( 「顯示B」); } void display() { System.out.println(「display B」); } public static void main(String s []) {a} = new B(); a.show(); //將執行 a.display(); //給出錯誤 } – yash 2009-09-21 11:02:42

+0

所有類都從Java中的Object繼承。所以Java知道它什麼時候遇到一個接口,它將被一個具體的類所支持,所以會有在java.lang.Object中定義的方法 – 2009-09-21 11:07:27

2

因爲「的toString()」是在每個非原始數據從派生的類對象。所以每個對象都有這個方法。

3

在Java中的每個類是Object,因此,他們總是能夠運行下面的方法:

  • 的clone()
  • 的equals(對象)
  • 的finalize()
  • 的getClass ()
  • 的hashCode()
  • 通知()
  • notifyAll的()
  • 的toString()
  • 等待()
  • 等待(長)
  • 等待(長,INT)
1

在Java中,每次構建類,從基類對象繼承。 這意味着你的類默認會有很多有用的方法,其中包括toString()。