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

什么是静态内部(Static Inner)类,语法要注意什么?的更多相关文章

  1. C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。

    除法运算中注意: 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2:而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000. 取余运算中注意: 该运算只适 ...

  2. java--抽象类实例(包含静态内部抽象类)

    静态内部抽象类可以被继承. public class testfather { public static void main(String[] args) { person.talk2 a = ne ...

  3. 静态关键字static(2)

    static关键字主要有两种作用: 第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 第二,实现某个方法或属性与类而不是对象关联在一起 具体而言,在Java语言中,static ...

  4. 静态导入Static import

    静态导入Static import 要使用静态成员(方法和变量)我们必须给出提供这个静态成员的类. 使用静态导入可以使被导入类的静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名 ...

  5. 基础学习day06---面向对象二---static,类的初始化和调用顺序、单例模式

    一.static关键字 1.1.static关键字 静态:static用法:是一个修饰符,用于修饰成员(成员变量,成员函数)static 修饰的内容,所有对象共享当成员被静态修饰后,就多了一个调用方式 ...

  6. 【UML 建模】UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战

    发现个好东西思维导图, 最近开始用MindManager整理博客 . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/deta ...

  7. 深入解析ES6 更易于继承的类语法的使用

    和其它面向对象编程语言一样,ES6 正式定义了 class 类以及 extend 继承语法糖,并且支持静态.派生.抽象.迭代.单例等,而且根据 ES6 的新特性衍生出很多有趣的用法. 一.类的基本定义 ...

  8. UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战

    发现个好东西思维导图, 最近开始用MindManager整理博客 . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/deta ...

  9. 【ES6】更易于继承的类语法

    和其它面向对象编程语言一样,ES6 正式定义了 class 类以及 extend 继承语法糖,并且支持静态.派生.抽象.迭代.单例等,而且根据 ES6 的新特性衍生出很多有趣的用法. 一.类的基本定义 ...

  10. java中的静态变量---static

    用static修饰符修饰的数据成员,并不是属于那个对象的,而是属于类.静态数据成员在定义的时候已经分配了内存,而此时对象还没有建立好. 当然它也是被保存到类的方法中的,而不是对象内存中,大家都是可以访 ...

随机推荐

  1. (3)RabbitMQ交换器(Exchange)

    1.前言 上个章节也有简单介绍过RabbitMQ交换器,这里主要了解下它的类型和如何使用.交换器有四种类型,分别是direct.fanout.topic.headers. 2.Virtual host ...

  2. 有关base64的作业

    1.有关Base64的介绍:Base64这个术语最初是在"MIME内容传输编码规范"中提出的.Base64不是一种加密算法,虽然编码后的字符串看起来有点加密的赶脚.它实际上是一种& ...

  3. laravel7 实现阿里云大文件上传

    1:新创一个桶名 2:下载SDK 3: 4: php编辑器 终端运行 5:阿里云复制代码 6:获取秘钥和毽 7: 控制器书写代码:切记引入oss namespac App\Http\Controlle ...

  4. 防止SQL 注入;如何进行防SQL 注入。

    防止SQL 注入:1.开启配置文件中的magic_quotes_gpc 和magic_quotes_runtime 设置2.执行sql 语句时使用addslashes 进行sql 语句转换3.Sql ...

  5. DOS命令基础

    DOS命令 打开CMD win+R,输入cmd. 桌面任何地方按住shift+鼠标右键 ,点击powershell. 我的电脑文件路径前cmd+空格. 开始+系统. 关闭CMD alt+空格+C. 常 ...

  6. Windows下搭建REDIS集群

    Redis集群: 如果部署到多台电脑,就跟普通的集群一样:因为Redis是单线程处理的,多核CPU也只能使用一个核, 所以部署在同一台电脑上,通过运行多个Redis实例组成集群,然后能提高CPU的利用 ...

  7. Redis 使用规范

    Redis 使用规范围绕如下几个纬度展开: 键值对使用规范: 命令使用规范: 数据保存规范: 运维规范. 键值对使用规范 有两点需要注意: 好的 key 命名,才能提供可读性强.可维护性高的 key, ...

  8. Linux内核驱动模块编写尝试

    课堂笔记 源代码 /*file: hello.c*/ #ifndef _KERNEL_ #define _KERNEL_ #endif #ifndef MODULE #define MODULE #e ...

  9. 一个故事看懂CPU的SIMD技术

    好久不见,我叫阿Q,是CPU一号车间的员工.我所在的CPU有8个车间,也就是8个核心,咱们每个核心都可以同时执行两个线程,就是8核16线程,那速度杠杠滴. 我所在的一号车间,除了负责执行指令的我,还有 ...

  10. 搭建域环境,安装Exchange Server 2013,复现CVE-2019-1040

    搭建域环境 操作系统: 域控:Windows server 2008 R2    域成员: Windows Server 2012 . Windows 7 对于将要安装成为DC的服务器来讲,其系统配置 ...