interface I{
String s="I";
}
class A implements I{
String s="A";
}
class B extends A{
String s="B";
}
class Demo extends B{
String s="C";
void print(){
System.out.print(((A)this).s+((B)this).s+((Demo)this).s+((I)this).s);
}
public static void main(String args[]){
new Demo().print();
}
}
“这里似乎接口包含由其他具体类覆盖的属性。但是由于接口将属性隐式地视为 ginal 和 static,那么它如何获得覆盖?”
`Result - ABCI
which means interface variable overrides??`
因为这就是 Java 中变量的工作原理;如果父类的变量与子类的变量同名,则子类将忽略父类的变量,无论任何 static/final 修饰符如何(请参阅 @user85421 的注释以获取参考)。它不仅仅适用于接口;还适用于接口。考虑以下代码:
class A {
int name;
}
class B extends A {
String name;
}
没有编译错误。添加一些修饰符来好玩吗?
class A {
static final int name;
}
class B extends A {
String name;
}
仍然没有编译错误。
现在让我们尝试同样的事情,但是使用方法:
class A {
public int getName() { return 1; };
}
class B extends A {
public String getName() { return ""; }
}
编译错误。重点是,“重写”只是方法的一个概念,父变量声明将被忽略。