10

我已经在 1000 个位置读到静态变量没有被继承。但是,这段代码如何正常工作?

父类.java

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

子.java

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

此代码打印“父母”。

还可以在几个位置阅读数据隐藏的概念。

父类.java

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

子.java

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

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

现在输出是“孩子”。

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

4

4 回答 4

29

“继承”并不是对正在发生的事情的理想描述;描述它的更好方法是说静态变量在基类的子类之间共享。

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

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

请注意,str基类的变量不会变得不可访问:Child仍然可以通过使用Parent类名完全限定来访问它。

于 2016-05-14T11:54:00.093 回答
9

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

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

于 2016-05-14T11:59:15.443 回答
3

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

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

于 2016-05-14T12:32:17.790 回答
0

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

于 2021-10-17T04:24:13.537 回答