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()代码>,我们得到想要的输出。