Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中使用接口的方法调用冲突_Java_Interface - Fatal编程技术网

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

Java中使用接口的方法调用冲突,java,interface,Java,Interface,昨天,我接受了一次采访,得到了以下情景: 有三个类,即Main.java、MobilePhone.java、DeskPhone.java和一个接口ITelephone.javapowerOn()方法在两个类中实现MobilePhone.java和DeskPhone.java 创建MobilePhone类的实例后,如何调用DeskPhone类中的powerOn()方法?换句话说,在Mainclass的最后两次通话中,我如何打印“您在DeskPhone类”和“您在MobilePhone类”呢 在这两

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

有三个类,即
Main.java、MobilePhone.java、DeskPhone.java
和一个接口
ITelephone.java
powerOn()
方法在两个类中实现
MobilePhone.java
DeskPhone.java

创建
MobilePhone
类的实例后,如何调用
DeskPhone
类中的
powerOn()
方法?换句话说,在
Main
class的最后两次通话中,我如何打印“您在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");
    }
}
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");
        }
}
DeskPhone.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");
    }
}
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");
        }
}

MobilePhone
对象分配给不同的局部变量

在当前代码中,一旦
timsPhone
变量的值被
MobilePhone
对象替换,则无法访问
DeskPhone
对象,并且无法调用其
powerOn()
方法

建议代码:

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

您在DeskPhone课程中
你在手机班
你在上桌面电话课

您可以尝试在静态方法中隔离对接口方法的调用

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();
        }
    }

} 

要么你误解了这个问题,要么这是个骗局,要么两者兼而有之。
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++;
  }
}
同样,我们只添加了代码,它符合它们的规范,并且显示了对接口和引用的相同理解

当然,像这样的讽刺回答通常不会在面试小组中赢得分数,但在正确的情况下是有用的。记住,他们也在受审。如果我已经尝试过像第一个那样温和地引导解决方案,而他们没有退缩,那么现在我开始怀疑他们的技术知识和公司文化。如果我注意到一些其他的黄色标志,那么我会考虑这样的事情来扭转局面。我想为之工作的公司应该感谢我已经尝试过这种巧妙的方法,在不损害技术知识的情况下满足了他们的要求,并且有足够的勇气在他们身上尝试我自己的测试。如果我已经确信我不想要这份工作,但想给他们最后一次机会把我争取过来,我可能会求助于它


另外,如果他们实践测试驱动设计,他们几乎必须立即为我提供工作。

使用显式转换
((台式电话)timsPhone).powerOn()
@IvanPronin,它只会给你一个
ClassCastException
。当你将MobilePhone分配给itSo时,timsPhone失去了对DeskPhone对象的引用,哪个是可预选的:像((DeskPhone)timsPhone.powerOn()那样强制转换类;或者为每个类创建单独的变量?@JayveerParmar Casting将导致
ClassCastException:MobilePhone无法转换为DeskPhone
,因此这甚至不是一个选项。这就是面试问题的陷阱,用来剔除那些不知道这一点的潜在员工。他们告诉我,你怎么能只做一些修改就修改这个程序,并按预期打印输出?正如您在程序中提到的,它也可以工作,但我必须用优化的方式呈现代码。因此,如果我创建
timsMobilePhone.powerOn();timsDeskPhone.powerOn(),我们得到想要的输出。