`
zerxd
  • 浏览: 73255 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

解析静态内部类的使用目的与限制(网摘)

阅读更多
  在开发过程中,内部类中使用的最多的还是非静态地成员内部类。不过在特定的情况下,静态内部类也能够发挥其独特的作用。

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

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

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

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

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

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

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

      通常情况下,在一个类中创建成员内部类的时候,有一个强制性的规定,即内部类的实例一定要绑定在外部类的实例中。也就是说,在创建内部类之前要先在外部类中要利用new关键字来创建这个内部类的对象。如此的话如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。也就是说,普通非静态内部类的对象是依附在外部类对象之中的。但是,如果成员开发人员创建的时静态内部类,那么这就又另当别论了。通常情况下,程序员在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的。也就是说,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。即在创建静态类内部对象时,不需要其外部类的对象。具体为什么会这样,一般程序开发人员不需要了解这么深入,只需要记住有这个规则即可。在定义静态内部类的时候,千万不要犯画蛇添足的错误。

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

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

相关推荐

    java 静态内部类的使用规范

    Java语言中的静态内部类,也称为嵌套类,是内部类的一种特殊形式,它与非静态内部类(也称为成员内部类)相比有着独特的特点和使用场景。在深入探讨其使用规范之前,我们先理解静态内部类的基本概念。 静态内部类不...

    静态内部类

    2. **访问限制**:静态内部类只能访问外部类的静态成员(包括变量和方法),而不能访问外部类的非静态成员。这是因为静态内部类并不依赖于外部类的实例,因此不能访问非静态成员。 3. **命名空间**:静态内部类和...

    浅谈内部类与静态内部类的应用

    此外,过度使用内部类可能导致代码难以理解和维护,因此应根据实际需求和代码结构来决定是否采用内部类。 总之,内部类和静态内部类是Java中独特的类设计方式,它们提供了灵活的代码组织和访问控制手段。成员内部类...

    java静态内部类(嵌套类)

    2. **不能访问外部类的非静态成员**:由于静态内部类与外部类的静态属性和方法处于相同的静态上下文中,因此静态内部类无法访问外部类的非静态成员变量或方法。 3. **命名空间独立**:静态内部类有自己的命名空间,...

    java代码笔记2010-06-01:Java内部类 静态内部类 局部内部类 明明内部类;StringBuffer reverse的使用;

    内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态内部类与普通的成员内部类不同,它不持有对外部类的引用。因此,可以像其他静态成员一样,...

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    然而,不当使用Handler,尤其是结合匿名内部类或非静态内部类,可能导致内存泄漏和Native内存增加,这对应用性能和稳定性造成负面影响。 首先,我们要理解内存泄漏的概念。内存泄漏是指程序中已分配的内存没有被...

    内部类的相关知识-静态内部类,匿名内部类……

    静态内部类的实例创建与普通内部类不同,可以直接使用 `new 外部类.静态内部类()` 的形式创建实例,而无需先创建外部类的实例。例如: ```java public class CreateStaticInnerInstance { public static void main...

    java和kotlin的内部类静态嵌套类

    然而,无论是在Java还是Kotlin中,合理使用内部类和静态嵌套类都能有效地提高代码的可读性和可维护性。 在移动开发中,特别是Android应用开发,内部类和静态嵌套类经常用于实现回调、事件监听、以及封装与特定组件...

    java 利用反射获取内部类静态成员变量的值操作.docx

    本文将详细介绍如何使用Java反射技术来获取内部类中的静态成员变量的值。 #### 二、背景知识 在深入探讨之前,我们需要了解几个基本概念: 1. **内部类**:内部类是一种特殊的类,定义在另一个类(外部类)的内部。...

    深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    这种类的声明前面带有`static`关键字,与普通的内部类(非静态内部类)有所不同,它们在使用和行为上存在显著的差异。 首先,让我们来探讨一下静态内部类与非静态内部类的主要区别: 1. **引用关系**: - 静态...

    Java SE 静态内部类的使用(csdn)————程序.pdf

    Java SE中的静态内部类是一种特殊的内部类,它与非静态内部类(也称为成员内部类)有着显著的区别。静态内部类并不需要外部类的实例来创建它的对象,而是可以直接通过类名进行实例化,就像普通的类一样。在给定的...

    Java中的静态内部类详解及代码示例

    静态内部类与其它内部类的区别在于非静态内部类在编译完成之后会隐含地保存一个引用,该引用是指向创建它的外部类,但是静态内部类却没有。静态内部类只是嵌套在外部类中,因此也被称为嵌套内部类。 静态内部类的...

    Java的内部类讲解案例代码(成员内部类、局部内部类、匿名内部类、静态内部类、外部类访问四种内部类、其他类访问四种内部类...)

    通过该代码,我们将学习如何在Java中定义和使用内部类。这个案例展示了内部类的基本语法和用法,并提供了一个实际场景来演示内部类的灵活性和功能。 适用人群: 这个源码资源适用于Java开发者,特别是对内部类概念...

    Java内部类应用之静态内部类应用示例

    外部类依然不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类的实例成员。 四、静态内部类的应用场景 静态内部...

    深入解析Java中的内部类

    静态内部类与非静态内部类的主要区别在于,静态内部类不能直接访问外部类的非静态成员,但可以访问静态成员。创建静态内部类的实例不需要外部类的实例,可以直接使用`OuterClass.InnerClass inner = new OuterClass....

    static class 静态类详解1

    静态内部类的使用目的主要是为了在某些特殊的情况下发挥其独特的作用,例如在代码测试中,可以将主方法写入到静态内部类中,从而不用为每个 Java 源文件都设置一个类似的主方法。 静态内部类的定义可以在类中通过...

    java 内部类使用(内部匿名类)

    使用内部类的优点: - **封装**:内部类可以访问外部类的私有成员,提供了良好的封装性。 - **多态性**:每个外部类都可以有多个内部类实例,实现了类的多态性。 - **代码复用**:内部类可以作为回调函数或者事件...

    Java单例模式实现静态内部类方法示例

    静态内部类实现单例模式是指在类的内部定义一个静态内部类,该内部类中包含一个静态的实例变量,并在该类的静态块中实例化该变量。外部类通过获取内部类的实例来实现单例模式。 例如,在下面的代码中,我们定义了一...

    内部类分类及应用

    在使用匿名内部类时,要记住以下几个原则:匿名内部类不能有构造方法、匿名内部类不能是public、protected、private、static、只能创建匿名内部类的一个实例、匿名内部类不能定义任何静态成员、静态方法、一个匿名...

    java 内部类 局部内部类 匿名类 实例代码

    本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...

Global site tag (gtag.js) - Google Analytics