[英]Can an outer class access the members of inner class?
內部類是在類中定義的類,內部類可以聲明為public,private,protected。 如果內部類定義為private和protected,外層類可以訪問內部類的成員嗎? 並且內部類可以訪問外部類的成員嗎?
通常,您可以(訪問內部類的私有字段,反之亦然)。 以下代碼在Eclipse下編譯:
public class Outer {
private int x;
public void f() {
Inner inner = new Inner();
inner.g();
inner.y = 5;
}
private class Inner {
private int y;
public void g() { x = 5; }
}
}
也就是說,您可以配置IDE /編譯器來處理對錯誤等字段的訪問(在Eclipse中,此設置稱為“訪問封閉類型的不可訪問成員”,在Preferences - > Java - > Compiler - > Error /下)警告 - >代碼風格)
如果內部類定義為private和protected,外層類可以訪問內部類的成員嗎?
是。 這些限定符只會影響從外部類派生的類中內部類的可見性。
內部類可以訪問外部類的成員嗎?
是的,包括那些聲明為private
,就像任何實例方法一樣。
是! 您可以從外部類訪問內部類成員,反之亦然(與訪問修飾符無關)。 但是,對於靜態嵌套類,您無法僅通過字段名稱訪問其字段,並且需要像訪問它一樣訪問它
InnerClass.staticInnerField
雖然您可以直接通過字段名稱從內部類訪問外部類的靜態字段。
解釋是在常規內部類的上下文中[常規內部類不能在其中聲明靜態成員]
您可以直接從內部類訪問外部類的任何字段。
class Outer {
private static int x = 0;
class Inner {
void print() {
System.out.println(x); // x can be directly accessed
}
}
public static void main(String[] args) {
new Outer().new Inner().print();
}
}
甚至Outer類也可以通過內部類的對象訪問Inner類的任何字段。
class Outer {
private class Inner {
private int x = 10;
}
void print() {
Inner inner = new Inner();
System.out.println(inner.x);
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.print();
}
}
“嵌套類是在另一個類中定義的類。嵌套類應該只存在於它的封閉類中。如果嵌套類在某些其他上下文中很有用,那么它應該是一個頂級類。有四種類嵌套類:靜態成員類,非靜態成員類,匿名類和本地類。除了第一類之外,所有類都被稱為內部類。“
(Joshua Bloch,來自Effective Java的書。)
至於你的問題:你很容易自己測試。 但答案是肯定的(即使對於private
成員),只要您不是試圖從靜態上下文訪問非靜態成員(而不是從引用),或嘗試訪問不可訪問范圍內的成員。
也就是說,非常像人們期望的那樣=)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.