打破封装和信息隐藏在 Java
Breaking encapsulation and information hiding in Java
考虑以下片段。
package breakoop;
public class BreakOOP {
public static class A{
private int a;
}
public static class B extends A{
public int f(){
return super.a;
}
}
public static void main(String[] args) {
B b = new B();
System.out.println(b.f());
}
}
仅当 A
和 B
封装在 BreakOOP
class.
中时,该示例才会编译
这似乎违背了 OOP 的一些基本概念。有人可以解释为什么要编译吗?其背后的原因是什么?
检查这个:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html。它说它通过允许 static
class 访问顶级 class 的私有成员来增加封装(有时您可能需要这样做) .而a
是classA
的私有成员,在[=18的范围内=]BreakOOP
,这又使得它可以在 class B
.
内部访问
Java Language Specification 状态:
A private class member or constructor is accessible only within the body of the top level class (§7.6) that encloses the declaration of the member or constructor.
因为 类 A
和 B
是在 BreakOOP
的正文中定义的,所以该规则适用并且 B
可以看到 [=10] 的私有成员=].
至于 OOP 概念:由于 A
和 B
是静态内部 类 它们与 BreakOOP
没有特殊的生命周期关系内部 类 有(即你不需要 BreakOOP
的实例来创建 A
或 B
的新实例,但它们仍然有一些特殊的关系,因为它们可以访问私人成员。如果他们不应该有那种关系,那么他们不应该是内部 类,而是真正的顶级 类。
考虑以下片段。
package breakoop;
public class BreakOOP {
public static class A{
private int a;
}
public static class B extends A{
public int f(){
return super.a;
}
}
public static void main(String[] args) {
B b = new B();
System.out.println(b.f());
}
}
仅当 A
和 B
封装在 BreakOOP
class.
这似乎违背了 OOP 的一些基本概念。有人可以解释为什么要编译吗?其背后的原因是什么?
检查这个:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html。它说它通过允许 static
class 访问顶级 class 的私有成员来增加封装(有时您可能需要这样做) .而a
是classA
的私有成员,在[=18的范围内=]BreakOOP
,这又使得它可以在 class B
.
Java Language Specification 状态:
A private class member or constructor is accessible only within the body of the top level class (§7.6) that encloses the declaration of the member or constructor.
因为 类 A
和 B
是在 BreakOOP
的正文中定义的,所以该规则适用并且 B
可以看到 [=10] 的私有成员=].
至于 OOP 概念:由于 A
和 B
是静态内部 类 它们与 BreakOOP
没有特殊的生命周期关系内部 类 有(即你不需要 BreakOOP
的实例来创建 A
或 B
的新实例,但它们仍然有一些特殊的关系,因为它们可以访问私人成员。如果他们不应该有那种关系,那么他们不应该是内部 类,而是真正的顶级 类。