博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java:静态内部类的使用目的、使用限制、与非静态内部类的对比
阅读量:5885 次
发布时间:2019-06-19

本文共 2649 字,大约阅读时间需要 8 分钟。

Java之静态内部类(static class)

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

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

在 定义内部类的时候,在其前面加上一个权限修饰符static。这个内部类就变为了静态内部类。如在进行代码程序测试的时候,如果在每一个Java源文件中 都设置一个主方法(主方法是某个应用程序的入口,必须具有),那么会出现很多额外的代码。而且最主要的时这段主程序的代码对于Java文件来说,只是一个 形式,其本身并不需要这种主方法。但是少了这个主方法又是万万不行的。在这种情况下,就可以将主方法写入到静态内部类中,从而不用为每个Java源文件都设置一个类似的主方法。这对于代码测试是非常有用的。在一些中大型的应用程序开发中,则是一个常用的技术手段。

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

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

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

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

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

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

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

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

牢记两个差别:

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

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

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

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

静态内部类:

  1. package innerClass;   
  2. public class OutClass1 {   
  3.     public int oid;   
  4.     public String oname;   
  5.     public static class InnerStaticClass1{   
  6.         public int iid;   
  7.         public String iname;   
  8.     }   
  9. }  
  1. package innerClass;   
  2. import innerClass.OutClass1.InnerStaticClass1;   
  3. public class Test1 {   
  4.     public static void main(String[] args) {   
  5.         OutClass1 oc=new OutClass1();   
  6.         InnerStaticClass1 ic=new InnerStaticClass1();   //不依赖与外部类的实例 
  7.     }   
  8. }  

非静态内部类:

  1. package innerClass;   
  2. public class OutClass2 {   
  3.     public int oid;   
  4.     public String oname;   
  5.     public class InnerClass2   
  6.     {   
  7.         public int iid;   
  8.         public String iname;   
  9.     }   
  10. }   
  1. package innerClass;   
  2. public class Test2 {   
  3.     public static void main(String[] args) {   
  4.         OutClass2 oc=new OutClass2();   
  5.         OutClass2.InnerClass2 ic=oc.new InnerClass2(); //依赖与外部类的实例   
  6.     }   

转载于:https://www.cnblogs.com/dengyungao/p/7524977.html

你可能感兴趣的文章
MFC CEdit改变字体大小的方法
查看>>
java 中文数字排序方法
查看>>
centos 关于防火墙的命令
查看>>
openstack 源码分析
查看>>
ZOJ3861 Valid Pattern Lock(DFS||打表+枚举)
查看>>
pylint
查看>>
1025 选菜
查看>>
Debug 和 Release 编译方式的本质区别
查看>>
结构体
查看>>
Redis学习笔记~把redis放在DATA层,作为一种数据源,我认为更合理,也更符合我的面向对象原则...
查看>>
ztree使用实例
查看>>
idea 使用maven plugin tomcat 运行正常,无法进入debug模式
查看>>
jsfl 添加代码
查看>>
写在前面
查看>>
数据库设计时间字段
查看>>
PHP分页代码中的SQL语句可以换个写法
查看>>
加载样式js
查看>>
数据库之数据排序
查看>>
struts2将数据通过Json格式显示于EasyUI-datagrid数据表格
查看>>
牛客21天刷题_day#3
查看>>