interface I {
int element = 10;
}
class A implements I
{
int element = 2;
public static void main (String[] args) throws java.lang.Exception
{
A a = new A();
System.out.println(a.element);
I i = (I)a;
System.out.println(a.element + " " + i.element);
}
}
输出:
2
2 10
即使我将A
类型的对象转换为I
,element
中I
的值也不会改变。
如果I
是一个类A extends I
,那么我可以更改element in A
的值并将其转换为I
,以便i.element
修改后的值(在这种情况下,A
没有element
成员
在这种情况下,铸造的概念是否存在? (类对象强制转换为接口类型)
答案 0 :(得分:4)
即使我将类型A的对象转换为I,我的元素值也不会改变。
I i = (I)a;
该行显示指向类型I
的实例。这意味着,您正在访问类型I
中的变量并告诉它执行类a
中的方法。
多态性严格用于方法。变量没有多态性。
以下是示例:
public interface TestInterface {
int testvarInterface = 0;
}
public class TestParent {
int testvarFromParent = 0;
}
public class TestClass extends TestParent implements TestInterface {
public static void main(String[] args) {
TestClass s = new TestClass();
System.out.println(s.testvarInterface);
TestInterface in = (TestInterface) s;
in.testvarInterface = 15; // ERROR: The final field
// TestInterface.testvar
// cannot be
// assigned
System.out.println(s.testvarFromParent); // Points to LHS
TestParent parent = (TestParent) s;
parent.testvarFromParent = 20;
System.out.println(parent.testvarFromParent);
}
}
毕竟你必须记住变量指向LHS(天真,仍然是),在你的界面情况下,因为它是公共的,static final
你不能修改它
答案 1 :(得分:0)
在实现类时,不能覆盖I.element的值,因为接口中定义的变量是静态final。作为静态,它们不是实例变量。最后他们不能被覆盖。
因此当您使用类型A的引用时,A.element正在隐藏I.element。但是当您将A实例强制转换为其接口类型I时,它不会隐藏。