在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用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. zip压缩报错解决:zip warning: name not matched: xxx/xxx/xxx
  2. 感量越大抑制频率约低_东芝推出高纹波抑制比、低噪声LDO稳压器
  3. 软件工程——个人课程总结
  4. Linux逻辑卷(LVM)技术详解
  5. 在Apache中利用ServerAlias设置虚拟主机接收多个域名和设置域名泛解析
  6. 使用Nmon监控Linux的系统性能
  7. Linux基础介绍【第五篇】
  8. Gin Web框架简单介绍
  9. mysql 通达信公式_通达信的几个好用指标
  10. pp模块常用表 sap_SAP财务常用的PP模块事务代码清单
  11. IT项目开发管理与绩效考核
  12. FPGA自学:利用D触发器实现分频
  13. 启动Hadoop集群,出现Cannot set priority of nodemanager(resourcemanager) process xxx问题
  14. 安装打印机时出现无法安装,打印处理器不存在
  15. 文件(夹)批量重命名数字、字母、日期、中文数字大写小写
  16. 常用的第三方SDK介绍(搜集中)
  17. 频域分析中的三频段理论
  18. ubuntu 20.04 自动重启网络
  19. php 递归递实现无限层级
  20. 解析Kafka中的 Topic 和 Partition

热门文章

  1. 统计思维就是透过现象看本质
  2. 如何监听HH660型号扫码枪并输出中文
  3. 微信小程序中如何添加和删除class类名
  4. 安装程序的时候出现:%CommonFiles%/Microsoft Shared/DAO错误怎么办?
  5. 尝试运行shell32.dll,Control_RunDLL C:/Program Files/Common Files/Microsoft Shared/Speech/sapi.cpl,时发生意外
  6. Android--碎片
  7. iPod nano 7代转存歌曲
  8. canvas实现星空动态背景
  9. 前端获取图片压缩后上传给后台
  10. 爬虫基础(案例:爬取英雄联盟全皮肤)