在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。

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

定义内部类的时候,在其前面加上一个权限修饰符static。这个内部类就变为了静态内部类。如在进行代码程序测试的时候,如果在每一个Java源文件中

都设置一个主方法(主方法是某个应用程序的入口,必须具有),那么会出现很多额外的代码。而且最主要的时这段主程序的代码对于Java文件来说,只是一个

形式,其本身并不需要这种主方法。但是少了这个主方法又是万万不行的。在这种情况下,就可以将主方法写入到静态内部类中,从而不用为每个Java源文件都设置一个类似的主方法。这对于代码测试是非常有用的。在一些中大型的应用程序开发中,则是一个常用的技术手段。

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

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

一是静态成员(包括静态变量与静态成员)的定义。

在非静态内部类中不可以声明静态成员。如现在在一个student类中定义了一个内部类age,如果没有将这个类利用static关键字修饰,即没有定义为静态类,那么在这个内部类中如果要利用static关键字来修饰某个成员方法或者成员变量是不允许的。在编译的时候就通不过。故程序开发人员需要注意,只有静态内部类才能够定义静态的成员变量与成员方法。

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

三是在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。

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

从以上的分析中可以看出,静态内部类与非静态的内部类还是有很大的不同的。一般程序开发人员可以这么理解,非静态的内部类对象隐式地在外部类中保存了一个引用,指向创建它的外部类对象。

牢记两个差别:

一、如是否可以创建静态的成员方法与成员变量(静态内部类可以创建静态的成员,而非静态的内部类不可以)

二、对于访问外部类的成员的限制(静态内部类只可以访问外部类中的静态成员变量与成员方法,而非静态的内部类即可以访问所有的外部类成员方法与成员变量)。

这两个差异是静态内部类与非静态外部类最大的差异,也是静态内部类之所以存在的原因。了解了这个差异之后,程序开发人员还需要知道,在什么情况下该使用静态内部类。如在程序测试的时候,为了避免在各个Java源文件中书写主方法的代码,可以将主方法写入到静态内部类中,以减少代码的书写量,让代码更加的简洁。

之,静态内部类在Java语言中是一个很特殊的类,跟普通的静态类以及非静态的内部类都有很大的差异。作为程序开发人员,必须要知道他们之间的差异,并在

实际工作中在合适的地方采用合适的类。不过总的来说,静态内部类的使用频率并不是很高。但是在有一些场合,如果没有这个内部静态类的话,可能会起到事倍功

半的反面效果

静态内部类:

packageinnerClass;

publicclassOutClass1 {

publicintoid;

publicString oname;

publicstaticclassInnerStaticClass1{

publicintiid;

publicString iname;

}

}

packageinnerClass;

importinnerClass.OutClass1.InnerStaticClass1;

publicclassTest1 {

publicstaticvoidmain(String[] args) {

OutClass1 oc=newOutClass1();

InnerStaticClass1 ic=newInnerStaticClass1();//不依赖与外部类的实例

}

}

非静态内部类:

packageinnerClass;

publicclassOutClass2 {

publicintoid;

publicString oname;

publicclassInnerClass2

{

publicintiid;

publicString iname;

}

}

packageinnerClass;

publicclassTest2 {

publicstaticvoidmain(String[] args) {

OutClass2 oc=newOutClass2();

OutClass2.InnerClass2 ic=oc.newInnerClass2();//依赖与外部类的实例

}

}

java 静态类 new_Java之静态内部类(static class)相关推荐

  1. java 静态类 new_Java中为静态内部类不能被new呢?

    展开全部 静态内部类,可以被new取决于你的静态类里面的方法: 得了我给你总结下,这确实有点绕口令,也当我复习一32313133353236313431303231363533e58685e5aeb9 ...

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

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

  3. java 静态类 安全_Java静态static工具类线程安全问题研究

    针对静态方法有以下一些前提: 静态方法和实例方法的区别是静态方法只能引用静态变量,静态方法通过类名来调用,实例方法通过对象实例来调用 每个线程都有自己的线程栈,栈与线程同时创建,每一个虚拟机线程都有自 ...

  4. java静态类和非静态类的区别_Java中静态内部类和非静态内部类到底有什么区别?...

    内部类(Inner Class)和静态内部类(Static Nested Class)的区别: 定义在一个类内部的类叫内部类,包含内部类的类称为外部类.内部类可以声明public.protected. ...

  5. JAVA静态和非静态内部类

    JAVA静态和非静态内部类 一直对java的静态和非静态内部类的东东理解不清楚,今天测试了一下,下面把测试结果记录一下,加深印象.用于以后查找.  直接上代码. Java代码  package com ...

  6. Java 静态类、静态方法和静态变量

    转载自Java 静态类.静态方法和静态变量 Java 静态类.静态方法和静态变量 static 是Java中的一个关键字,我们不能声明普通外层类或者包为静态的.static用于下面四种情况. 1.静态 ...

  7. 日常小结-java静态类及其应用

    概述 静态类必定是内部类,但内部了不一定是静态类. 特性以及与非静态内部类的区别 静态类的特效主要分为三点 静态内部类只能访问静态成员和静态方法,普通的内部类可以访问任意方法. 静态内部类可以声明静态 ...

  8. java关键字static_Java中的static关键字

    java关键字static static keyword in Java is used a lot in java programming. Java static keyword is used ...

  9. java静态类_Java静态类

    java静态类 Today we will look into java static class. It's a good interview question to test your knowl ...

最新文章

  1. golang beego框架对运行异常的处理
  2. vb编程入门_【高能】用VB开发的彩票选号软件
  3. Django使用缓存笔记
  4. java web 模型,从零构建轻量级Java Web框架
  5. 高度有用的Java ChronoUnit枚举
  6. 探索SwitchYard 2.0.0.Alpha2快速入门
  7. LightOj 1027 A Dangerous Maze
  8. 2017.9.14 仪仗队 思考记录
  9. linux自动挂载ntfs分区,Ubuntu 12.04 开机自动挂载ntfs分区
  10. vue使用swiper插件
  11. 《Java程序员职场全攻略:从小工到专家》连载九:散兵游勇还是团队作战
  12. SpringAop实现原理
  13. 英语学习(九)复合句
  14. 数据整理(Data Wrangling)
  15. UE4-物体围绕中心轴旋转的节点
  16. 使用ThreeJs搭建BIM模型浏览器,超大模型的分时渲染
  17. ieg技术总监_干货!从程序员到技术总监,大牛内部分享的资料
  18. 2011年QQ个性签名、MSN个性签名:学海无涯,回头是岸
  19. 使用GAN+RL来进行关键词生成
  20. 根据IP获取城市代码

热门文章

  1. 商业逻辑认知:华为为何不倒?微软为何重生?瑞幸能干掉星巴克吗?
  2. 秀币Showcoin:区块链+直播何以抟扶摇而上
  3. 第三方软件测试有什么作用?
  4. 现代软件工程_团队项目_阿尔法阶段_阿里云服务器部署_2017.11.24
  5. Retrofit框架(二)
  6. APP网站安全漏洞检测服务的详细介绍
  7. 桌面快捷方式打开某个网站
  8. win10安装工具下载安装系统的教程,win10系统安装
  9. C# HTML网页转换为PDF
  10. 海驾科目三训练及考试: