--内部类

目录

1. 成员内部类

2. 静态内部类

3. 局部内部类

4. 匿名内部类


 在Java中,内部类是定义在其他类内部的类。内部类有以下几种形式:成员内部类、静态内部类、局部内部类和匿名内部类。


1. 成员内部类


概念
成员内部类是定义在外部类的成员位置上的类。它与外部类之间具有一种特殊的关系,即成员内部类可以访问外部类的成员,包括私有成员。
 实现原理
在Java编译器编译成字节码时,对于成员内部类的实现原理如下:

内部类是一个独立的类文件,它的类名为"外部类$内部类"。
内部类的字节码文件中包含一个指向外部类的引用,以便访问外部类的成员。
在外部类的实例化过程中,会创建内部类的实例,并将外部类的引用传递给内部类,以建立它们之间的关联关系。

public class OuterClass {
    private int outerData = 10;

    public void outerMethod() {
        InnerClass inner = new InnerClass();
        inner.innerMethod();
    }

    // 成员内部类
    class InnerClass {
        private int innerData = 20;

        public void innerMethod() {
            System.out.println("外部类的数据:" + outerData);
            System.out.println("内部类的数据:" + innerData);
        }
    }

    public static class Main {
        public static void main(String[] args) {
            OuterClass outer = new OuterClass();
            outer.outerMethod();
        }
    }
}

2. 静态内部类


概念
静态内部类是定义在外部类中的静态类。它与外部类之间没有特殊的关系,可以看作是独立的类。静态内部类可以访问外部类的静态成员,但不能直接访问外部类的非静态成员。
实现原理
静态内部类的实现原理与成员内部类相比较简单:

静态内部类是一个独立的类文件,它的类名为"外部类$内部类"。
静态内部类中不包含对外部类的引用,因此可以直接访问外部类的静态成员。

public class OuterClass {
    private static int outerData = 10;
    private int nonStaticData = 20;

    public void outerMethod() {
        StaticInnerClass inner = new StaticInnerClass();
        inner.innerMethod();
    }

    // 静态内部类
    static class StaticInnerClass {
        private int innerData = 30;

        public void innerMethod() {
            System.out.println("外部类的静态数据:" + outerData);
            // System.out.println("外部类的非静态数据:" + nonStaticData); // 错误,无法直接访问外部类的非静态成员
            System.out.println("内部类的数据:" + innerData);
        }
    }
}

class Main {
    public static void main(String[] args) {
        OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
        inner.innerMethod();
    }
}

3. 局部内部类


 概念
局部内部类是定义在方法或代码块内部的类。它的作用域仅限于所在的方法或代码块内部,外部无法访问局部内部类。
 实现原理
局部内部类的实现原理与成员内部类和静态内部类有所不同:

局部内部类的字节码文件名由编译器生成,类似于"外部类$数字"的形式。
局部内部类的字节码文件中不包含对外部类的引用。
在外部类的实例化过程中,如果局部内部类没有被使用,则不会创建局部内部类的实例。

OuterClass {
    private int outerData = 10;

    public void outerMethod() {
        class LocalInnerClass {
            private int innerData = 20;

            public void innerMethod() {
                System.out.println("外部类的数据:" + outerData);
                System.out.println("内部类的数据:" + innerData);
            }
        }

        LocalInnerClass inner = new LocalInnerClass();
        inner.innerMethod();
    }
}

class Main {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.outerMethod();
    }
}

4. 匿名内部类


 概念
匿名内部类是一种没有名字的内部类,它没有定义在独立的类文件中,而是直接定义在方法或代码块中。匿名内部类通常用于创建一个只需要使用一次的类的实例。
实现原理
匿名内部类的实现原理是通过创建一个继承了某个类或实现了某个接口的子类来实现的。在编译时,编译器会自动生成一个类文件,并创建该类的实例。

public class OuterClass {
    public void outerMethod() {
        // 匿名内部类实现接口
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类执行");
            }
        };

        Thread thread = new Thread(runnable);
        thread.start();
    }
}

class Main {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.outerMethod();
    }
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深圳区块链交易所app系统开发,撮合交易系统开发

随着区块链技术的迅速发展和数字资产市场的蓬勃发展,区块链交易所成为了数字资产交易的核心场所之一。在这个快速发展的领域中,区块链交易所App系统的开发和撮合交易系统的建设至关重要。本文将探讨区块链交易所App系统开发及撮合交易系统的重要性&#…

【QGIS从shp文件中筛选目标区域导出为shp】

文章目录 1、写在前面2、QGIS将shp文件中目标区域输出为shp2.1、手动点选2.2、高级过滤 3、上述shp完成后,配合python的shp文件,即可凸显研究区域了 1、写在前面 利用shp文件制作研究区域mask,Matlab版本,请点击 Matlab利用shp文…

【Leetcode】单链表常见题

🔥个人主页:Quitecoder 🔥专栏:Leetcode刷题 本节内容我们来讲解常见的几道单链表的题型,文末会赋上单链表增删查,初始化等代码 目录 1.移除链表元素2.链表的中间节点3.返回倒数第K个节点:4.环…

【Java - 框架 - Lombok】(1) 普通Java项目通过Lombok+Logback完成日志的创建使用 - 快速上手

普通Java项目通过"Lombok""Logback"完成日志的创建使用 - 快速上手&#xff1b; 步骤A 说明 创建"Maven"项目&#xff1b; 图片 步骤B 说明 添加相关依赖项&#xff1b; 图片 代码 <!-- "Lombok"依赖项--> <dependency>&…

C语言--动态内存管理

