2013-10-24 38 views
0
class Do{ 
    void doit(){ 
     ClassA a = new ClassA(); 
     a.doSomething(>>>CODE HERE<<<); 
    } 
} 
interface InterfaceA{ 
    void doSomethingElse(); 
} 
class ClassA{ 
    void doSomething(InterfaceA f){ 
    } 
} 

問題: 完成上述代碼,以便doit方法打印出「Hello world!」。 只需在括號之間添加代碼即可,並且不會改變其他任何內容。以接口爲參數的方法

請問有人能幫我解決這個問題嗎?我仍然沒有線索。 我昨天在競猜空白離開它:((感謝您的幫助

+2

這是不可能的,就像上面所說的那樣。 ClassA的'doSomething'方法中是否存在一些代碼?我想在那個方法的主體中會有類似'f.doSomethingElse();'的東西。 – dasblinkenlight

+2

這不能是正確的代碼,因爲唯一的方法就是如果doA在ClassA中調用了f上的doSomethingElse。如果這樣做,我會給你一塊骨頭,告訴你如何實現這一目標,但從它的外觀來看,沒有辦法打印任何代碼。 – Radiodef

+1

您確定這是與測驗中出現的完全相同的問題嗎?我同意@dasblinkenlight。 – arshajii

回答

4
class Do{ 
    void doit(){ 
     ClassA a = new ClassA(); 
     a.doSomething(new InterfaceA() { 
      { System.out.println("Hello world"); } 
      @Override public void doSomethingElse() { } 
      }); 
    } 
} 

的關鍵是定義一個匿名類的初始化,然後使用「新」創建該類的一個新對象。創建對象執行初始化器PS已經過測試

這似乎不是一個很好的測驗問題;做這樣的事情很晦澀難懂,可能並不是普通的代碼。看起來更像是一個謎題,而不是實際的測試問題。除非有更好的答案,否則我沒有發現...

+0

哇,這個作品!謝謝你的幫助 !!!!是的,我的新任第二任Java講師有點奇怪@@。在課堂上,儘管我已經付出瞭如此多的關注,但我仍然無法在實驗室中「通過」他的測驗:((我很恐慌 – ThankYouForHelping

+0

如果這是正確的答案,那麼它是離奇和不公平的國際海事組織。這與接口無關,而是匿名內部類和靜態初始化 – Radiodef

+1

@ThankYouForHelping如果這是教授期望你知道的那種東西,那麼我不知道他認爲他在教什麼,沒有人應該這樣做。如果是我,我會親自向他詢問,以確保它是一個技巧性的問題,答案是非常隱晦的。我懷疑有人說得對。 – Radiodef

0

我不知道這是否是預期的答案測驗,但這應該工作:

class Do{ 
    void doit(){ 
     ClassA a = new ClassA(); 
     a.doSomething(null); System.out.println("Hello world!"); 
       // ^starting paren   closing paren^
    } 
} 
interface InterfaceA{ 
    void doSomethingElse(); 
} 
class ClassA{ 
    void doSomething(InterfaceA f){ 
    } 
} 

基本上由剛剛把兩根線在同一直線上,你沒有提供一個實現界面。那麼唯一添加的代碼是null); System.out.println("Hello world!"

靈感來自:http://xkcd.com/327/

這可能更多的是謎語般的回答有什麼打算成爲一個技術測驗的......除非你的老師是想有一些樂趣您。

+0

也許它是爲了演示SQL注入攻擊和類似的工作......(在我添加xkcd鏈接之前,我添加了這條評論......) – ajb

+0

也許,但是用實際的SQL可能會更好地證明這一點。我很好奇這是什麼類,@ThankYouForHelping – jefflunt

+0

嗨jefflunt,這是我正在使用的Java類(第二學期 - 計算機系統技術文憑) – ThankYouForHelping

1

OK,如果測驗問題是這樣的:

class Do{ 
    void doit(){ 
     ClassA a = new ClassA(); 
     a.doSomething(>>>CODE HERE<<<); 
    } 
} 
interface InterfaceA{ 
    void doSomethingElse(); 
} 
class ClassA{ 
    void doSomething(InterfaceA f){ 
     // NOTE THIS CHANGE! 
     f.doSomethingElse(); 
    } 
} 

然後你可以改變這一點:

a.doSomething(>>>CODE HERE<<<); 

要這樣:

a.doSomething(new InterfaceA() { 
    @Override public void doSomethingElse() { 
     System.out.println("Hello world!"); 
    } 
}); 

否則,答案是有些奇怪的東西像其他答案所說的。

+0

@jahroy我認爲他知道這一點,這就是爲什麼他說「**如果**測驗問題看起來像這樣......」並添加了一條不在那裏的線。 – ajb

+0

@ajb - 陷阱。刪除評論...(當然,當人們對重要的單詞使用粗體字的時候肯定會有幫助!) – jahroy

+0

@jahroy沒有看到您的原始評論,但是如果您認爲我應該在自己的帖子中留下底氣「if」大'ol所有上限評論在我添加的行前面。因爲它是我認爲阿杰布的答案是正確的,因爲它符合問題的規則,我只是覺得有必要提供明顯的答案,答案應該是。 – Radiodef