【JavaSE】你真的了解内部类吗?

news2024/11/27 2:46:33

前言

本篇会详细讲解内部类的四种形式,让你掌握内部类~

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

 内部类介绍

实例内部类

定义

调用

静态内部类

定义

调用

匿名内部类

定义和调用1

调用方法2

局部内部类

定义和调用


 内部类介绍

在 Java 中,可以将一个类定义在另一个类或者一个方法的内部, 前者称为内部类,后者称为外部类。(B类定义在A类的内部,称B类为内部类,A类为外部类)内部类也是封装的一种体现。

内部类分为三种

实例内部类、静态内部类、匿名内部类、局部内部类

实例内部类

定义

实例内部类定义在外部类的里面,方法的外面

class OuterClass{
    public int data1=1;
    public int data2=2;
    public static int data3=3;
  
    class InnerClass{
        public int data4=4;
        public int data5=5;
        public static int data6=6;
        
        //内部类的成员方法
        public void test(){
            System.out.println("InnerClass::test()");
        }
    }
    public void testA(){
        System.out.println("OuterClass::testA()");
    }
}

调用

实例内部类的实例化  

外部类.内部类  内部类引用=外部类引用.new内部类对象

实例内部类可以理解为是外部类的一个成员,要通过外部类的引用来调用

    public static void main(String[] args) {
        OuterClass outerClass=new OuterClass();//实例化外部类
      
        OuterClass.InnerClass innerClass=outerClass.new InnerClass();//实例化内部类

        innerClass.test();//调用内部类中的成员方法
    }

 实例内部类的方法可以调用自己的成员变量及外部类的成员变量

        //内部类的成员方法
        public void test(){
            System.out.println("InnerClass::test()");
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
            System.out.println("###########");
            System.out.println(data1);
            System.out.println(data2);
            System.out.println(data3);
        }

 调用test方法 结果如图

 当内部类和外部类有相同的成员变量时,首先会访问内部类中的成员

此时,若就想访问外部类的成员变量,可以使用 外部类.this.成员变量 即可访问

 

静态内部类

定义

静态内部类定义在 外部类的里面,方法的外面,并且用static修饰

生成内部类引用不需要外部类引用的调用

class OuterClass{
    public int data1=1;
    public int data2=2;
    public static int data3=3;
    //静态内部类,外部类的里面,方法的外面,并且用static修饰
    static class InnerClass{
        public int data4=4;
        public int data5=5;
        public static int data6=6;

        //内部类的成员方法
        public void test(){
            System.out.println("InnerClass::test()");
        }
    }
    public void testA(){
        System.out.println("OuterClass::testA()");
    }

调用

静态内部类的实例化  

        OuterClass.InnerClass innerClass=new OuterClass.InnerClass();
        innerClass.test();

 调用外部类的成员变量,通过直接在静态内部类的成员方法中 实例化一个外部类对象,通过对象直接调用外部类的成员变量

//静态内部类的成员方法
        public void test(){
            System.out.println("InnerClass::test()");
            OuterClass outerClass=new OuterClass();
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
            System.out.println("###########");
            System.out.println(outerClass.data1);
            System.out.println(data3);
        }

 结果

内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件

匿名内部类

定义和调用1

相当于一个类实现了这个接口,同时重写了test方法

//接口
interface ITestable{
    void test();
}

public class Test4 {
    public static void main(String[] args) {
//匿名内部类
        new ITestable(){

            @Override//重写了接口的方法
            public void test() {
                System.out.println("test(");
            }
        }.test();//调用test方法  直接在后面.test方法
    }
}

调用方法2

通过引用对象it调用test方法

        ITestable it =new ITestable() {
            @Override
            public void test() {
                System.out.println("test()");
            }
        };
        it.test();

 

局部内部类

定义和调用

定义在外部类的方法中的类

class OuterClass{
    public int  data1=1;
    public void testA(){
        //局部内部类 定义在方法里面  只能在当前方法中使用
        class InnerClass {
            public int data1=100;
            public static int data2=2;
            public void test(){
                System.out.println("InnerClass::test");
            }
        }
//局部内部类 只能在当前方法testA中使用
        InnerClass innerClass=new InnerClass();
        innerClass.test();
    }  
}

注意:

