0

研究 2 代码片段

片段1:

interface Int1{
    String str = "123";
}
class Pparent{
    String str = "123";  
}
class F extends Pparent implements Int1{       
}

此代码编译正常。

片段2

class Pparent{
    String str = "123";
    public static String str = "123"; 

}

结果:带有消息的编译错误

variable str is already defined in class

解析度

对我来说,两个片段看起来都一样。

为什么我看到不同的结果

Abimaran Kugathasan 更新

你说:

接口中的字段是隐式公共静态的,并且没有继承到子类

反例:

interface Int1{
    String str = "123";
}
class F implements Int1{
    public static void main(String[] args) {
        System.out.println(F.str);
    }
}

我不能这样写

class F extends Pparent implements Int1{
      public static void main(String[] args) {
        System.out.println(str);
    } 
}

为什么?我只处理静态内容。

4

2 回答 2

3

对我来说,两个片段看起来都一样。

他们显然一样。在您的第二个片段中,您在同一个类中有两个同名的变量声明。这违反了 JLS 第 8.3 节的这一部分:

类声明的主体声明两个具有相同名称的字段是编译时错误。

在第一个片段中,您声明了一个(接口中的隐式静态字段和类中的一个字段。这不违反任何规则。相反,它只是遵循此规则,也在第 8.3 节中:

如果该类声明了一个具有特定名称的字段,则该字段的声明被称为隐藏了超类和该类的超接口中具有相同名称的任何和所有可访问的字段声明。

于 2014-05-22T11:48:46.943 回答
2

接口中的字段是隐式public static的,不会继承给子类。所以没有冲突。

第二种情况,两个字段属于同一个类,所以会有冲突。编译器抱怨。正如JLS所说,

类声明的主体声明两个具有相同名称的字段是编译时错误。

根据更新的问题更新答案

interface Int1{
    String str = "123";
}
class F implements Int1{
    public static void main(String[] args) {
        System.out.println(F.str);
    }
}

在这里,您没有继承该字段,您只是访问它,因为它是公共和静态的,编译器会自动更改 F.strInt1.str.

在 Java 中,静态和继承不能一起工作。

于 2014-05-22T11:48:14.643 回答