为什么存在动态内存管理&#xff1f; 在之前我们讲到的类型创建的变量再空间开辟好之后就不能再改变了&#xff0c;但是有时候我们希望能够自由地为某个变量分配空间&#xff0c;就比如上一篇文章中的通讯录&#xff0c;在没有动态内存管理情况下&#xff0c;我们就只能为通讯…

18.字面量

文章目录 一、字面量二、区分技巧三、扩展&#xff1a; /t 制表符 一、字面量 在有些资料&#xff0c;会把字面量说成常量、字面值常量&#xff0c;这种叫法都不是很正确&#xff0c;最正确的叫法还是叫做&#xff1a;字面量。 作用&#xff1a;告诉程序员&#xff0c;数据在…

地物波谱库共享网站汇总

ENVI自5.2版本重新梳理了原有的标准波谱库&#xff0c;新增一些物质波谱&#xff0c;在ENVI5.6中存放在…\Harris\ENVI56\ resource\speclib&#xff0c;分别存放在四个文件夹中&#xff0c;储存为ENVI波谱库格式&#xff0c;有两个文件组成&#xff1a;.sli和.hdr。 ENVI保留…

小米还涉足了哪些领域

小米作为一家全球性的移动互联网企业&#xff0c;其业务领域相当广泛&#xff0c;除了核心的智能手机业务外&#xff0c;还涉足了许多其他领域。以下是对小米涉足领域的简要介绍&#xff1a; 智能硬件与IoT平台&#xff1a;小米是全球领先的智能硬件和IoT平台公司&#xff0c;致…

linux:线程同步

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言线程同步条件变量接口简单示例pthread_cond_wait为什么要有mutex伪唤醒问题的解决 (if->while) 总结 前言 本文作为我对于线程同步知识总结 线程同步 同步&…

资讯头条P3自媒体搭建

自媒体素材管理与文章管理 一.后台搭建 1.1 搭建自媒体网关 导入网关模块>>>在网关模块的pom.xml文件中添加该子模块>>>刷新maven <modules><module>heima-leadnews-app-gateway</module><!--新增--><module>heima-leadnew…

Aurora插件安装

介绍 Latext是一种基于TEX的排版系统。 CTeX中文套装是基于Windows下的MiKTeX系统&#xff0c;集成了编辑器WinEdt和PostScrip处理软件Ghostscript和GSview等主要工具。CTeX中文套装在MikTeX的基础上增加了对中文的完整支持。 CTeX&#xff1a; CTeX套装 - CTEX 下载安装 然后…

【Java程序设计】【C00345】基于Springboot的船舶监造管理系统(有论文)

基于Springboot的船舶监造管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及i…

Day50:WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

目录 文件包含-原理&分类&利用&修复 文件读取 文件写入 代码执行 远程利用思路 黑盒利用-VULWEB 白盒利用-CTFSHOW-伪协议玩法 78-php&http协议 79-data&http协议 80-81-日志包含 87-php://filter/write&加密编码 88-data&base64协议 …

韩顺平Java | C21网络编程

1 网络的相关概念 ip地址的组成&#xff1a;网络地址 主机地址 A类&#xff1a;0 ~ 2^7-1 0 ~ 127 B类&#xff1a;128 ~ 1282^6-1 128 ~ 191 C类&#xff1a;192 ~ 1922^5-1 192 ~ 223 D类&#xff1a;224 ~ 2242^4-1 224 ~ 239 E类&#xff1a;240 ~ 2402^3-1 240 ~ 2…

Unity PS5开发 天坑篇 之 URP管线与HDRP管线部署流程以及出包介绍04

目录 一, URP管线、HDRP管线下的Unity项目部署 1. PS5开发论坛关于Unity可支持的版本说明: 2. URP管线下的项目与部署 2.1 Build PS5 URP Project 2.2 运行画面 3. HDRP管线下的项目与部署 3.1 附上可以运行的画面: 4. PS5打包方式介绍 4.1 PC串流调试模式: Build Typ…

selenium自动化测试

selenium自动化测试 1、Javaselenium环境搭建2、测试&#xff0c;打开任意网页3、selenium 常见的Api3.1元素定位findElement3.1.1 css 选择语法3.1.2 xpath 选择语法 1、Javaselenium环境搭建 下载chromedriver&#xff0c;版本要与Chrome浏览器版本一致。 下载之后将chro…

算法打卡day25|回溯法篇05|Leetcode 491.递增子序列、46.全排列、47.全排列 II

算法题 Leetcode 491.递增子序列 题目链接:491.递增子序列 大佬视频讲解&#xff1a;递增子序列视频讲解 个人思路 和昨天的子集2有点像&#xff0c;但昨天的题是通过排序&#xff0c;再加一个标记数组来达到去重的目的。 而本题求自增子序列&#xff0c;是不能对原数组进行…

springboot检测脚本

import requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) session requests.session()# 从文本文件中读取 with open(dic.txt, r) as file:paths file.readlines()# 移除每个末尾的换行符 paths [path.strip() for path in pa…

线程创建方式、构造方法和线程属性

欢迎各位&#xff01;&#xff01;&#xff01;推荐PC端观看 文章重点&#xff1a;学会五种线程的创造方式 目录 1.开启线程的五种方式 2.线程的构造方法 3.线程的属性及获取方法 1.开启线程的五种方式 创造线程的基本两步&#xff1a;&#xff08;1&#xff09;使用run方法…

并发编程之Callable方法的详细解析(带小案例)

Callable &#xff08;第三种线程实现方式&#xff09; Callable与Runnable的区别 Callable与Runnable的区别 实现方法名称不一样 有返回值 抛出了异常 ​class Thread1 implements Runnable{Overridepublic void run() { ​} } ​ class Thread2 implements Callable<…