簡體   English   中英

打破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());
    }
}

該示例僅在AB封裝在BreakOOP類中時才編譯。

這似乎違背了OOP的一些基本概念。 有人可以解釋為什么這個編譯? 它背后的原因是什么?

請查看: https//docs.oracle.com/javase/tutorial/java/javaOO/nested.html 它說它通過允許static類訪問頂級類的私有成員來增加封裝(有時你可能需要這樣做)。 並且aAA私有成員,它屬於BreakOOP的范圍,后者又可以在B類中訪問它。

Java語言規范聲明:

私有類成員或構造函數只能在頂級類(第7.6節)的主體內訪問,該類包含成員或構造函數的聲明。

由於A類和B類是在BreakOOP的主體內定義的, BreakOOP規則適用, B可以看到A私有成員。

至於OOP概念:由於AB是靜態內部類,因此它們與真正的內部類具有的BreakOOP沒有特殊的生命周期關系(即,您不需要BreakOOP的實例來創建A的新實例或B ,但他們仍然有他們有權訪問私有成員有些特殊的關系。如果他們不應該有那種關系,那么他們不應該是內部類,但真正的頂級類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM