一般情况下是不可以用static修饰类的。如果一定要用static修饰类的话,通常static修饰的是匿名内部类
  在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。由于静态的内部类在定义、使用的时候会有种种的限制。所以在实际工作中用到的并不多。
  在开发过程中,内部类中使用的最多的还是非静态地成员内部类。不过在特定的情况下,静态内部类也能够发挥其独特的作用。

  一、静态内部类的使用目的。

  在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。不过由于种种的原因,如使用上的限制等等因素(具体的使用限制,笔者在下面的内容中会详细阐述),在实际工作中用的并不是很多。但是并不是说其没有价值。在某些特殊的情况下,少了这个静态内部类还真是不行。如在进行代码程序测试的时候,如果在每一个Java源文件中都设置一个主方法(主方法是某个应用程序的入口,必须具有),那么会出现很多额外的代码。而且最主要的时这段主程序的代码对于Java文件来说,只是一个形式,其本身并不需要这种主方法。但是少了这个主方法又是万万不行的。在这种情况下,就可以将主方法写入到静态内部类中,从而不用为每个Java源文件都设置一个类似的主方法。这对于代码测试是非常有用的。在一些中大型的应用程序开发中,则是一个常用的技术手段。为此,这个静态内部类虽然不怎么常用,但是程序开发人员还必须要掌握它。也许在某个关键的时刻,其还可以发挥巨大的作用也说不定。

