我的编程空间,编程开发者的网络收藏夹
学习永远不晚

一文带你真正理解Java中的内部类

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

一文带你真正理解Java中的内部类

概述

不知道大家在平时的开发过程中或者源码里是否留意过内部类,那有思考过为什么要有内部类,内部类都有哪几种形式,静态内部类和普通内部类有什么区别呢?本篇文章主要带领大家理解下这块内容。

内部类介绍和分类

顾名思义,内部类是指一个类在另外一个类的内部,是定义在另一个类中的类。根据类的位置和属性不同,可以分为下面几种。

常规内部类

@Data
public class Tree {

    private String treeName;

    private String treeType;

    private List<Leaf> leafs;


    @Data
    public class Leaf {
        private String color;

        private String leafSize;

        public void show() {
            System.out.println("tree name: " + Tree.this.treeName);
            System.out.println("tree name: " + treeName);
        }
    }

    public static void main(String[] args) {
        Tree tree = new Tree();
        Leaf leaf = tree.new Leaf();
    }
}

上面就是一个内部类的例子,Leaf是Tree的内部类。

  • 内部类中可以直接访问外部类的数据,包括私有数据。
  • 常规内部类中的方法或者字段不能是静态的。
  • 内部类中可以使用如下的语法Tree.this.treeName
  • 内部类创建对象需要外部对象的存在,如下:
Tree tree = new Tree();
Leaf leaf = tree.new Leaf();

字节码分析:

我们查看下内部类的字节码,如下图:

我们看到内部类Leaf的构造方法init,实际上会隐式地将外部对象传入,初始化,这样才能在内部类中访问。

局部内部类

局部内部类,比如只有在一个方法内部创建。

@Data
public class Tree {

    private String treeName;

    private String treeType;

    private List<Leaf> leafs;

    public void treeRoot(int height) {
        class TreeRoot {
            private int rootHeight;

            public void showRootHeight() {
                this.rootHeight = height;
                System.out.println("root height " + height);
            }
        }
        TreeRoot root = new TreeRoot();
        root.showRootHeight();
    }
}
  • 局部类不能用public或private访问说明符进行声明,因为作用域只在这个局部,没有必要。
  • 局部内部类可以完全将自己隐藏起来,体现良好的封装性。
  • 局部内部类可以直接访问方法的变量。

匿名内部类

匿名内部类,就更加简洁了,连类名都省略了, 这个配合lambda食用,非常简便,想必大家也经常使用了。

public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("runnable");
            }
        };

        Runnable runnable2 = () -> System.out.println("runnable");
    }

匿名内部类也体现了良好的封装性和简洁性。

静态内部类

最后,再介绍下静态内部类,这个也使用的非常频繁。java源码中也有很多这样的例子,比如HashMap中,Node节点就是一个静态内部类。

如果用static来修饰一个内部类,那么就是静态内部类。这个内部类属于外部类本身,但是不属于外部类的任何对象。因此使用static修饰的内部类称为静态内部类。静态内部类有如下规则:

  • 静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
  • 外部类可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象访问其实例成员。

静态内部类和普通内部类的区别

我们可以通俗按下面的方式理解:

内部类:就是我是你的一部分,我了解你,我知道你的全部,没有你就没有我。(所以内部类对象是以外部类对象存在为前提的)

静态内部类:就是我跟你没关系,自己可以完全独立存在,但是我就借你的壳用一下,来隐藏自己。

从字节码角度上看,静态内部类和非静态内部类最大的区别是:非静态内部类编译后隐式保存着外部类的引用(就算外部类对象没用了也GC不掉),但是静态内部类没有。

内部类的作用

通过上面的了解,我想内部类还是有一定的意义的。

  • 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。
  • 内部类可以对同一个包中的其他类隐藏起来。

其实内部类更多的时候,不想把这个类暴露出去,它可能只是外部类的一个逻辑组成部分,不需要其他地方知道什么,这时候我们用内部类更加的清楚。

到此这篇关于一文带你真正理解Java中的内部类的文章就介绍到这了,更多相关Java 内部类内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

一文带你真正理解Java中的内部类

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一文带你吃透Java中的String类

在Java中,字符串是一种常见的数据类型,经常用于存储一些文本信息,而String类则是Java提供的专门用于字符串操作的类,本文就来和大家聊聊String类的常用方法与实现原理吧
2023-05-19

一文带你读懂Java中的Character类

这期内容当中小编将会给大家带来有关一文带你读懂Java中的Character类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用字符时,我们通常使用的是内置数据类型char。实例char ch = a;/
2023-05-31

如何理解Java内部类中的局部内部类

这篇文章给大家介绍如何理解Java内部类中的局部内部类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。局部内部类  局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或
2023-06-05

如何理解Java内部类中的匿名内部类

如何理解Java内部类中的匿名内部类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。匿名内部类  匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名
2023-06-05

如何理解Java内部类中的成员内部类

如何理解Java内部类中的成员内部类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的
2023-06-05

一文带你掌握Java中Scanner类的使用

Scanner类是java.util包中的一个类,常用于控制台的输入,当需要使用控制台输入时即可调用这个类。本文将通过一些简单的例子为大家介绍一下Java中Scanner类的使用,需要的可以参考一下
2023-05-17

一篇文章带你详细理解java中类的继承与多态

类的继承子类及其定义子类的定义使用关键字extends格式:class SubClass extends SuperClass{........}子类可以继承父类的属性和方法;子类不能继承带private修饰符的属性,方法;子类不能继承构造方法更多相关视频教程
一篇文章带你详细理解java中类的继承与多态
2017-08-28

一文带你了解Java中基本数据类型的包装类

这篇文章将为大家详细讲解有关一文带你了解Java中基本数据类型的包装类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java是面向对象的编程语言,包装类的出现更好的体现这一思想。 其次,包装
2023-05-31

一文读懂java中的匿名内部类

一文读懂java中的匿名内部类?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java匿名内部类:1:匿名内部类,匿名内部类也就是没有名字的内部类。2:匿名内部类的作用正因为
2023-05-31

一文带你深入了解Node中的Buffer类

本篇文章带大家深入了解下Node​中 Buffer(缓冲区)类,希望对大家有所帮助!
2023-05-14

一文带你了解Java中的SPI机制

SPI全称是ServiceProviderInterface,是一种JDK内置的动态加载实现扩展点的机制,本文主要为大家介绍了SPI机制的原理与使用,需要的可以参考一下
2023-05-15

一文带你读懂java中的异常处理

本篇文章为大家展示了一文带你读懂java中的异常处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java异常层次结构Exception异常RuntimeException与非RuntimeExce
2023-05-31

一文带你深入理解Golang中的RWMutex

这篇文章主要为大家详细介绍了Golang中RWMutex的相关知识,知其然,更要知其所以然。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2023-05-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录