[英]Practical example Encapsulation vs Information Hiding vs Abstraction vs Data Hiding in 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
類中時才編譯。
這似乎違背了OOP的一些基本概念。 有人可以解釋為什么這個編譯? 它背后的原因是什么?
請查看: https : //docs.oracle.com/javase/tutorial/java/javaOO/nested.html 。 它說它通過允許static
類訪問頂級類的私有成員來增加封裝(有時你可能需要這樣做)。 並且a
是A
類A
私有成員,它屬於BreakOOP
的范圍,后者又可以在B
類中訪問它。
Java語言規范聲明:
私有類成員或構造函數只能在頂級類(第7.6節)的主體內訪問,該類包含成員或構造函數的聲明。
由於A
類和B
類是在BreakOOP
的主體內定義的, BreakOOP
規則適用, B
可以看到A
私有成員。
至於OOP概念:由於A
和B
是靜態內部類,因此它們與真正的內部類具有的BreakOOP
沒有特殊的生命周期關系(即,您不需要BreakOOP
的實例來創建A
的新實例或B
,但他們仍然有他們有權訪問私有成員有些特殊的關系。如果他們不應該有那種關系,那么他們不應該是內部類,但真正的頂級類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.