`

嵌套类

 
阅读更多

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html 

 

嵌套类

java允许使用者在一个类里定义另外一个类,这样的类称之为嵌套类,比如像这样

class OuterClass{
   ...
   class  NestedClass{
        ...
   }
}

 嵌套类可以分为两种:静态的和非静态的。被声明为静态的嵌套类称之为静态嵌套类(static nested classes),非静态的嵌套类称之为内部类(inner classes)

嵌套类是外部类的成员,其中内部类能够使用外部类的所有成员(包括方法和属性,包括私有)。静态嵌套类不能使用外部类的成员。

 

为什么要用嵌套类呢?

使用嵌套类主要有这三个理由:

1.如果一个类A只被另一个类B使用,那就可以将A写成B的内部类,这样逻辑上把他们打包成组,也让类所在包结构更合理化

2.假设有两个逻辑上同等级的类A和B,当B需要访问A的私有成员时,就要嵌套

3.将一些小型的类嵌套在使用它们的顶级类中,使代码的可读性和可维护性更强

 

静态嵌套类

静态嵌套类跟外部类的关系就像静态方法跟静态属性一样,比如静态嵌套类是private的话,其他类就不能用。另外就像类的静态方法一样,静态嵌套类不能直接涉及定义在外部类的实例变量和实例方法,只能通过对象引用来使用它们。

静态嵌套类跟它的外部类实例成员的关系,就像其他顶级类(非嵌套类)一样。实际上,把一个类写成静态嵌套类只能因为package方便

如果说静态内部类跟一般类有什么区别的话就两点:

1.使用时必须带上外部类,比如在实例化的时候

OuterClass.StatiNestedClass nestedObject = new OuterClass.StaticNestedClass();

 2.使用外部的静态成员时,语法上可以不带外部类

 

内部类

就跟实例方法和实例属性一样,内部类能够直接使用外部类对象的属性和方法。同时因为内部类是跟一个实例关联的,它不能定义任何静态成员。(个人认为,这样规定并不是因为不能实现,估计因为当初设计者为了是内部类更像一个成员变量)

内部类实例只能存在于一个外部类实例,并且能直接获取外部类实例的成员

要实例化一个内部类,必须先实例化一个外部类,然后用一下语法来实例化内部类

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

 还有两种特殊的内部类:本地类和匿名类 后面介绍

 

嵌套类机制实现

嵌套类的实现并不是通过修改jvm机制或指令,它的实现是通过编译器特殊编译实现的,相当于是语法糖。每一个嵌套类都会单独生成一个class文件,这个class类名一般是外部类名+$+内部类名,这个生成的类除了有本来的属性跟方法外,还有一个类型为外部类的final属性以及一个参数为外部类的构造方法。内部类调用外部类的变量方法,其实就是调用这个final属性的变量跟方法。而实例化一个内部类就是将那个outerObject作为参数调用内部类的构造方法,实例化一个静态嵌套类就是已null为参数调用构造方法。

 

遮蔽(Shadowing)

如果在一个特定作用域(比如内部类或一个方法中)声明了一个类型(比如成员变量或参数名),而这个申明跟它的外部作用域有相同的名称,那么内部这个声明遮蔽外部作用域的声明。那就不能直接用这个变量的名称去调用被遮蔽的声明。比如

public class ShadowTest {
    public int x = 0;
    class FirstLevel {
        public int x = 1;
        void methodInFirstLevel(int x) {
            System.out.println("x = " + x);
            System.out.println("this.x = " + this.x);
            System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
        }
    }

    public static void main(String... args) {
        ShadowTest st = new ShadowTest();
        ShadowTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);
    }
}
结果:x = 23
      this.x = 1
      ShadowTest.this.x = 0

 这个例子中定义了三个名称为x的变量:ShadowTest的成员变量、内部类FirstLevel的成员变量和methodInFirstLevel方法的参数。方法参数x遮蔽了FirstLevel的成员变量,因此在方法中使用变量x的时候,它引用的是方法参数。要引用内部类FirstLevel的成员变量,可以使用关键字this来代表外部作用域。要引用更外部做用域的成员变量需要带上该变量所属的类名

 

序列化

非常不建议序列化包括本地方法、匿名方法在内的内部类。为什么呢,如上面讲的内部类生效是因为java编译器单独为它生产一个class文件,而且他的构造方法是合成的。这个合成的方式虚拟机是不管的,由各家编译器去实现,当然就会有差异性,那么在序列化再反序列化的时候就容易出问题

分享到:
评论

相关推荐

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

    Java 嵌套类和内部类详解 Java 中的嵌套类和内部类是指在一个类的内部定义另一个类,这种类称为嵌套类(nested classes)。嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,非静态嵌套类也即被称...

    c++嵌套类详细分析

    C++嵌套类详细分析 C++中的嵌套类是指在一个类中定义的类,定义嵌套类的目的是隐藏类名,减少全局的标识符,从而限制用户能否使用该类建立对象。这样可以提高类的抽象能力,并且强调了两个类(外围类和嵌套类)之间...

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

    嵌套类在编程中是一种特殊的类定义方式,它允许在一个类的定义内部定义另一个类。这种结构在设计复杂的软件系统时特别有用,因为嵌套类可以封装特定于外部类的信息,提供良好的信息隐藏和模块化。本文将深入探讨嵌套...

    C#中的包含,嵌套类

    包含类:就是在另一个对象中做数据成员的对象类型。 嵌套类:一个类完整的包含了另一个类。

    COM 嵌套类实现COM

    在嵌套类的上下文中,我们可以创建一个内部接口,只供嵌套类使用,从而实现更细粒度的接口管理。这样可以避免暴露不必要的方法,提高组件的安全性和稳定性。 接下来,我们需要创建一个实现COM接口的类,这个类通常...

    C++中的嵌套类参考

    在C++编程语言中,嵌套类是一种强大的特性,它允许在一个类的定义内部定义另一个类。这样的设计有助于封装和组织代码,同时还能提供更高级别的抽象。本篇将深入探讨嵌套类的概念,以及如何在实际编程中有效利用它们...

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

    ### Java嵌套类详解 #### 一、嵌套类(Nested Class)概述 嵌套类是一种在Java中非常有用的特性,允许开发者在一个类或者接口的内部定义另一个类。这种结构可以增强代码的组织性和封装性。 ##### 1.1 嵌套类的...

    嵌套类的学习

    嵌套类是面向对象编程中的一个重要概念,它在Java、C#等编程语言中被广泛使用。嵌套类,顾名思义,就是在类内部定义的另一个类,它可以是静态的,也可以是非静态的,根据其特性,可以分为内部类(Inner Class)和...

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

    在C++编程语言中,内存管理是至关重要的一个方面,特别是在处理复杂的类结构时,如嵌套类。本文将深入探讨C++中嵌套类的内存分配与回收机制,通过一个具体的示例来阐述如何利用静态成员变量和嵌套类进行内存管理。 ...

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

    内部类和静态嵌套类是这两种语言中用于组织代码结构的重要特性。本篇文章将详细探讨这两个概念,并通过对比Java和Kotlin的差异,帮助初学者理解它们的工作原理和应用场景。 首先,我们来了解Java中的内部类。Java...

    从Java嵌套类中访问外部类成员.doc

    在Java编程语言中,嵌套类(也称为内部类)是一种强大的特性,它允许在一个类的内部定义另一个类。这通常用于表示一个类与另一个类之间的紧密关系,比如当一个类是另一个类的一部分或者需要访问另一个类的私有成员时...

    java静态内部类(嵌套类)

    ### Java静态内部类(嵌套类)详解 #### 一、静态内部类概念与特性 在Java编程语言中,静态内部类(也被称为嵌套类)是一种特殊的内部类形式,它通过`static`关键字来定义。与普通内部类相比,静态内部类具有以下...

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

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

    java嵌套类

    首先,根据嵌套类定义的位置,可以将嵌套类分为成员嵌套类(Member Nested Classes)、局部嵌套类(Local Nested Classes)和匿名嵌套类(Anonymous Nested Classes)。 成员嵌套类是指作为外部类(Enclosing Class...

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

    ### Java语言基础入门教程:嵌套类详解 #### 一、概述 《Java语言基础入门教程》中的第14章主要介绍了嵌套类的相关概念及其使用方法。本章旨在通过详细的解析帮助读者理解和掌握嵌套类的基础知识以及如何在实际...

    嵌套类、迭代器1

    在C++编程中,嵌套类(Nested Class)和迭代器(Iterator)是两种非常重要的概念,它们在软件设计和实现中发挥着关键作用。让我们深入探讨这些知识点。 首先,嵌套类是指一个类被定义在另一个类的内部,这样的内部...

    Java精华版 chm Java API、嵌套类和内部类、与时间有关的类Date,DateFormat,Calendar、文件与流、Java变量类型间的相互转换、Java与Web、用连接池提高Servlet访问数据库的效率、Java扩展、应用服务器的集群策略及Java EE 5.0、Java IO 包中的Decorator模式等

    本Java精华内容深入Java API、嵌套类和内部类、与时间有关的类Date,DateFormat,Calendar、文件与流、Java变量类型间的相互转换、Java与Web、用连接池提高Servlet访问数据库的效率、Java扩展、应用服务器的集群策略及...

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

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

Global site tag (gtag.js) - Google Analytics