2017-08-08 43 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