  • 局部内部类只能在所定义的方法体内部使用
  • 不能被public、static等修饰符修饰
  • 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
  • 几乎不会使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1599809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux的重要命令(二)+了解Linux目录结构

目录 一.Linux的目录结构 二.查看文件内容命令 1.cat 命令 2.more 命令 3.less 命令 4.head 命令 5.tail 命令 6.拓展 head 和 tail 的其他用法 ​编辑 三.统计文件内容的命令-wc ​编辑 四.检索和过滤文件内容的命令-grep ​编辑 ​编辑 五.压缩命令 gzip 和 bz…

碳课堂|碳关税是什么?企业如何从容应对?

2023年10月1日,欧盟碳边境调节机制(CBAM)法规,即全球首个“碳关税”开始实施。据世界银行研究报告称,如果“碳关税”全面实施,在国际市场上,中国制造可能将面临平均26%的关税,出口量…

【数据结构与算法】之双向链表及其实现!

​ 个人主页:秋风起,再归来~ 数据结构与算法 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 目录 1、双向链表的结构及概念 2、双向链表的实现 2.1 要实现的接口…

Token2049主办方遭遇假门票风波,韩国罗马基金会Charles Lee损失50万美元

加密货币——遍地黄金?还是遍地陷阱? 尽管伊朗空袭以色列导致中东局势愈发紧张,但加密社区对当地市场的热情丝毫没有受到影响,不出意外的话,Token 2049这场全球最受瞩目的加密货币盛会将于4月18至19日在迪拜如期举行&…

【Python基础】—— scipy.spatial.KDTree、matplotlib.pyplot、imageio

scipy.spatial参考博客:Python点云处理——建立KDtree 1 KDtree算法原理 KDtree构建出了一种类似于二叉树的树形数据存储结构,每一层都对应原始数据中相应的维度,以K层为一个循环,因此被称为KDtree。 每一层的左右子树的划分依据…

请把「睡一个好觉」,当成一天里最重要的事来管理

我发现许多人都有这么一种情况:明明知道睡眠很重要,但却总是有意无意地熬夜。 比如: 给自己排了太多的学习和工作量,一不小心就到了凌晨一两点; 总觉得过去的一天什么都没干,宁愿在网上闲逛,也不…

Alpha Zero——强化学习的集大成者

文章目录 题目:A general reinforcement learning algorithm that masters chess, shogi and Go through self-play1.概述2.主要内容2.1 网络部分2.2 蒙特卡洛树搜索(MCTS)3.结论题目:A general reinforcement learning algorithm that masters chess, shogi and Go throug…

AI时代的办公新趋势:Python自动化办公解决方案

当我们谈论AI时代的办公新趋势时,Python自动化办公显然是其中的一个重要方向。Python作为一门灵活强大的编程语言,在办公自动化中发挥着巨大作用。下面我们将深入探讨Python在自动化办公中的应用,并通过中等难度的编程例子来展示Python的威力…

大模型日报|今日必读的10篇大模型论文

大家好,今日必读的大模型论文来啦! 1.谷歌推出新型 Transformer 架构:反馈注意力就是工作记忆 虽然 Transformer 给深度学习带来了革命性的变化,但二次注意复杂性阻碍了其处理无限长输入的能力。 谷歌研究团队提出了一种新型 T…

比亚迪官宣秦L:第五代DM-i技术,续航超2000公里下月见

在大伙儿有入手新能源车需求时,大概率会产生应该选纯电还是混动车型方面的纠结。 那么咱们今天就趁着这个机会来简单聊一聊。 纯电车作为不短时间内电动新能源车终极解决方案,其动力结构也最为简单,主要由一块大容量动力电池、电机及电控部…

mybatis后,将代码生成器生成的代码合并到原有的项目中去

【明白了解: 1)接口只定义方法,(告诉你要做什么) 2)具体的逻辑都写在Impl 实现类里】 3)【不是问题 , idea2023对界面进行了优化,变好看了 】 一、鱼皮操作 1.1拖拽…

JVM结构化体系

目录 目录 1.JVM 简介 1.1. 如何理解 JVM 呢? 1.2. 市场主流 JVM 分析? 1.3. 为什么要学习 JVM? 1.4. 字节码底层是如何执行呢? 如何理解 JIT 呢? 为什么 JVM 中解释执行与编译执行的并存(混合模式&…

全球顶级的低代码开发平台,你知道几个?

什么是低代码开发平台? 低码开发平台是一个应用程序,提供图形用户界面编程,从而以非常快的速度开发代码,减少了传统的编程工作。 这些工具有助于快速开发代码,最大限度地减少手工编码的努力。这些平台不仅有助于编码,而且还能快速安装和部署。 低码开发工具的好处 低代码平…

2024Spring> HNU-计算机系统-实验3-Bomblab-导引/答疑

前言 BombLab一定要花时间完成哦,对于期末卷面的提升和计算机系统的理解都非常重要。 导引 ①文件目录概览 助教下发一个文件包,打开之后是这样的几个文件。 这几个文件解释如下 bomb:可执行文件,无法打开,我们主要…

拥抱企业消费新纪元,胜意科技2024代理人大会圆满落幕

因信赖相聚,为共赢而来。近日,由胜意科技主办的“做好生意,拥抱胜意——2024代理人大会”在武汉成功召开,吸引了全国各地百余家TMC生态合作伙伴齐聚一堂,共同探讨数字化浪潮下的差旅管理实践,激发增长新智慧…

突破编程_前端_SVG(使用 svg-pan-zoom 库进行平移与缩放)

1 svg-pan-zoom 概述 svg-pan-zoom 是一个轻量级、高性能且易于使用的 JavaScript 库,专为增强 SVG 图像的浏览体验而设计。它提供了平移和缩放功能,使用户能够无缝探索大型或复杂的 SVG 图形。这个库允许用户对SVG图像进行交互操作,包括缩放…

Transformer的Decoder的输入输出都是什么

目录 1 疑问:Transformer的Decoder的输入输出都是什么 2 推理时Transformer的Decoder的输入输出 2.1 推理过程中的Decoder输入输出 2.2 整体右移一位 3 训练时Decoder的输入 参考文献: 1 疑问:Transformer的Decoder的输入输出都是什么 …

【Redis 神秘大陆】009 案例实践进阶

九、案例实践&进阶方案 9.1 本地缓存组件选型 使用缓存组件时需要重点关注集群方式、集群、缓存命中率。 需要关注集群组建方式、缓存统计;还需要考虑缓存开发语言对缓存的影响,如对于JAVA开发的缓存需要考虑GC的影响;最后还要特别关注…

CubelMX点灯

工程配置 开发板led引脚图 工程io配置 配置PB5 为输出 配置 PE5 为输出 时钟配置 写测试代码 配置工程,下载运行。 参考链接 STM32入门教程-1.点灯_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1dC41147eL/?spm_id_from333.788&vd_sourcee821a225c7b…

机器人交互新纪元:讯飞星火大模型引领升级浪潮

放眼全球,大模型浪潮从前沿话题到规模落地,传统计划和商业模式正在“重构”。依托大模型的持续迭代与快速升级,从文本生成、图像生成乃至视频生成,AI不断改变工作本质,为产业发展注入“超能量”。 当众多行业还在探索大…