top
Loading...
從Java嵌套類中訪問外部類成員
在下面,我們看到對于B類來說他的嵌套層次是:AcessMethod-〉A-〉B,那么訪問方法如下:

class B {
void h() {
System.out.println("h()");
g();
f();
}

AcessMethod和A來說對B,都是透明的,直接調用。嵌套類實例化的順序:有外到里!AcessMethod-〉A-〉B

調用代碼如下:

AcessMethod am = new AcessMethod();
AcessMethod.A a = am.new A();
AcessMethod.A.B b = a.new B();
b.h();

這里很有意思的一點,’.new’語法產生了正確的作用域。

疑問:下面我們來看一下在B.h()中怎樣調用A1.g()方法?

我們是否可以在B中調用A1.g()方法,在B.h()方法中原則上可以這樣調用A1.g()但是A1沒有實例化,所以這樣是錯誤的,也就是在B中無法調用A1中的非靜態方法了。

假設:如果A1.g()為static類型,那么在B中可以這樣調用A1種的方法:A1.this.g();

但是這是不可能的,因為在A1.g()不可能定義為static類型,詳細看下面的問題1(問題1:在什么情況下可以定義static 方法),這是一個缺點吧,但是可以使用嵌套類來解決了。

/**
* 從多層嵌套類中訪問外部類的成員. “.new“語法產生了正確的作用域
*/
public class AcessMethod {

private void f() {
System.out.println("f()");
}


class A1 {
private void g() {
System.out.println("A1 - g()");
}
}

class A {
private void g() {
System.out.println("g()");
}

class B {
void h() {
System.out.println("h()");
g();
f();
}
}
}

public static void main(String[] args) {
AcessMethod am = new AcessMethod();
AcessMethod.A a = am.new A();
AcessMethod.A.B b = a.new B();
b.h();
}
}

運行結果:h()

g()

f()

問題1:在什么情況下可以定義static 方法?

只有在頂層類中定義,或者在靜態內部類中定義,看下面的例子

public class Test {
static void t(){}
class T2{
//!錯誤,The method a cannot be declared static;
//static methods can only be declared in a static or top level type
//static void a(){}
}

static class T3{
static void a(){}
}
}
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