'protected' 和 'protected-static' 变量有什么区别?
What is the difference with 'protected' and 'protected-static' variables?
我读了一本关于 OOP 的书并且
关于 'protected' 访问修饰符的示例对我来说很奇怪。
示例总结
- 这个例子是为了测试'protected'保留字对变量的影响。
ClassA 有 2 个受保护的变量(静态/非静态)
package a;
public Class A {
protected int a;
protected static int b;
}
- B 类派生自 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 是 'protected' 所以我认为它不能被像 x.a = 1; 这样的实例变量访问
但是可以使用 'static' 关键字访问它。
我该如何理解?
很快A)没问题,但为什么B)可以执行?
关键字static
表示变量属于class本身,而不是class的对象。您可以将对 x.b
的调用替换为 ClassA.b
。由于 ClassB
扩展了 ClassA
,因此 ClassB
的所有方法都可以随时访问所有 protected static
变量。
我读了一本关于 OOP 的书并且 关于 'protected' 访问修饰符的示例对我来说很奇怪。
示例总结
- 这个例子是为了测试'protected'保留字对变量的影响。
ClassA 有 2 个受保护的变量(静态/非静态)
package a; public Class A { protected int a; protected static int b; }
- B 类派生自 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 是 'protected' 所以我认为它不能被像 x.a = 1; 这样的实例变量访问
但是可以使用 'static' 关键字访问它。
我该如何理解?
很快A)没问题,但为什么B)可以执行?
关键字static
表示变量属于class本身,而不是class的对象。您可以将对 x.b
的调用替换为 ClassA.b
。由于 ClassB
扩展了 ClassA
,因此 ClassB
的所有方法都可以随时访问所有 protected static
变量。