使用Java中的接口进行方法调用的冲突

时间:2017-08-08 19:18:29

标签: java interface

昨天,我接受了一次采访,我得到了以下情况:

有3个类,即Main.java, MobilePhone.java, DeskPhone.java和一个接口ITelephone.javapowerOn()方法在MobilePhone.javaDeskPhone.java类中实现。

如何在创建powerOn()类的实例后调用DeskPhone类中的MobilePhone方法?换句话说,我怎么打印"你在DeskPhone课程"和#34;你在MobilePhone课程"在Main课程中的最后两次调用?

如果没有在任何一个类中重命名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");
        }
}

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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();
        }
    }

} 

答案 2 :(得分: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++;
  }
}

同样,我们只添加了代码,它符合他们的规范,并显示了对接口和引用的相同理解。

当然,像这样的讽刺性答案通常不会在面试小组中赢得积分,但在正确的情况下使用。记住,他们也在接受审判。如果我已经试图像第一个那样轻轻地转向解决方案并且他们不退缩,那么现在我对他们的技术知识和公司文化产生了怀疑。如果我注意到其他几个黄旗,那么我会考虑这样的事情来扭转局面。我想要工作的那种公司会感激我已经尝试过这种机智的方法,在不损害技术知识的情况下满足他们的规范,并且有足够的资源来尝试我们自己的测试。如果我已经确信我不想要这份工作,我可能只会诉诸它,但是想给他们最后一次机会来赢得我。

另外,如果他们练习测试驱动设计,他们几乎必须在现场为我提供工作。