public class MainInStaticClass {static class Main{static void main() {//将主方法写到静态内部类中,从而不必为每个源文件都这种一个类似的主方法new MainInStaticClass().print();}}public static void main(String[] args){new MainInStaticClass().print();}public void print(){System.out.println("main in static inner class");}
}public class TestMain {public static void main(String[] args) {// TODO Auto-generated method stub// new MainInStaticClass().print();MainInStaticClass.Main.main();new MainInStaticClass.Main();}
}

  二、静态内部类的使用限制。

  将某个内部类定义为静态类,跟将其他类定义为静态类的方法基本相同,引用规则也基本一致。不过其细节方面仍然有很大的不同。具体来说,主要有如下几个地方要引起各位程序开发人员的注意。

  一是静态成员(包括静态变量与静态成员)的定义。一般情况下,如果一个内部类不是被定义成静态内部类,那么在定义成员变量或者成员方法的时候,是不能够被定义成静态成员变量与静态成员方法的。也就是说,在非静态内部类中不可以声明静态成员。如现在在一个student类中定义了一个内部类age,如果没有将这个类利用static关键字修饰,即没有定义为静态类,那么在这个内部类中如果要利用static关键字来修饰某个成员方法或者成员变量是不允许的。在编译的时候就通不过。故程序开发人员需要注意,只有将某个内部类修饰为静态类,然后才能够在这个类中定义静态的成员变量与成员方法。这是静态内部类都有的一个特性。也正是因为这个原因,有时候少了这个静态的内部类,很多工作就无法完成。或者说要绕一个大圈才能够实现某个用户的需求。这也是静态的内部类之所以要存在的一个重要原因。

  二是在成员的引用上,有比较大的限制。一般的非静态内部类,可以随意的访问外部类中的成员变量与成员方法。即使这些成员方法被修饰为private(私有的成员变量或者方法),其非静态内部类都可以随意的访问。则是非静态内部类的特权。因为在其他类中是无法访问被定义为私有的成员变量或者方法。但是如果一个内部类被定义为静态的,那么在银用外部类的成员方法或则成员变量的时候,就会有诸多的限制。如不能够从静态内部类的对象中访问外部类的非静态成员(包括成员变量与成员方法)。这是什么意思呢?如果在外部类中定义了两个变量,一个是非静态的变量,一个是静态的变量。那么在静态内部类中,无论在成员方法内部还是在其他地方,都只能够引用外部类中的静态的变量,而不能够访问非静态的变量。在静态内部类中,可以定义静态的方法(也只有在静态的内部类中可以定义静态的方法),在静态方法中引用外部类的成员。但是无论在内部类的什么地方引用,有一个共同点,即都只能够引用外部类中的静态成员方法或者成员变量。对于那些非静态的成员变量与成员方法,在静态内部类中是无法访问的。这就是静态内部类的最大使用限制。在普通的非静态内部类中是没有这个限制的。也正是这个原因,决定了静态内部类只应用在一些特定的场合。其应用范围远远没有像非静态的内部类那样广泛。

  三是在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上
  通常情况下,在一个类中创建成员内部类的时候,有一个强制性的规定,即内部类的实例一定要绑定在外部类的实例中。也就是说,在创建内部类之前要先在外部类中要利用new关键字来创建这个内部类的对象。如此的话如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。也就是说,普通非静态内部类的对象是依附在外部类对象之中的。但是,如果成员开发人员创建的时静态内部类,那么这就又另当别论了。通常情况下,程序员在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的。也就是说,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。即在创建静态类内部对象时,不需要其外部类的对象

new MainInStaticClass.Main();

具体为什么会这样,一般程序开发人员不需要了解这么深入,只需要记住有这个规则即可。在定义静态内部类的时候,千万不要犯画蛇添足的错误。

  从以上的分析中可以看出,静态内部类与非静态的内部类还是有很大的不同的。一般程序开发人员可以这么理解,非静态的内部类对象隐式地在外部类中保存了一个引用,指向创建它的外部类对象。不管这么理解,程序开发人员都需要牢记静态内部类与非静态内部类的差异。如是否可以创建静态的成员方法与成员变量(静态内部类可以创建静态的成员而非静态的内部类不可以)、对于访问外部类的成员的限制(静态内部类只可以访问外部类中的静态成员变量与成员方法而非静态的内部类即可以访问静态的也可以访问非静态的外部类成员方法与成员变量)。这两个差异是静态内部类与非静态外部类最大的差异,也是静态内部类之所以存在的原因。了解了这个差异之后,程序开发人员还需要知道,在什么情况下该使用静态内部类。如在程序测试的时候,为了避免在各个Java源文件中书写主方法的代码,可以将主方法写入到静态内部类中,以减少代码的书写量,让代码更加的简洁。

  总之,静态内部类在Java语言中是一个很特殊的类,跟普通的静态类以及非静态的内部类都有很大的差异。作为程序开发人员,必须要知道他们之间的差异,并在实际工作中在合适的地方采用合适的类。不过总的来说,静态内部类的使用频率并不是很高。但是在有一些场合,如果没有这个内部静态类的话,可能会起到事倍功半的反面效果。

原文转载自:https://www.cnblogs.com/KingIceMou/p/7823918.html
版权归:https://klcwt.iteye.com/blog/452834 所有。

转载于:https://www.cnblogs.com/VAllen/articles/java-static-class.html

[转载] static class 静态类(Java)相关推荐

  1. static静态属性 java 1614870751

    static静态属性 java 1614870751 实例属性 演练 学生类定义 学生类调用 结果 静态属性 什么是静态 案例 统计类被实例化了几次 定义类 测试类 结果 静态方法 静态方法的特点 静 ...

  2. Calls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-ta

    记录一个kotlin引入的问题 Calls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompi ...

  3. static class 静态类(Java)转

    一般情况下是不可以用static修饰类的.如果一定要用static修饰类的话,通常static修饰的是匿名内部类. 在一个类中创建另外一个类,叫做成员内部类.这个成员内部类可以静态的(利用static ...

  4. java static new_java静态类new的对象是否能被回收?

    问题来自一个线上GC频繁的应用,观察到老年代一直gc下不去导致应用被gc STW卡主假死,检查代码发现这样一段代码,感觉可疑 代码如下: public class WriteEsWork { publ ...

  5. static class 静态类(Java)

    https://www.cnblogs.com/KingIceMou/p/7823918.html

  6. static用法解析---java语言

    在类中定义的数据成为类的数据成员,例如字段,常量等.而函数的成员方法则提供操作类的数据的功能,函数成员方法.属性.构造函数等.对象中的数据成员和方法一般都是对象私有的,即只有对象本身才能访问,其他对象 ...

  7. 转载 cglib代理和java代理

    Java动态代理之JDK实现和CGlib实现(简单易懂) 转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html 一:代理模式(静态代理) 代理 ...

  8. [转载] 常用应届生Java开发笔试面试题(更新中)

    参考链接: Java中的循环的重要事项 Java开发面试题 Java基础篇Java8大基本数据类型Java的三大特性面向对象如果让你推销一款Java产品,你会怎么推销呢?(java的特点)JVM与字节 ...

  9. 【转载】深入理解Java内存模型——final

    与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问.对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象 ...

最新文章

  1. 任天堂遭史上最严重黑客攻击:完整源代码、设计文档及技术演示泄露
  2. RubyGems 镜像
  3. LeetCode Restore IP Addresses(回溯法)
  4. java获取文件夹下所有文件的名称
  5. [Modules]PrestaShop插件 模块 – 产品推荐模块 随机展示推荐产品
  6. 什么叫基于web的网站_什么叫响应式网站?响应式网站模板教程
  7. 三层架构实现增删的简单实例
  8. 【移动端vue ui框架学习】vue项目如何使用基于vue的UI框架mint ui
  9. 二:Go编程语言规范-类型
  10. 人工智能教程007:创建一个卷积神经网络(2)
  11. P4198-楼房重建【线段树】
  12. 使用GridFsTemplate来实现文件归类
  13. 眨眼快奔四了,大家的存款都有多少啊?
  14. linux双系统安装nvidia,ubuntu 16.04(Windows 10双系统+grub引导)无法进入tt1~tt6(NVIDIA驱动安装相关-黑屏,login loop,分辨率)...
  15. 软件公司产品营销大数据分析(下)
  16. FZU 2129 子序列个数(DP)题解
  17. 简易图解N合1集成安装光盘制作教程二
  18. 低速硬件接口之RS485接口自收发隔离多节点分享
  19. Unity5.x从入门到精通资源(电子版+书内项目)
  20. MySql查询某个时间段内的数据(前一周、前三个月、前一年等)

热门文章

  1. Java Web 中的一些问题
  2. 把mysql 中的字符gb2312 改为gbk的方法
  3. SQL2000联机丛书:使用和维护数据仓库
  4. xdoj 1144 K叉哈弗曼树
  5. java的scanner用法_Java Scanner用法详解
  6. vue右键自定义菜单_一款小巧的开源右键菜单管理软件
  7. java 根据圆心计算圆弧上点的经纬度_冲压件展开计算方法(二),转发给每一位冲压人...
  8. python的标准库turtle_Python标准库: turtle--海龟绘图。
  9. spring定时每天早上八点_Spring Boot教程(13) – 简单定时任务
  10. linux 变量替换字符串,变量替换 字符串处理