【发布时间】:2018-11-12 11:45:48
【问题描述】:
假设我定义了以下接口和类:
public interface I { void a(); }
public class A implements I {
public void a() { System.out.println("A"); }
}
public class B implements I {
public void a() { System.out.println("B"); }
public void b() { System.out.println("C"); }
}
然后我运行以下代码:
public class Main {
public static void main(String[] args) {
A a = new A();
B b = new B();
I i;
i = a;
i.a(); // prints "A"
i = b;
i.a(); // prints "B"
i.b(); // 1st problem: i can't seem to find method b. Why?
b = i; // 2nd problem: b can't be assigned to i although i references an object of class B?
b = (B)i; // why does this work fine...
a = (A)i; // 3rd problem: ...but this here doesn't?
}
}
所以这是我的问题:
第一个问题
为什么不能调用i.b()?
i 指向与b 相同的对象,B 类的对象,它确实有一个方法b。
那么为什么i.a() 调用了正确的方法(打印出“B”的方法)但i.b() 根本没有解决?
i 被声明为I 类型(接口)这一事实与此有关吗?这是否意味着在 Y extends X 的赋值 X x = new Y() 中,只能调用 x 上已经在 X 中声明的方法,而不仅仅是特定于 Y?
第二个问题
虽然i 引用了B 类的对象,但为什么不能将b 分配给i? b 和 i 已经引用了同一个对象,不是吗?那么,如果我尝试将b 分配给i,为什么会导致错误 - 其最终结果应该与该分配之前的程序状态相同,除非我错过了重要的事情。
第三题
为什么我现在可以将i 转换为B,虽然我之前无法将b 分配给i,为什么不能将i 转换为A 工作?
我假设我的困惑在某种程度上源于引用变量和它们所引用的对象之间的不明确区别,以及这些变量和对象的类型之间的差异。我只是无法完全解释这些事件——尤其是第一个问题让我很困惑。
【问题讨论】:
标签: java types casting variable-assignment