Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java中的嵌套类、内部类、静态内部类

Java中的嵌套类、内部类、静态内部类

作者头像
用户7886150
修改于 2020-12-18 07:01:09
修改于 2020-12-18 07:01:09
1.8K0
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: Java中的嵌套类

Java中我们在一个类的内部再定义一个类,如下所示:

 class OuterClass {

    ...

    class NestedClass {

        ...

    }

}那么在上面的例子中我们称OuterClass为外围类(enclosing class),里面的那个类称之为嵌套类(Nested Class).

嵌套类可以分为两种,静态的和非静态的,即静态嵌套类和非静态嵌套类。非静态嵌套类又叫做内部类(Inner Class)。我们通常所说的静态内部类其实是不严格的,严格的说应该叫做静态嵌套类(Static Nested Class)。

class OuterClass {

    ...

    class InnerClass {

        ...

    }

    static class StaticNestedClass {

        ...

    }    

}

上述代码中的InnerClass就是内部类,StaticNestedClass就是静态嵌套类。

内部类与静态嵌套类虽然都是嵌套类,但在使用上是有一些区别的。

内部类

比如有如下内部类的定义,

class OuterClass {

    ...

    class InnerClass {

        ...

    }

}

OuterClass是InnerClass的外围类,InnerClass是OuterClass的内部类。内部类的实例对象都会绑定一个外围类的实例对象,并且InnerClass可以访问其所绑定的OuterClass的所有成员属性以及方法,包括私有成员属性以及方法。在InnerClass中通过OuterClass.this

显式的

引用其所绑定的OuterClass的实例。要实例化内部类InnerClass,必须首先实例化其外围类OuterClass,然后用如下的语法创建内部类的实例:

OuterClass outerObject = new OuterClass();

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

 注意,上面写得是outerObject.new InnerClass(),而不是new OuterClass.InnerClass(); 

 我们在执行代码OuterClass.InnerClass innerObject = outerObject.new InnerClass()的时候,其实做了两件事,一件事是创建一个内部类的实例innerObject,第二件事是让innerObject绑定outerObject作为其外围类的实例。这样innerObject就可以访问outerObject内的所有成员属性以及方法了。

 那如果想直接跳过外围类去初始化内部类会怎么样呢?代码如下所示:

  如果执行代码InnerClass innerObject = new InnerClass(),会出现如下的编译错误:

  No enclosing instance of type OuterClass is accessible. Must qualify the allocation with an enclosing instance of type OuterClass (e.g. x.new A() where x is an instance of OuterClass).

  编译器给出的错误提示很明确,就是我们没有外围类OuterClass的实例就去初始化内部类了。要写成x.new InnerClass()的形式,其中x是外围类OuterClass的一个实例对象。

 静态嵌套类

  有些人把静态嵌套类成为静态内部类,其实静态内部类这个称呼不严谨,因为内部类都是非静态的。静态嵌套类与内部类有很大的不同,静态嵌套类说到底就是一个静态类,只不过是其位置位于某个类的内部罢了。

  假设有如下静态嵌套类的定义:

 class OuterClass {

    ...

    static class StaticNestedClass {

        ...

    }

}

 那么我可以像正常使用一个一般的静态类那样使用一个静态嵌套类,只不过要通过其外围类的名字来访问静态嵌套类的名字。所以,外围类更像是静态嵌套类的命名空间。比如要获取静态嵌套类,要使用

 OuterClass.StaticNestedClass。

  如果要创建静态嵌套类的实力对象,使用如下的语法:

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

  由于静态嵌套类的本质就是一个静态类,所以其实例对象的初始化不需要也不能像内部类那样需要绑定一个外围类对象。由于静态嵌套类没有像内部类那样绑定外部类对象,所以也就不存在静态嵌套类不能访问其外围类的成员这种说法。

  如果我们像初始化内部类那样初始化静态嵌套类,也就是在创建静态嵌套类的时候给其绑定其外围类的实例对象,会怎么样呢?代码如下所示:

   可以发现,如果我们在初始化静态嵌套类时强行给其绑定外围类的实例对象,编译器就会报错:

   Illegal enclosing instance specification for type OuterClass.StaticNestedClass

 我们给静态嵌套类OuterClass.StaticNestedClass指定了非法的外围类的实例。

