在java中的接口中添加属性时,覆盖是如何发生的?

问题描述 投票:0回答:1
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 interface overriding
1个回答
0
投票

因为这就是 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 ""; }
}

编译错误。重点是,“重写”只是方法的一个概念,父变量声明将被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.