静态变量是否继承

Are static variables inherited

我在 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"。

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

"Inherited" 不是对正在发生的事情的理想描述;更好的描述方式是说静态变量在基 class.

的子 class 中 共享

所有派生的 classes 都可以访问其基础 classes 的静态变量。这包括受保护的变量,反映了继承变量的情况。

隐藏的概念也适用:当 class 特定变量 str 出现在 Child class 中时,它会隐藏 str父变量 class.

请注意,基数 class 的变量 str 不会变得不可访问:Child 仍然可以通过完全限定名称 Parent class.

请查看oracle的文档:http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#d5e12110

只要静态变量没有被具有相同标识符的另一个静态变量隐藏,它们就会被继承。

这不完全是继承,它更像是共享访问您正在扩展的 class 的静态属性,除非您通过在子 class 中声明相同的标识符来隐藏它,请注意,在实例属性的情况下,如果您更改继承属性的值,它将在为您的对象实例化的超级实例中更改,但如果有另一个层次结构,据说对您的层次结构是盲目的,它将不会受到影响。

在静态的情况下,父属性将被更改,任何其他层次结构也会产生这种效果。

继承在parentclassobject和childclassobject之间(不是class而是objects)。 class 不是实际的东西,而是模板(仅限结构),当您创建 child class 时,teplate 只是扩大了也有旧结构(这里是静态方法)