昨天,我接受了一次采访,我得到了以下情况:
有3个类,即Main.java, MobilePhone.java, DeskPhone.java
和一个接口ITelephone.java
。 powerOn()
方法在MobilePhone.java
和DeskPhone.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");
}
}
答案 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++;
}
}
同样,我们只添加了代码,它符合他们的规范,并显示了对接口和引用的相同理解。
当然,像这样的讽刺性答案通常不会在面试小组中赢得积分,但在正确的情况下使用。记住,他们也在接受审判。如果我已经试图像第一个那样轻轻地转向解决方案并且他们不退缩,那么现在我对他们的技术知识和公司文化产生了怀疑。如果我注意到其他几个黄旗,那么我会考虑这样的事情来扭转局面。我想要工作的那种公司会感激我已经尝试过这种机智的方法,在不损害技术知识的情况下满足他们的规范,并且有足够的资源来尝试我们自己的测试。如果我已经确信我不想要这份工作,我可能只会诉诸它,但是想给他们最后一次机会来赢得我。
另外,如果他们练习测试驱动设计,他们几乎必须在现场为我提供工作。