什么是靜態(tài)內(nèi)部(Static Inner)類,語(yǔ)法要注意什么

靜態(tài)內(nèi)部類(Static Inner Classes)
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203。
馬克-to-win:這里的內(nèi)部類的static,意思是它可以不用實(shí)例化外部類,就自己?jiǎn)为?dú)被實(shí)例化,單獨(dú)存在(有點(diǎn)像生活中的辦公室和辦公桌(獨(dú)立于辦公室,辦公桌也可以存在)),靜態(tài)方法不就不用實(shí)例化類,直接用嗎?就實(shí)例化而言,靜態(tài)內(nèi)部類和外層類之間完全沒(méi)有任何關(guān)系,相互獨(dú)立。誰(shuí)愛怎么樣,就怎么樣!誰(shuí)想實(shí)例化誰(shuí)就實(shí)例化,不管對(duì)方的感受。當(dāng)然要想讓它們有關(guān)系,也可以,見下面例子中的tc.core=nc;
重要語(yǔ)法:馬克-to-win:1)靜態(tài)內(nèi)部類里的任何方法(靜態(tài)或非靜態(tài))不允許訪問(wèn)外層類里的實(shí)例屬性或方法。(因?yàn)橥鈱宇惐旧砜赡軟](méi)有被實(shí)例化),想訪問(wèn)通過(guò)下面例子中的tc.core=nc。2)靜態(tài)屬性和方法無(wú)論在外層類還是靜態(tài)內(nèi)部類, 都可以被任意調(diào)用(對(duì)方或自己或測(cè)試類)。



例2.4
class ShellMark_to_win {
    static  int ss_i ;
    private int si_k;
    Core core;
    static class Core {
        static  int cs_m ;
        int ci_j;
        public Core(int j) {
            ss_i = 2;//可以直接訪問(wèn)外層類的靜態(tài)域
            cs_m=3;
            //k=9;//馬克-to-win:compile error,static class can not refer to a non-static field,因?yàn)殪o態(tài)內(nèi)部類可以脫離外層實(shí)例而單獨(dú)存在,靜態(tài)內(nèi)部類可能已經(jīng)被實(shí)例化,而外層類沒(méi)有被實(shí)例化,外層的實(shí)例變量就不能被訪問(wèn)。像原來(lái)的靜態(tài)方法似的,不能訪問(wèn)實(shí)例變量
            this.ci_j = j;
        }
        public String toString()
        {
            //ShellMark_to_win.changTopValue();//可以訪問(wèn)外層類的靜態(tài)方法
            //insMethod();//不能從靜態(tài)類里訪問(wèn)外層類的實(shí)例方法。
            return "ci_j=" + ci_j + ";ss_i=" + ss_i+" ;cs_m="+cs_m;// 馬克-to-win:這里不能寫+k,因?yàn)閏ocs_mpile error,static class can not refer to a non-static field,像原來(lái)的靜態(tài)方法似的,不能訪問(wèn)實(shí)例變量
        }
        static int changValue()
        {   //inscs_method();//不能從靜態(tài)類里訪問(wèn)實(shí)例方法。
            cs_m=cs_m+2;
            ss_i=ss_i+2;
            //k=9;//馬克-to-win:這里不能寫+k,因?yàn)閏ompile error,static class can not refer to a non-static field,像原來(lái)的靜態(tài)方法似的,不能訪問(wèn)實(shí)例變量
          //  ShellMark_to_win.changTopValue();完全可以調(diào)用
            System.out.println("cs_m is "+cs_m+" ss_i is"+ss_i);
            //ci_j=ci_j+2;//錯(cuò)誤, 靜態(tài)方法無(wú)法訪問(wèn)非靜態(tài)變量
            return cs_m;
        }
    }
    public String toString() {
        //Core.changValue();//可以訪問(wèn)靜態(tài)內(nèi)部類的靜態(tài)方法   
        return "si_k=" + si_k + ";ss_i=" + ss_i+"cs_m is "+Core.cs_m;
    }
    void insMethod()
    {
   
    }
    static int changTopValue()
    {
        ShellMark_to_win.Core.cs_m=ShellMark_to_win.Core.cs_m+2;
        ss_i=ss_i+2;
        return ss_i;
    }
}
public class Test {
    public static void main(String[] args) {
        System.out.println(ShellMark_to_win.ss_i+" "+ShellMark_to_win.Core.cs_m);
        System.out.println(ShellMark_to_win.changTopValue());
        System.out.println(ShellMark_to_win.Core.changValue());
        ShellMark_to_win tc = new ShellMark_to_win();
        System.out.println("tc is "+tc);
/* 馬克-to-win:since Core is static member, we can use in this way.不用實(shí)例化外部類, 就可以單獨(dú)存在 */
        ShellMark_to_win.Core nc = new ShellMark_to_win.Core(5);
/*加上下面兩句話,可以讓外層類和內(nèi)部類產(chǎn)生聯(lián)系而且相互改值*/     
   //     tc.core=nc;
   //     tc.core.ci_j=100;
        System.out.println("nc is "+nc);
        nc.changValue();
        System.out.println("tc is "+tc);
    }
}




rsult is:
0 0
2
cs_m is 4 ss_i is4
4
tc is si_k=0;ss_i=4cs_m is 4
nc is ci_j=5;ss_i=2 ;cs_m=3
cs_m is 5 ss_i is4
tc is si_k=0;ss_i=4cs_m is 5