小编典典

为什么我们不应该在Java中使用受保护的静态

java

我正在解决这个问题,有没有一种方法可以覆盖Java中的类变量? 第36条反对意见是:

如果您看到protected static,请运行。

谁能解释为什么protected static皱眉呢?


阅读 219

收藏
2020-09-11

共1个答案

小编典典

这是一个风格上的问题,而不是直接的问题。这表明您没有正确考虑班上正在发生的事情。

考虑一下什么static意思:

此变量存在于类级别,在每个实例 中并不单独存在,并且在扩展me的类中没有独立存在

考虑一下什么protected意思:

该变量可以在此类,同一包中的 类以及扩展我的 类中看到。

这两种含义并不完全互斥,但非常接近。

我唯一可以看到的是可以将两者一起使用的情况是,如果您有一个设计成可扩展的抽象类,然后扩展类可以使用原始对象中定义的常量来修改行为。这种安排很可能最终会变得非常混乱,并且表明类的设计存在缺陷。

在大多数情况下,最好将常量设为public,因为这样会使所有内容更清洁,并使子类的子类具有更大的灵活性。在很多情况下,组合比继承要好得多,而抽象类则强制继承。

要查看一个示例,说明如何破坏事物,并说明变量没有独立存在的含义,请尝试以下示例代码:

public class Program {
    public static void main (String[] args) throws java.lang.Exception {
        System.out.println(new Test2().getTest());
        Test.test = "changed";
        System.out.println(new Test2().getTest());
    }
}

abstract class Test {
    protected static String test = "test";
}

class Test2 extends Test {
    public String getTest() {
        return test;
    }
}

您将看到结果:

test
changed

自己尝试一下:https//ideone.com/KM8u8O

Test2是能够访问静态成员testTest无需限定名称-但它没有继承或让自己的副本。它正在查看内存中完全相同的对象。

2020-09-11