Java之静态内部类(static class)
来源:互联网 发布:淘宝小号出租平台 编辑:程序博客网 时间:2024/06/01 20:02
原文地址
Java之静态内部类(static class)
在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。
一、静态内部类的使用目的。
在 定义内部类的时候,在其前面加上一个权限修饰符static。这个内部类就变为了静态内部类。如在进行代码程序测试的时候,如果在每一个Java源文件中 都设置一个主方法(主方法是某个应用程序的入口,必须具有),那么会出现很多额外的代码。而且最主要的时这段主程序的代码对于Java文件来说,只是一个 形式,其本身并不需要这种主方法。但是少了这个主方法又是万万不行的。在这种情况下,就可以将主方法写入到静态内部类中,从而不用为每个Java源文件都设置一个类似的主方法。这对于代码测试是非常有用的。在一些中大型的应用程序开发中,则是一个常用的技术手段。
二、静态内部类的使用限制。
将某个内部类定义为静态类,跟将其他类定义为静态类的方法基本相同,引用规则也基本一致。不过其细节方面仍然有很大的不同。具体来说,主要有如下几个地方要引起各位程序开发人员的注意。
一是静态成员(包括静态变量与静态成员)的定义。
在非静态内部类中不可以声明静态成员。如现在在一个student类中定义了一个内部类age,如果没有将这个类利用static关键字修饰,即没有定义为静态类,那么在这个内部类中如果要利用static关键字来修饰某个成员方法或者成员变量是不允许的。在编译的时候就通不过。故程序开发人员需要注意,只有静态内部类才能够定义静态的成员变量与成员方法。
二是在成员的引用上,有比较大的限制。一般的非静态内部类,可以随意的访问外部类中的成员变量与成员方法。即使这些成员方法被修饰为private(私有的成员变量或者方法)。因为在其他类中是无法访问被定义为私有的成员变量或方法。但是如果一个内部类被定义为静态的,那么在引用外部类的成员方法或则成员变量的时候,就会有诸多的限制。如不能够从静态内部类的对象中访问外部类的非静态成员(包括成员变量与成员方法)。这是什么意思呢?如果在外部类中定义了两个变量,一个是非静态的变量,一个是静态的变量。静态内部类只能引用外部类中的静态的成员(变量或方法),而不能够访问非静态的变量。对于那些非静态的成员变量与成员方法,在静态内部类中是无法访问的。这就是静态内部类的最大使用限制。在普通的非静态内部类中是没有这个限制的。也正是这个原因,决定了静态内部类只应用在一些特定的场合。其应用范围远远没有像非静态的内部类那样广泛。
三是在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。
通常情况下,在一个类中创建成员内部类的时候,有一个强制性的规定,即内部类的实例一定要绑定在外部类的实例中。也就是说,在创建内部类之前要先在外部类中要利用new关键字来创建这个内部类的对象。如此的话如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。也就是说,普通非静态内部类的对象是依附在外部类对象之中的。通常情况下,程序员在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的。也就是说,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。
从以上的分析中可以看出,静态内部类与非静态的内部类还是有很大的不同的。一般程序开发人员可以这么理解,非静态的内部类对象隐式地在外部类中保存了一个引用,指向创建它的外部类对象。
牢记两个差别:
一、如是否可以创建静态的成员方法与成员变量(静态内部类可以创建静态的成员,而非静态的内部类不可以)
二、对于访问外部类的成员的限制(静态内部类只可以访问外部类中的静态成员变量与成员方法,而非静态的内部类即可以访问所有的外部类成员方法与成员变量)。
这两个差异是静态内部类与非静态外部类最大的差异,也是静态内部类之所以存在的原因。了解了这个差异之后,程序开发人员还需要知道,在什么情况下该使用静态内部类。如在程序测试的时候,为了避免在各个Java源文件中书写主方法的代码,可以将主方法写入到静态内部类中,以减少代码的书写量,让代码更加的简洁。
总 之,静态内部类在Java语言中是一个很特殊的类,跟普通的静态类以及非静态的内部类都有很大的差异。作为程序开发人员,必须要知道他们之间的差异,并在 实际工作中在合适的地方采用合适的类。不过总的来说,静态内部类的使用频率并不是很高。但是在有一些场合,如果没有这个内部静态类的话,可能会起到事倍功 半的反面效果
静态内部类:
- package
innerClass; - public
class OutClass1 { -
int oid; -
String oname; -
static class InnerStaticClass1{ -
int iid; -
String iname; -
} - }
- package
innerClass; - import
innerClass.OutClass1.InnerStaticClass1; - public
class Test1 { -
static void main(String[] args) { -
OutClass1 oc= OutClass1(); -
InnerStaticClass1 ic= InnerStaticClass1(); //不依赖与外部类的实例 -
} - }
非静态内部类:
- package
innerClass; - public
class OutClass2 { -
int oid; -
String oname; -
class InnerClass2 -
{ -
int iid; -
String iname; -
} - }
- package
innerClass; - public
class Test2 { -
static void main(String[] args) { -
OutClass2 oc= OutClass2(); -
OutClass2.InnerClass2 ic=oc. InnerClass2(); //依赖与外部类的实例 -
} - }
- Java之静态内部类(static class)
- Java之静态内部类(static class)
- Java之静态内部类(static class)
- Java之静态内部类(static class)
- Java之静态内部类(static class)
- Java之静态内部类(static class)
- java中的静态内部类(static class)
- Java 静态内部类 static class
- Java中Static Class及静态内部类和非静态内部类的不同
- 静态内部类(Static Inner Class)
- 静态内部类(Static Inner Class)
- Java中Static Class及静态内部类和非静态内部类与静态导包
- Java内部类(inner Class)和嵌套类(static inner Class)也就是静态内部类的区别
- 深入浅析Java中Static Class及静态内部类和非静态内部类的不同
- 深入浅析Java中Static Class及静态内部类和非静态内部类的不同
- Java内部类之静态内部类
- static静态内部类
- java内部类之成员内部类、静态内部类
- iOS代码实践总结
- boost::filesystem指南
- VC中的stdafx.h简介(原理及作用)
- CXF WebService整合Spring
- win32 线程知识点梳理四
- Java之静态内部类(static class)
- UVa1585——Score
- 快速排序遇到的小问题
- build linux kernel的错误
- 《Linux内核设计的艺术》总结:设备环境初始化及激活进程0
- 第3周项目4(2)——顺序表应用
- 万众创业葬送了多少人的前程?
- 用序列化器生成xml文件
- Vim的分屏功能