综上所述,虽然内部类和静态嵌套类都属于嵌套类,但是二者有本质区别:内部类的实例化对象需要绑定一个外围类的实例化对象,而静态嵌套类的实例化对象不能也无法绑定外围类的实例化对象。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Effective Java-嵌套类(内部类)
嵌套类(nested class)是指被定义在另一个类内部的类。嵌套类的存在目的应该只是为外围类(enclosing class)提供服务。嵌套类有四种:
用户2146693
2019/08/08
6910
Java提高篇——详解内部类
本文主要介绍了Java中的内部类相关知识点,包括内部类的定义、特点、使用方式以及局部内部类、匿名内部类和静态内部类的使用。同时,还讲解了Java中的局部变量和成员变量在使用上的一些区别,以及如何在方法中使用局部变量和成员变量。最后,还通过一个示例来演示了内部类的使用方式和应用场景。
Java后端工程师
2017/12/12
1.1K0
java学习之内部类
java支持在一个类的内部定义一个类(非static类,static内部类也叫作嵌套类,不要与内部类混淆),该类就是外部类的内部类,下面将学习记录如下:
johnhuster的分享
2022/03/28
3090
Java基础8:深入理解内部类
https://h2pl.github.io/2018/04/25/javase8
程序员黄小斜
2019/04/06
1.6K0
JAVA 第二天 内部类
package com.company; /** * Created by Administrator on 2016/8/23. */ public class Outter {//生成的字节码文件是Outter.class /** * 嵌套的概念 * 类中除了变量和方法之外,还可以定义一个类 * 这个类就是内部类,就是嵌套 * * 调用内部类 需要创建内部类的对象 * */ private int a=1; //内
拾点阳光
2018/05/11
7420
内部类的简单理解
我们知道,在java中类是单继承的,一个类只能继承另一个具体类或抽象类(可以实现多个接口)。这种设计的目的是因为在多继承中,当多个父类中有重复的属性或者方法时,子类的调用结果会含糊不清,因此用了单继承。
zhangjiqun
2024/12/16
880
关于Java里面的嵌套类,你了解多少?
最近在看《Core Java for the Impatient》这本书,当然为了方便我看的是英文电子版的PDF格式(有需要的朋友,可以后台留言给我),期间又重新认识或升级了不少Java相关的知识,今天我们来聊一聊Java里面的内嵌类,又称嵌套类。
我是攻城师
2018/07/23
5220
关于Java里面的嵌套类,你了解多少?
java的内部类和静态内部类(嵌套类)
开发新项目,写Swager的mode的时候用到了嵌套Model,于是在代码中,出现了静态内部类。在codeReview的时候稍微和大家聊了一下。尤其是Static 修饰类和修饰对象和变量不一样呢?
袁新栋-jeff.yuan
2020/08/26
1.7K0
Java中的静态内部类_Effective Java 2.0_Item 2知识点
在Java中有静态代码块、静态变量、静态方法,当然也有静态类,但Java中的静态类只能是Java的内部类,也称为静态嵌套类。静态内部类的定义如下:
Tyan
2022/05/09
3310
Java中嵌套类用法
在Java中,可以在另一个类中定义一个类。这些类称为嵌套类。它们使您能够对只在一个地方使用的类进行逻辑分组。因此,这增加了封装的使用,并创建了更具可读性和可维护性的代码。
程序你好
2018/09/29
2.2K0
【JAVA-Day65】Java内部类深度解析
作为默语博主,深入研究Java内部类,揭示其关键概念和实际应用,为读者提供全面的内部类知识概览。在本博客中,我们将探索内部类的基本概念、语法结构,深入研究不同类型的内部类,比较内部类与普通类的关系,讨论内部类的实际应用场景,并通过面试题挑战读者对内部类的理解。
默 语
2024/11/20
1340
【JAVA-Day65】Java内部类深度解析
这里有线程池、局部变量、内部类、静态嵌套类和一个莫得名堂的引用,哦,还有一个坑!
请问,上面代码中,位于 method 方法中的 object 对象,在方法执行完成之后,是否可以被垃圾回收?
why技术
2022/11/01
5750
这里有线程池、局部变量、内部类、静态嵌套类和一个莫得名堂的引用,哦,还有一个坑!
内部类
一般情况,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类。
帅飞
2019/01/22
4140
Java Nested Classes(内部类~第一篇英文技术文档翻译)
鄙人最近尝试着翻译了自己的第一篇英文技术文档。 Java Nested Classes Reference From Oracle Documentation
翎野君
2023/05/12
4330
java提高篇之详解内部类
内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二)。
哲洛不闹
2018/09/18
3990
java提高篇之详解内部类
关于Java里面的嵌套类,你了解多少?
最近在看《Core Java for the Impatient》这本书,当然为了方便我看的是英文电子版的PDF格式(有需要的朋友,可以后台留言给我),期间又重新认识或升级了不少Java相关的知识,今天我们来聊一聊Java里面的内嵌类,又称嵌套类。
我是攻城师
2018/06/02
1K0
java静态内部类和成员内部类的区别
如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。嵌套类意味着:
IT工作者
2022/05/09
1K0
Java学习笔记:深入理解嵌套类和内部类
可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型: 静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种: 其一、在一个类(外部类)中直接定义的内部类; 其二、在一个方法(外部类的方法)中定义的内部类; 其三、匿名内部类。下面,我将说明这几种嵌套类的使用及注意事项。
用户1289394
2021/02/05
7100
Java学习笔记:深入理解嵌套类和内部类
夯实Java基础系列18:深入理解Java内部类及其实现原理
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/10/08
1.3K0
不清楚Java内部类的编译原理?读完这篇就够了
什么是内部类?我们将一个类A定义在另外一个类B中,那么这个类A就叫内部类。这是Java的一种非常有用的特性,它允许我们将“一些逻辑相关的类统一组织在一起,封装在内部,并控制类的可见性”。
后台技术汇
2022/05/28
4510
不清楚Java内部类的编译原理?读完这篇就够了
相关推荐
Effective Java-嵌套类(内部类)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档