返回顶部
首页 > 资讯 > 后端开发 > Python >一文带你真正理解Java中的内部类
  • 694
分享到

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

2024-04-02 19:04:59 694人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录概述内部类介绍和分类常规内部类局部内部类匿名内部类静态内部类静态内部类和普通内部类的区别内部类的作用概述 不知道大家在平时的开发过程中或者源码里是否留意过内部类,那有思考过为什么

概述

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

内部类介绍和分类

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

常规内部类

@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 内部类内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文带你真正理解Java中的内部类

本文链接: https://lsjlt.com/news/166412.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一文带你真正理解Java中的内部类
    目录概述内部类介绍和分类常规内部类局部内部类匿名内部类静态内部类静态内部类和普通内部类的区别内部类的作用概述 不知道大家在平时的开发过程中或者源码里是否留意过内部类,那有思考过为什么...
    99+
    2024-04-02
  • 学生视角带你了解Java内部类
    目录一、内部类介绍二、成员内部类:1、非静态内部类2、静态内部类二、局部内部类:2、有名的局部内部类1、匿名局部内部类(重要)一、内部类介绍 1.定义:一个类内部又嵌套了一个类,被嵌...
    99+
    2024-04-02
  • Java中的内部类你了解吗
    目录成员内部类1.定义2.成员内部类的使用规则 3.成员内部类对象的创建:4.内部类与静态域静态内部类:1.定义:2.静态内部类的使用规则:3.静态内部类对象的创建&nbs...
    99+
    2024-04-02
  • 一文带你认识java中的String类
    目录什么是字符串字符串常见的赋值方法直接赋值法字符串的比较相等字符串常量池字符串常量池的实例字符串的不可变字符串的常见操作字符串的比较字符串的查找字符串替换 split(S...
    99+
    2024-04-02
  • 一文带你吃透Java中的String类
    目录一、String类的概述二、String类的构造函数三、String类的常用方法3.1、字符串拼接3.2、字符串截取3.3、字符串替换3.4、字符串分割3.5、大小写转换3.6、...
    99+
    2023-05-19
    Java String类常用方法 Java String类原理 Java String类
  • 一文带你初识java中的String类
    目录什么是字符串字符串常见的赋值方法直接赋值法构造方法进行创建字符串的比较相等字符串常量池字符串常量池的实例字符串的不可变字符串的常见操作字符串的比较字符串的查找字符串替换字符串拆分...
    99+
    2024-04-02
  • 一文带你读懂Java中的Character类
    这期内容当中小编将会给大家带来有关一文带你读懂Java中的Character类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用字符时,我们通常使用的是内置数据类型char。实例char ch = ...
    99+
    2023-05-31
    java character类 ava
  • 如何理解Java内部类中的局部内部类
    这篇文章给大家介绍如何理解Java内部类中的局部内部类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。局部内部类  局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或...
    99+
    2023-06-05
  • 一文带你全面了解Java Properties类
    目录概述介绍构造方法关键方法使用案例源码解析总结概述 Properties是JDK1.0中引入的java类,目前也在项目中大量使用,主要用来读取外部的配置,那除了这个,你对它其他的一...
    99+
    2024-04-02
  • 一文带你了解Java中的ForkJoin
    目录什么是ForkJoinForkJoinTask 任务ForkJoinPool 线程池工作窃取算法构造方法提交方法创建工人(线程)例:ForkJoinTask实现归并排序ForkJ...
    99+
    2024-04-02
  • 如何理解Java内部类中的匿名内部类
    如何理解Java内部类中的匿名内部类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。匿名内部类  匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名...
    99+
    2023-06-05
  • 如何理解Java内部类中的成员内部类
    如何理解Java内部类中的成员内部类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的...
    99+
    2023-06-05
  • 一文带你掌握Java中Scanner类的使用
    java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。下面是创建 Scanner 对象的基本语法: Scanner s = ...
    99+
    2023-05-17
    Java Scanner类使用 Java Scanner类 Java Scanner
  • 一篇文章带你详细理解java中类的继承与多态
    类的继承子类及其定义子类的定义使用关键字extends格式:class SubClass extends SuperClass{ ........ }子类可以继承父类的属性和方法;子类不能继承带private修饰符的属性,方法;子类不能继承...
    99+
    2017-08-28
    java入门 java 继承 多态
  • 一篇文章带你了解Python中的类
    目录1、类的定义2、创建对象3、继承总结1、类的定义 创建一个rectangle.py文件,并在该文件中定义一个Rectangle类。在该类中,__init__表示构造方法。其中,s...
    99+
    2024-04-02
  • 一文带你了解Java中基本数据类型的包装类
    这篇文章将为大家详细讲解有关一文带你了解Java中基本数据类型的包装类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java是面向对象的编程语言,包装类的出现更好的体现这一思想。 其次,包装...
    99+
    2023-05-31
    java 基本数据类型 包装类
  • 一文读懂java中的匿名内部类
    一文读懂java中的匿名内部类?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java匿名内部类:1:匿名内部类,匿名内部类也就是没有名字的内部类。2:匿名内部类的作用正因为...
    99+
    2023-05-31
    java 匿名内部类 ava
  • 一文带你搞懂Java中Object类和抽象类
    目录一、抽象类是什么二、初始抽象类2.1 基本语法2.2 继承抽象类三、抽象类总结四、Object类4.1 初始Object4.2 toString4.3 equals4.4 has...
    99+
    2024-04-02
  • 【JAVA】一文带你了解java的数据类型与变量
    作者主页:paper jie的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将jav...
    99+
    2023-09-04
    java 开发语言
  • 一文带你深入了解Node中的Buffer类
    简单来说所谓的Buffer就是Node在V8堆内存之外分配的一块固定大小的内存空间。当Buffer被用console.log打印出来时,会以字节为单位,打印出一串以十六进制表示的值。创建Buffer了解完Buffer的基本概念后,我们再来创...
    99+
    2023-05-14
    前端 Node.js JavaScript
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作