前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是静态内部(Static Inner)类,语法要注意什么?

什么是静态内部(Static Inner)类,语法要注意什么?

作者头像
马克java社区
修改2021-04-01 10:11:48
4320
修改2021-04-01 10:11:48
举报
文章被收录于专栏:java大数据

4静态内部类(Static Inner Classes)

马克-to-win:这里的内部类的static,意思是它可以不用实例化外部类,就自己单独被实例化,单独存在(有点像生活中的办公室和办公桌(独立于办公室,办公桌也可以存在)),静态方法不就不用实例化类,直接用吗?就实例化而言,静态内部类和外层类之间完全没有任何关系,相互独立。谁爱怎么样,就怎么样!谁想实例化谁就实例化, 不管对方的感受。当然要想让它们有关系,也可以,见下面例子中的tc.core=nc;

重要语法:马克-to-win:1)静态内部类里的任何方法(静态或非静态)不允许访问外层类里的实例属性或方法。(因为外层类本身可能没有被实例化),想访问通过下面例子中的tc.core=nc。2)静态属性和方法无论在外层类还是静态内部类, 都可以被任意调用(对方或自己或测试类)。

例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;//可以直接访问外层类的静态域

            cs_m=3;

            //k=9;//马克-to-win:compile error,static class can not refer to a non-static field,因为静态内部类可以脱离外层实例而单独存在,静态内部类可能已经被实例化,而外层类没有被实例化,外层的实例变量就不能被访问。像原来的静态 方法似的,不能访问实例变量

            this.ci_j = j;

        }

        public String toString()

        {

            //ShellMark_to_win.changTopValue();//可以访问外层类的静态方法

            //insMethod();//不能从静态类里访问外层类的实例方法。

            return "ci_j=" + ci_j + ";ss_i=" + ss_i+" ;cs_m="+cs_m;// 马克-to-win:这里不能写+k,因为cocs_mpile error,static class can not refer to a non-static field,像原来的静态方法似的,不能访问实例变量

        }

        static int changValue()

        {   //inscs_method();//不能从静态类里访问实例方法。

            cs_m=cs_m+2;

            ss_i=ss_i+2;

            //k=9;//马克-to-win:这里不能写+k,因为compile error,static class can not refer to a non-static field,像原来的静态方法似的,不能访问实例变量

          //  ShellMark_to_win.changTopValue();完全可以调用

            System.out.println("cs_m is "+cs_m+" ss_i is"+ss_i);

            //ci_j=ci_j+2;//错误, 静态方法无法访问非静态变量

            return cs_m;

        }

    }

    public String toString() {

        //Core.changValue();//可以访问静态内部类的静态方法     

        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.不用实例化外部类, 就可以单独存在 */

        ShellMark_to_win.Core nc = new ShellMark_to_win.Core(5);

/*加上下面两句话,可以让外层类和内部类产生联系而且相互改值*/       

   //     tc.core=nc;

   //     tc.core.ci_j=100;

        System.out.println("nc is "+nc);

        nc.changValue();

        System.out.println("tc is "+tc);

    }

}

更多请见:https://blog.csdn.net/qq_44639795/article/details/103109972

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档