2011-05-03 28 views
2

我是Java初學者。 任何人都可以解釋爲什麼它打印輸出2?Java程序的輸出

interface Foo { 
    int bar(); 
} 

public class Beta { 
    class A implements Foo { 
     public int bar() { 
      return 1; 
     } 
    } 

    public int fubar(final Foo foo) { 
     return foo.bar(); 
    } 

    public void testFoo()// 2 
    { 
     class A implements Foo { 
      public int bar() { 
       return 2; 
      } 
     } 
     System.out.println(fubar(new A())); 
    } 

    public static void main(String[] args) { 
     new Beta().testFoo(); 
    } 
} 

回答

5

那是因爲你重新定義Class A這裏:

class A implements Foo { 
     public int bar() { 
      return 2; 
     } 
    } 
    System.out.println(fubar(new A())); 

所以,當你做return foo.bar();返回2

+1

我認爲可能是由於對「new A()」的調用發生在testFoo()方法而不是fubar()的上下文中而引起混淆。 – 2011-05-03 15:25:41

+0

+1,快速正確迴應。但@Neal,我喜歡避免使用「重新定義」這個術語,因爲在其他一些語言中,您實際上可以重新定義方法本身。我喜歡「隱藏」一詞。思考? – 2011-05-03 15:28:56

+0

@Dumum,是的,但是如何在這種情況下放置'hide'? – Neal 2011-05-03 15:29:30

3

因爲A的最裏面的定義是在testFoo()方法,其方法bar()返回2.

您可能還會發現answer to my question從今天有趣。

0

當你說:System.out.println(fubar(new A()));

創建的類A是()內部命名爲testFoo定義的。

0

在Java中有許多地方可以用更多的本地名稱隱藏更廣泛的名稱。對於參數和成員變量,類名等等,這是真的。在你的情況下,你隱藏Beta.A和你在方法中定義的A.