“受保护”和“受保护静态”变量有啥区别?
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
变量。
【讨论】:
以上是关于“受保护”和“受保护静态”变量有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章