2017-08-08 44 views
3

昨天方法調用的,我有一個面試,我得到了以下方案:衝突使用接口在Java中

有3類,即Main.java, MobilePhone.java, DeskPhone.java和一個接口ITelephone.javapowerOn()方法在類別MobilePhone.javaDeskPhone.java中實施。

創建MobilePhone類的實例後,如何在DeskPhone類中調用powerOn()方法?換句話說,如何在Main類的最近兩次調用中打印「您處於DeskPhone類」和「您處於MobilePhone類」?

有沒有其他方法可以解決這個問題,而無需在任何一個類中重命名powerOn()方法?

Main.java

public class Main { 

public static void main(String[] args) { 
    ITelephone timsPhone; 
    timsPhone = new DeskPhone(123456); 
    timsPhone.powerOn(); 
    timsPhone = new MobilePhone(45678); 
    //Question begins here 
    timsPhone.powerOn(); 
    timsPhone.powerOn(); 

    } 
} 

ITelephone.java

public interface ITelephone { 
    void powerOn(); 
} 

MobilePhone.java

public class MobilePhone implements ITelephone{ 

    private int myNumber; 

    public MobilePhone(int myNumber) { 
     this.myNumber = myNumber; 
    } 
    @Override 
    public void powerOn() { 
     System.out.println("You are in MobilePhone class"); 
    } 
} 

DeskPhone.java

public class DeskPhone implements ITelephone { 

     private int myNumber; 

     public DeskPhone(int myNumber) { 
      this.myNumber = myNumber; 
     } 

     @Override 
     public void powerOn() { 
      System.out.println("You are in DeskPhone class"); 
     } 
} 
+0

使用顯式轉換'((DeskPhone)timsPhone).powerOn();' –

+2

@IvanPronin這只是給你一個'ClassCastException'。 – Kayaman

+1

當你將MobilePhone分配給DeskPhone對象時,timsPhone會丟失對它的引用 – Sarkhan

回答

4

MobilePhone對象分配給不同的局部變量。

在當前的代碼,一旦timsPhone變量的值由MobilePhone對象更換,DeskPhone對象不可達,則不能調用其powerOn()方法。

建議代碼:

ITelephone timsDeskPhone = new DeskPhone(123456); 
timsDeskPhone.powerOn(); 
ITelephone timsMobilePhone = new MobilePhone(45678); 
timsMobilePhone.powerOn(); 
timsDeskPhone.powerOn(); 

輸出

You are in DeskPhone class 
You are in MobilePhone class 
You are in DeskPhone class 
+0

因此,哪一個是可以優先考慮的:類似((DeskPhone)timsPhone).powerOn();或者爲每個類創建獨立的變量? – jParmar

+1

@JayveerParmar投射會導致'ClassCastException:MobilePhone無法投射到DeskPhone',所以這甚至不是一個選項。這是面試問題**的**陷阱,以排除不知道這一點的潛在員工。 – Andreas

0

您可以嘗試在一個靜態方法調用,以隔離您的接口方法..

public class Main { 

    public static void main(String[] args) { 

      phonePowerOn(new DeskPhone(123456)); 

      phonePowerOn(new MobilePhone(45678)); 

    } 


    static void phonePowerOn(ITelephone timsPhone){ 

     if (timsPhone != null){  
      timsPhone.powerOn(); 
     } 
    } 

} 
0

要麼你誤解了這個問題,這是一個騙局,或者可能是一點點兩者都有。 main的前四行是這樣給你的嗎?他們有沒有告訴你,你不能改變它們?然後委婉的迴應可能會策略性地增加了幾行是這樣的:

static void main(String[] args){ 
    ITelephone timsPhone; 
    timsPhone = new DeskPhone(123456); 
    timsPhone.powerOn(); 
    ITelephone timsDeskPhone = timsPhone; 
    timsPhone = new MobilePhone(45678); 
    ITelephone timsMobilePhone = timsPhone; 
    timsPhone = timsDeskPhone; 
    timsPhone.powerOn(); 
    timsPhone = timsMobilePhone; 
    timsPhone.powerOn(); 
} 

這符合他們的規格和顯示接口和引用的理解。有了這樣的問題,代碼只是次要的。我認爲他們真的想要評估溝通,對壓力的反應,甚至是創造力。所以只是立即說,「你做不到」實際上並沒有比拋出ClassCastException更好。

的有趣的方式就是以火攻火:

public class MobilePhone implements ITelephone{ 

    private int myNumber; 

    public MobilePhone(int myNumber) { 
     this.myNumber = myNumber; 
    } 

    private int powerOnCallCount = 0; 

    @Override 
    public void powerOn() { 
    if (powerOnCallCount == 0){ 
     System.out.println("You are in DeskPhone class") 
    } else { 
     System.out.println("You are in MobilePhone class"); 
    } 
    powerOnCallCount++; 
    } 
} 

同樣,我們只添加的代碼,它符合其規格,並顯示接口和引用相同的理解。

或者當然,這樣的諷刺回答通常不會在面試小組中贏得積分,但是在正確的情況下使用。請記住,他們也正在試用。如果我已經試着輕緩地走向像第一個那樣的解決方案,並且他們不退縮,現在我開始懷疑他們的技術知識和公司文化。如果我注意到其他一些黃旗,那麼我會考慮類似這樣的表格。我希望工作的那種公司會明白,我已經嘗試了這種巧妙的方法,在不犧牲技術知識的情況下滿足了他們的規範,並且有足夠的脊柱來嘗試我自己的測試。如果我已經確信我不想要這份工作,但是想給他們最後一次機會來贏得我,我可能只會訴諸於此。

另外,如果他們練習測試驅動設計,他們幾乎不得不在現場爲我提供工作。

+0

他們告訴我,如何修改這個程序只需要進行一些更改並按預期打印輸出?正如你在程序中提到的那樣,它也可以工作,但我必須提供優化代碼。所以,如果我創建'timsMobilePhone.powerOn(); timsDeskPhone.powerOn();',我們得到我們想要的輸出。 – jParmar