“受保护”和“受保护静态”变量有啥区别?

Posted

技术标签:

【中文标题】“受保护”和“受保护静态”变量有啥区别?【英文标题】:What is the difference with 'protected' and 'protected-static' variables?“受保护”和“受保护静态”变量有什么区别? 【发布时间】:2016-03-08 23:31:35 【问题描述】:

我读了一本面向 OOP 的书,并且 关于“受保护”访问修饰符的示例对我来说很奇怪。

示例摘要

    此示例用于测试“受保护”保留字对变量的影响。

    ClassA 有 2 个受保护的变量(静态/非静态)

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

    ClassB 派生自 ClassA 并位于另一个包中

    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 是“受保护的”,所以我认为它不能被 x.a = 1; 之类的实例变量访问 但它可以通过 'static' 关键字访问。 我怎么理解这个?

总之 A) 很好,但为什么 B) 可执行?

【问题讨论】:

我没看懂你的帖子,请更清楚一点 参考这个link 您能否更新您的示例代码以准确地向我们展示编译器错误的位置? @TimBiegeleisen 为方便起见抱歉。我将编译器错误标记为 [X] - Not-executable. 【参考方案1】:

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

【讨论】:

以上是关于“受保护”和“受保护静态”变量有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

PHPUnit测试使用pdo的受保护静态方法

python中受保护变量和公共变量有啥区别

“受保护的朋友”和“私人保护”有啥区别?

受保护和私有有啥区别? [复制]

c#中受保护和私有保护有啥区别? [复制]

“私有”和“受保护的内部”有啥区别?