`
飞翔的猪
  • 浏览: 14335 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

关于静态嵌套类的理解

阅读更多
在学习张孝祥老师的《Java就业培训教程》的时候,当看到面向对象那一章中的内部类部分时,感觉不是很理解,为什么Java会允许内部类被static修饰呢?
今天在Google上搜索出了一些答案在这里加以总结。

因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。
  一、静态内部类的使用目的。
  在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。不过由于种种的原因,如使用上的限制等等因素(具体的使用限制,笔者在下面的内容中会详细阐述),在实际工作中用的并不是很多。但是并不是说其没有价值。在某些特殊的情况下,少了这个静态内部类还真是不行。如在进行代码程序测试的时候,如果在每一个Java源文件中都设置一个主方法(主方法是某个应用程序的入口,必须具有),那么会出现很多额外的代码。而且最主要的时这段主程序的代码对于Java文件来说,只是一个形式,其本身并不需要这种主方法。但是少了这个主方法又是万万不行的。在这种情况下,就可以将主方法写入到静态内部类中,从而不用为每个Java源文件都设置一个类似的主方法。这对于代码测试是非常有用的。在一些中大型的应用程序开发中,则是一个常用的技术手段。为此,这个静态内部类虽然不怎么常用,但是程序开发人员还必须要掌握它。也许在某个关键的时刻,其还可以发挥巨大的作用也说不定。
  二、静态内部类的使用限制。
  将某个内部类定义为静态类,跟将其他类定义为静态类的方法基本相同,引用规则也基本一致。不过其细节方面仍然有很大的不同。具体来说,主要有如下几个地方要引起各位程序开发人员的注意。
  一是静态成员(包括静态变量与静态成员)的定义。一般情况下,如果一个内部类不是被定义成静态内部类,那么在定义成员变量或者成员方法的时候,是不能够被定义成静态成员变量与静态成员方法的。也就是说,在非静态内部类中不可以声明静态成员。如现在在一个student类中定义了一个内部类age,如果没有将这个类利用static关键字修饰,即没有定义为静态类,那么在这个内部类中如果要利用static关键字来修饰某个成员方法或者成员变量是不允许的。在编译的时候就通不过。故程序开发人员需要注意,只有将某个内部类修饰为静态类,然后才能够在这个类中定义静态的成员变量与成员方法。这是静态内部类都有的一个特性。也正是因为这个原因,有时候少了这个静态的内部类,很多工作就无法完成。或者说要绕一个大圈才能够实现某个用户的需求。这也是静态的内部类之所以要存在的一个重要原因。
  二是在成员的引用上,有比较大的限制。一般的非静态内部类,可以随意的访问外部类中的成员变量与成员方法。即使这些成员方法被修饰为private(私有的成员变量或者方法),其非静态内部类都可以随意的访问。则是非静态内部类的特权。因为在其他类中是无法访问被定义为私有的成员变量或则方法。但是如果一个内部类被定义为静态的,那么在银用外部类的成员方法或则成员变量的时候,就会有诸多的限制。如不能够从静态内部类的对象中访问外部类的非静态成员(包括成员变量与成员方法)。这是什么意思呢?如果在外部类中定义了两个变量,一个是非静态的变量,一个是静态的变量。那么在静态内部类中,无论在成员方法内部还是在其他地方,都只能够引用外部类中的静态的变量,而不能够访问非静态的变量。在静态内部类中,可以定义静态的方法(也只有在静态的内部类中可以定义静态的方法),在静态方法中引用外部类的成员。但是无论在内部类的什么地方引用,有一个共同点,即都只能够引用外部类中的静态成员方法或者成员变量。对于那些非静态的成员变量与成员方法,在静态内部类中是无法访问的。这就是静态内部类的最大使用限制。在普通的非静态内部类中是没有这个限制的。也正是这个原因,决定了静态内部类只应用在一些特定的场合。其应用范围远远没有像非静态的内部类那样广泛。

总结

在静态嵌套类内部, 不能访问外部类的非静态成员, 这是由Java语法中”静态方法不能直接访问非静态成员”所限定.注意, 外部类访问内部类的的成员有些特别, 不能直接访问, 但可以通过内部类实例来访问, 这是因为静态嵌套内的所有成员和方法默认为静态的了.同时注意, 内部静态类只在类外部类的范围内可见, 若在其它类中引用或初始化, 均是错误的.

一 . 静态内部类可以有静态成员,而非静态内部类则不能有静态成员。

二 . 静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;

三 . 非静态内部类的非静态成员可以访问外部类的非静态变量。

生成一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成:Outer.Inner in = new Outer.Inner();而不需要通过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类(正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static 的。只是将嵌套类置于接口的命名空间内,这并不违反接口的规则)
分享到:
评论

相关推荐

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

    总的来说,理解Java和Kotlin的内部类和静态嵌套类是成为一名合格的移动开发者的基础。通过学习和实践,你可以更好地组织代码,提高代码质量,同时降低维护成本。在提供的资源中,"java内部类嵌套类"和"kotlin内部类...

    Java 深入理解嵌套类和内部类

    嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,非静态嵌套类也即被称作为内部类(inner)。嵌套类从 JDK1.1 开始引入。 一、嵌套类的概念 嵌套类是指在一个类的内部定义另一个类。这种类可以...

    java静态内部类(嵌套类)

    接下来,我们将通过一个具体的例子来深入理解静态内部类的特点及其使用场景。 ```java public class Outer { private static int i = 1; private int j = 10; public static void outer_f1() {} public void ...

    嵌套类内存布局分析(vc)

    2. **非静态嵌套类(Non-Static Nested Class)**:非静态嵌套类的对象通常会被包含在外部类对象中,这意味着一个外部类对象可以包含一个或多个嵌套类对象。这种情况下,嵌套类对象的地址会紧接着外部类对象的地址。...

    java-嵌套类(inner class)-来自oracle官网

    嵌套类主要分为两大类:静态嵌套类(Static Nested Class)和非静态嵌套类(Non-static Nested Class),后者通常被称为内部类(Inner Class)。 - **静态嵌套类**:此类嵌套类被声明为`static`,因此它们与外部类...

    深入理解Java嵌套类和内部类

    Java 嵌套类(nested classes)是指在一个类的内部定义另一个类,这种类有两种类型:静态嵌套类和非静态嵌套类。非静态嵌套类也称为内部类(inner classes)。在Java中,嵌套类从JDK1.1开始引入。 一、什么是嵌套类...

    嵌套类的学习

    2. 静态嵌套类(Static Nested Class):静态嵌套类不是外部类的成员,因此不持有对外部类的引用。它们可以通过类名直接访问,就像普通静态成员一样。 二、嵌套类的特点 1. 访问控制:嵌套类可以访问外部类的所有...

    C++ 静态成员变量 嵌套类分配回收内存

    在深入探讨"C++ 静态成员变量与嵌套类的内存分配回收"这一主题之前,我们首先需要理解几个核心概念:静态成员变量、嵌套类以及它们在内存管理中的角色。 ### C++中的静态成员变量 静态成员变量是类的一个特性,它...

    java嵌套类

    对于静态嵌套类,它们可以访问外部类的非static变量,但是非嵌套类不能访问嵌套类的静态成员变量。对于内部类,它们可以访问外部类的所有成员变量和方法,包括私有成员。 在编程实践中,嵌套类的使用可以增加程序的...

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

    静态内部类,又称为静态嵌套类,是内部类的一种特殊形式。与普通成员内部类不同,静态内部类不持有对外部类的引用,因此不能直接访问外部类的非静态成员。静态内部类需要通过外部类名.静态内部类名的方式来创建对象...

    java 静态内部类的使用规范

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

    Java语言基础入门教程 Java实训教程 14.嵌套类等 共34页.pptx

    静态嵌套类主要用于当内部类不需要引用外部类实例的情况,而内部类则提供了更紧密的封装机制,使得内部类可以直接访问外部类的成员。在实际开发过程中,根据具体需求选择合适的嵌套类类型是非常重要的。

    C++ 嵌套类分配回收内存

    本文将深入探讨C++中嵌套类的内存分配与回收机制,通过一个具体的示例来阐述如何利用静态成员变量和嵌套类进行内存管理。 ### 嵌套类内存管理基础 嵌套类,顾名思义,是在另一个类的内部定义的类。这种类通常用于...

    LINUX静态库.a嵌套.a文件

    总之,`LINUX静态库.a嵌套.a文件`是一个关于Linux静态库二次封装的实践案例,它展示了如何在静态库之间建立依赖关系,并通过`ar`和链接器工具进行构建和使用。这个项目对于理解和学习Linux下的静态库管理具有很高的...

    Java嵌套类和内部类详解

    在Java中,嵌套类分为静态嵌套类和非静态嵌套类,后者通常被称为内部类。 1. 静态嵌套类(Static Nested Class) 静态嵌套类与普通的静态成员类似,它们不直接持有对外部类的引用,因此可以独立于外部类实例存在。...

    内部类分类及应用

    内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和匿名内部类。每种内部类都有其特点和应用场景。 一、成员内部类 成员内部类是指定义在外部类中的内部类。它们可以访问外部类的所有成员变量和方法,无论...

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

    Java中的静态内部类(Static Class),也称为嵌套静态类,是Java语言提供的一种独特机制,它允许我们在一个外部类内部定义一个静态的类。这种类的声明前面带有`static`关键字,与普通的内部类(非静态内部类)有所...

    java面试问题汇总

    它们在Java中分为两种类型:静态嵌套类(Static Nested Class)和非静态嵌套类(通常称为内部类,Inner Class)。 1. 静态嵌套类(Static Nested Class): - 静态嵌套类与外部类之间的关系并不依赖于外部类的对象...

    Java内部类(innerclass).docx

    内部类主要有两种类型:静态嵌套类(Static Nested Class)和非静态嵌套类(通常称为内部类,Inner Class)。 1. **静态嵌套类**: - 静态嵌套类通过`static`关键字声明,它们不直接与外部类的实例关联,而是像...

Global site tag (gtag.js) - Google Analytics