有一个名为Bank
的界面,它有两个实施类:ABC
和XYZ
。
public class Tester2 {
public static void main(String[] args) {
// i/f ref can directly refer to ANY concrete imple cls instance Bank
ref = new ABC();// up casting
ref.withdraw(123, 345);// DMD
// ref.payBills();
((ABC) ref).payBills();
ref = new XYZ();
if (ref instanceof ABC)
((ABC) ref).payBills();
else
System.out.println("Wrong Bank!!!!");
}
}
现在ref
的类型为ABC,而ref
的值被XYZ覆盖。那么ref的实例怎么可以ABC, considering
payBills is a method in both the class
ABC and
XYZ`?
答案 0 :(得分:-1)
首先,ref
是Bank
。
Bank ref = new ABC();
鉴于Bank
是一个接口,ABC
实现了这个接口,这很好;这种方法被称为"编程到接口"。只要您通过接口引用类,就可以互换使用任何实现的子类。
接下来,您对ABC
进行了多余转换:
((ABC) ref).payBills();
由于ref
由ABC
的实例支持,因此根本无法执行此投射。
然后重新分配 ref
到XYZ
的实例。同样,这是合法的,就像分配给ABC
是合法的一样:
ref = new XYZ();
现在,您执行了一项奇怪的instanceof
检查,我们知道 ref
不是由ABC
的实例支持,但我们会检查无论如何。请注意:您已重新分配 ref
,因此现在由XYZ
支持。
if (ref instanceof ABC)
该语句中ref
的支持实例将 从不 作为ABC
的实例后,您已将其重新分配给{ {1}}。
答案 1 :(得分:-1)
现在
var sum = +''; str = 'one two three four five'; int = 5; words = str.split(/ /); for (var i = 0; i < int; i++) { l = words[i].length; sum += l; } console.log(sum);
的类型为ref
,ref的值被ABC
覆盖。
没有。这很困惑。 XYZ
仍为ref
类型,其引用的对象已变为Bank
类型。
那么
XYZ
的实例怎么可能是ref
在分配到ABC
之后,它不能。
考虑
new XYZ()
是课程payBills()
和ABC
中的一种方法吗?
不相关。
答案 2 :(得分:-2)
如果我正确理解了这个问题,那么声明变量:
interface Bank {}
class ABC implements Bank {}
class XYZ implements Bank {}
Bank ref;
如果ABC
和XYZ
之间没有继承关系,那么你就不能从一个转换为另一个。这意味着if问题将评估为false,否则您将在运行时获得ClassCastException
。
编辑: 根据评论,这是我尝试的代码。 If语句被省略了。 这是一个完整的工作方式,您可以复制粘贴到您的IDE:
public class Test {
public static void main(String[] args) {
Bank ref;
// i/f ref can directly refer to ANY concrete imple cls instance Bank
ref = new ABC();// up casting
ref.withdraw(123, 345);// DMD
// ref.payBills();
((ABC) ref).payBills();
ref = new XYZ();
((ABC) ref).payBills();
}
public static interface Bank {
void withdraw(int i, int j);
void payBills();
}
public static class ABC implements Bank {
@Override
public void withdraw(int i, int j) {
System.out.println("ABC");
}
@Override
public void payBills() {
System.out.println("ABC payBills");
}
}
public static class XYZ implements Bank {
@Override
public void withdraw(int i, int j) {
System.out.println("XYZ");
}
@Override
public void payBills() {
System.out.println("XYZ payBills");
}
}
}
输出:
ABC
ABC payBills
Exception in thread "main" java.lang.ClassCastException: test.Test$XYZ cannot be cast to test.Test$ABC
at test.Test.main(Test.java:15)