'protected' 和 'protected-static' 变量有什么区别?

What is the difference with 'protected' and 'protected-static' variables?

我读了一本关于 OOP 的书并且 关于 'protected' 访问修饰符的示例对我来说很奇怪。

示例总结

  1. 这个例子是为了测试'protected'保留字对变量的影响。
  2. ClassA 有 2 个受保护的变量(静态/非静态)

    package a;
    
    public Class A {
    
        protected int a;
        protected static int b;
    }
    


  1. B 类派生自 ClassA 并位于另一个包中
  2. ClassB.test 有一种检查可访问性的方法(不能 运行)

    package b;
    
    public Class B extends ClassA {
    
        ClassA x = new ClassA();
    
        // [O] : Executable
        // [X] : Not-executable
        void test() {
    
            a = 1;   // [O] : Derived from ClassA
            b = 1;   // [O] : Derived from ClassA
    
            // [X] : a is protected, so only accessible within codes in derived class
            x.a = 1; // A) 
    
            // [O] : I don't know why it is executable
            x.b = 1; // B) 
        }
    }
    


实际上,b 是 'protected' 所以我认为它不能被像 x.a = 1; 这样的实例变量访问
但是可以使用 'static' 关键字访问它。 我该如何理解?

很快A)没问题,但为什么B)可以执行?

关键字static表示变量属于class本身,而不是class的对象。您可以将对 x.b 的调用替换为 ClassA.b。由于 ClassB 扩展了 ClassA,因此 ClassB 的所有方法都可以随时访问所有 protected static 变量。