静态变量是否会被继承?

13

我已经在1000多个地方读到静态变量不会被继承。但是这段代码为什么能正常工作呢?

Parent.java

public class Parent {
        static String str = "Parent";
    }

Child.java

public class Child extends Parent {
        public static void main(String [] args)
        {
            System.out.println(Child.str);
        }
    }

这段代码会打印出"Parent"。

还可以在一些地方了解数据隐藏的概念。

Parent.java

public class Parent {
    static String str = "Parent";
}

Child.java

public class Child extends Parent {
    static String str = "Child";

    public static void main(String [] args)
    {
        System.out.println(Child.str);
    }
}

现在输出的是"Child"。

那么这是否意味着静态变量会被继承但会遵循数据隐藏的概念


你能提供其中的“数千个位置”之一吗? - dryairship
4个回答

38
"Inherited"不是一个理想的描述方式;更好的描述方式是静态变量在基类的所有子类之间是共享的
所有派生类都可以访问其基类的静态变量。这包括受保护的变量,与继承变量的情况相似。
隐藏的概念也适用:当Child类中出现类特定变量str时,它会隐藏父类的str变量。
请注意,基类的变量str并不会变得无法访问:Child可以通过完全限定Parent类的名称来访问它。

在给定的示例中,我们如何使用完全限定的父名称访问它? - Paolo Tormon

11

感谢您的回答。一行代码编译所有内容:“静态变量会被继承,只要它们没有被另一个具有相同标识符的静态变量隐藏。” - Aman

3
这不完全是继承,更像是共享,因为你可以访问扩展的类的静态属性,除非在子类中声明相同的标识符来隐藏它。请注意,在实例属性的情况下,如果更改继承的属性的值,它将会更改为您对象实例化的超级实例中的值,但如果有另一个层次结构,它将不受影响。
对于静态的情况,父属性将被更改,任何其他层次结构也将受到影响。

0

继承发生在父类对象和子类对象之间(不是类,而是对象)。类并不是一个实际的东西,而是一个模板(仅结构),当您创建一个子类时,模板只是被扩大了,并且具有旧的结构(这里是静态方法)


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接