Java(十)——内部类

文章目录

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

内部类

Java内部类是一种特殊的类定义方式,它允许在一个类的内部定义另一个类。

内部类可以访问其所在外部类的成员变量和成员方法,这使得它非常适用于封装与外部类紧密相关的私有逻辑。

内部类是类的五大成员之一。【成员变量、成员方法、构造方法、代码块、内部类】

内部类有以下四种:

  1. 静态内部类
  2. 实例内部类
  3. 匿名内部类
  4. 局部内部类

内部类的优势:

  • 每个内部类都可以独立地继承一个接口的实现,无论外部类是否继承了接口的实现,这使多继承的方案得到进一步的完善
  • 内部类可以实现特殊的逻辑关系,并能对外隐藏
  • 内部类方便编写实现事件驱动程序
  • 内部类方便编写线程代码

内部类有一个单独的字节码文件,字节码文件格式:

在这里插入图片描述


静态内部类

Java的静态内部类是static修饰的内部类

【特点】

  1. 静态内部类实例化对象不依赖于外部类,不需要先实例化外部类对象

    格式:

    外部类.静态内部类 变量名 = new 外部类.静态内部类();

  2. 可以使用publicprotecteddefault(默认权限)private修饰静态内部类

  3. 静态内部类中不能直接访问其外部类的非静态的成员,要依赖外部类的对象进行访问

  4. 静态内部类中可以定义静态成员变量和方法

  5. 静态内部类中可以有构造方法

  6. 如果静态内部类成员与其外部类成员同名,可以使用对应的类名访问指定类中的同名成员(记得考虑成员是静态还是非静态)

如下代码:

public class OutClass {
    public String s1 = "外部类的非静态成员";
    public static String outs2 = "外部类的静态成员";
    public int i = 10;

    static class InnerClass {
        public String s1 = "静态内部类的非静态成员变量";
        public String inners2 = "静态内部类的静态成员变量";

        //静态内部类的构造方法
        public InnerClass(String s1) {
            this.s1 = s1;
        }

        public void test1() {
            System.out.println("静态内部类的非静态成员方法执行了...");

            //静态内部类中不能直接访问其外部类的非静态的成员,要依赖外部类的对象进行访问
            OutClass outClass = new OutClass();
            System.out.println(outClass.i);
        }

        public static void test2() {
            System.out.println("静态内部类的静态成员方法");
        }
    }
}

class Main {
    public static void main(String[] args) {
        //静态内部类实例化对象不依赖于外部类,不需要先实例化外部类对象
        OutClass.InnerClass innerClass = new OutClass.InnerClass("新静态内部类的非静态成员变量");
        innerClass.test1();
    }
}

在这里插入图片描述


实例内部类

在外部类类内,方法外定义的非static修饰的内部类

【特点】

  • 实例内部类依赖其外部类,实例化 实例内部类对象时,要先实例化外部类对象
  • 可以使用publicprotecteddefault(默认权限)private修饰实例内部类
  • 实例内部类中不能定义静态成员变量,除非它由final修饰
  • 实例内部类中不能定义静态方法
  • 实例内部类可以存在构造方法
  • 实例内部类可以直接访问其外部类的成员,包括privatestatic修饰的成员
  • 当实例内部类成员与其外部类成员同名时,会优先访问实例内部类自己的成员,如果想访问其外部类的同名成员,要通过下面的方式:外部类.this.成员

如下代码:

public class OutClass {
    private String s1 = "外部类的非静态成员变量";
    public static String s2 = "外部类的静态成员变量";
    public int a = 10;

    class InnerClass {
        public String s = "实例内部类的非静态成员";
        public static final String ss = "实例内部类的静态成员,必须由final修饰";
        public int a = 20;

        public InnerClass() {

        }

        public InnerClass(String s) {
            this.s = s;
        }

        public void test() {
            //同名成员默认访问实例内部类自己的
            System.out.println(a);
            //通过 父类.this.同名成员 访问外部类的同名成员a
            System.out.println(OutClass.this.a);

            //实例内部类可以访问其外部类的所有成员,包括private、static修饰的
            System.out.println(s1);
            System.out.println(s2);
        }
    }
}

class Main {
    public static void main(String[] args) {
        //实例化实例内部类对象
        //1.分两步:先实例化外部类的对象,再通过外部类对象实例化实例内部类对象
        OutClass outClass = new OutClass();
        OutClass.InnerClass innerClass1 = outClass.new InnerClass();
        
        //2.实例化完外部类对象后直接实例化实例内部类对象
        OutClass.InnerClass innerClass2 = new OutClass().new InnerClass();

        innerClass1.test();
    }
}

在这里插入图片描述


匿名内部类

匿名内部类没有类名,直接在创建对象时定义并实现,一般用于创建只需要使用一次的类对象

匿名内部类用于简化代码、增加代码的可读性和可维护性

【特点】

  • 匿名内部类中不能定义任何的静态成员
  • 由于匿名内部类没有类名,自然也不存在构造方法
  • 一个匿名内部类一定是在new后面,用来隐式地实现一个接口或继承一个类
  • 匿名内部类的类内就是花括号的范围
  • 匿名内部类可以用来给方法传参,以此实现多态
  • 可以通过匿名内部类实现的接口或匿名内部类继承的父类的引用变量接收,不过前提是花括号后面不能用.访问任何成员
//ITest.java
public interface ITest {
    void func();
}

//Animal.java
public class Animal {
    private String name;
    //...
    public void test() {
        System.out.println("Animal类中的方法...");
    }
}

//OutClass.java
public class OutClass {

    //匿名内部类可以作为方法的参数,实现多态
    public static void func(ITest iTest) {
        iTest.func();
    }

    public static void test() {
        
        //匿名内部类隐含实现接口,并直接调用自己的成员方法
        new ITest() {
            public int a = 10;
            public void innerClassTest() {
                System.out.println("匿名内部类中的成员方法...");
            }
            @Override
            public void func() {
                System.out.println("重写接口的抽象方法...");
            }
        }.innerClassTest();

        //匿名内部类隐含继承Animal类,并可以调用父类的方法,证明这里确实隐含地继承了Animal类
        new Animal() {
            public void childTest() {
                System.out.println("匿名内部类的成员方法...");
            }
        }.test();
        
        //可以通过匿名内部类实现的接口或匿名内部类继承的父类的引用变量接收,不过前提是花括号后面不能用 . 访问任何成员
        ITest iTest = new ITest() {
            @Override
            public void func() {
                System.out.println("实现接口方法...");
            }
        };
        
        Animal animal = new Animal() {
            public String name;
        };
    }
}

class Main {
    public static void main(String[] args) {
        OutClass.test();
        
        //匿名内部类作为方法参数传入,在此方法内部实现了多态
        OutClass.func(new ITest() {
            @Override
            public void func() {
                System.out.println("实现接口的方法...");
            }
        });
    }
}

在这里插入图片描述


局部内部类

定义在方法体内的类就是局部内部类,在方法外就不能使用了。

【特点】

  • 局部内部类位于方法体内,其只能在方法体内使用
  • 局部内部类中不能定义静态成员
  • 局部内部类中可以存在构造方法
  • 局部内部类可以直接访问其所在方法的局部变量以及方法所在类的成员
  • 局部内部类不能被访问修饰符publicprotectedprivate以及static修饰
public class OutClass {
    public String s1 = "局部内部类所在方法的类的非静态成员变量";
    private static String s2 = "局部内部类所在方法的类的静态私有成员变量";

    public static void innerClassFunc() {
        int a = 10;
        final int b = 20;

        class InnerClass {
            public String s1 = "局部内部类的非静态成员变量";
            //public static s2 = "局部内部类中 不能存在 静态的成员";

            public InnerClass() {

            }

            public InnerClass(String s1) {
                this.s1 = s1;
            }

            public void test() {
                System.out.println(a);
                System.out.println(b);
                System.out.println(s1);
                System.out.println(s2);
            }
        }

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

class Main {
    public static void main(String[] args) {
        OutClass.innerClassFunc();
    }
}

在这里插入图片描述


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

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

相关文章

深入理解API:数据的桥梁与门户

API(应用程序编程接口)在现代软件开发和数据处理中扮演着至关重要的角色。它不仅是数据交换的桥梁,更是不同系统、平台和应用程序之间的门户。深入理解API的功能、原理和应用,对于开发者、企业和数据科学家来说都是至关重要的。 A…

【python深度学习】——torch.einsum|torch.bmm

【python深度学习】——torch.einsum|torch.bmm 1. 基本用法与示例2. torch.bmm 1. 基本用法与示例 基本用法: torch.einsum(equation, *operands)equation: 一个字符串,定义了张量操作的模式。 使用逗号来分隔输入张量的索引,然后是一个箭头&#xff…

8259A芯片

目录 硬件结构 引脚图 引脚功能 内部结构 连接微处理器 芯片编程 相关硬件 工作流程 初始化命令字编程 操作命令字编程 相关硬件 工作方式 硬件结构 引脚图 多个芯片可通过接入IR7引脚实现级联。 引脚功能 INT引脚会接入CPU的INTR引脚(可屏蔽引脚) 1.处于非缓冲方式…

基于阿里云服务网格流量泳道的全链路流量管理(三):无侵入式的宽松模式泳道

作者:尹航 在前文《基于阿里云服务网格流量泳道的全链路流量管理(一):严格模式流量泳道》、《基于阿里云服务网格流量泳道的全链路流量管理(二):宽松模式流量泳道》中,我们介绍了流…

FastDFS分布式文件系统

一、概述 FastDFS是一款由国人余庆开发的轻量级开源分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,主要解决大容量文件存储和高并发访问问题&#xff0c…

佛教祭拜小程序-寺庙小程序-纪念馆小程序

大家好,我是程序员小孟。 现在有很多的产品或者工具都开始信息话了,寺庙或者佛教也需要小程序吗? 当然了! 前面我们还开发了很多寺庙相关的小程序,都有相关的介绍: 1,优质的寺庙小程序-H5寺庙网页 今天…

文献解读-肿瘤测序-第五期|《局部晚期或转移性儿童及青少年分化型甲状腺癌的基因特征与临床特征及131I疗效的关系》

关键词:应用遗传流行病学;群体测序;肿瘤测序; 文献简介 标题(英文):The relationship between genetic characteristics and clinical characteristics and the efficacy of 131I therapy in c…

Ktor库的高级用法:代理服务器与JSON处理

在现代网络编程中,Ktor是一个高性能且易于使用的框架,它提供了对异步编程、WebSockets、HTTP客户端和服务器等特性的原生支持。Ktor是使用Kotlin语言编写的,充分利用了Kotlin的协程特性来简化异步编程。本文将深入探讨Ktor库的高级用法&#…

Doris Connector 结合 Flink CDC 实现 MySQL 分库分表

1. 概述 在实际业务系统中为了解决单表数据量大带来的各种问题,我们通常采用分库分表的方式对库表进行拆分,以达到提高系统的吞吐量。 但是这样给后面数据分析带来了麻烦,这个时候我们通常试将业务数据库的分库分表同步到数据仓库时&#x…

如何让委外加工管理更轻松?

中小制造企业,受制于场地、资金、环保、质量、交期等等因素影响,在生产制造过程中,多数会将一些生产工序或者在制品外发给其他制造工厂进行委外加工生产。随着各地监管部门对环境、能耗管控力度的加大,这种情况在机加工行业尤为突…

【笔记】基于差分法的白噪声道路模型

理论如下: 式(13-7)中等式左边的路面位移随时间的导数可用差分法近似,即 整理可得 代码如下: C级路面 clc clear close all%% 参数定义 dt=0.01;%仿真间隔时间 t_end=10;%仿真总时长 t=0:dt:t_end; n00=0.011;%下截止频率 u=60;%车速,km/h u=u/3.6;%车速转化为m/s f0=2* …

SmartEDA:革新电子教学,引领未来工程师的启航之旅

在数字化浪潮席卷而来的今天,电子教学已成为教育领域的一股强劲风潮。SmartEDA,作为一款前沿的电子教学辅助工具,正以其独特的魅力,助力学校电子教学的蓬勃发展,打造未来工程师的摇篮。 SmartEDA凭借其智能化的特点&a…

运行软件缺失vcruntime140.dll怎么办?vcruntime140.dll缺失的详细解决方法分享

vcruntime140.dll 是一个动态链接库文件,它是 Microsoft Visual C Redistributable Package 的一部分,为使用 Visual C 编译器开发的应用程序提供必要的运行时环境。该文件包含了大量应用程序运行时需要调用的库函数,这些函数是实现 C 标准库…

1.计算机系统概述

1.计算机系统概述 1.1计算机系统层次结构 第1级是微程序机器层 第2级是传统机器语言层 第3级是操作系统层:向上提供广义指令 第4级是汇编语言层 第5级是高级语言层 1、2层是硬件,3-5层是软件。 没有配备软件的纯硬件系统称为裸机,第3-5…

AWVS+BP+XRAY三层联动扫描漏洞

1. 前言 本报告详细记录了使用AWVS(Acunetix Web Vulnerability Scanner)、Burp Suite和Xray进行的漏洞扫描结果。旨在帮助开发团队识别和修复系统中的安全漏洞,提升整体安全性。 2. 扫描工具简介 AWVS(Acunetix Web Vulnerabi…

Spring家族中的消息通信解决方案

相信大家对消息通信架构以及各种消息中间件应该都不陌生。在分布式系统的设计和开发过程中,消息通信是用于实现系统解耦、提高扩展性的一大技术体系。而业界关于如何实现消息通信系统也有很多解决方案和对应的开发框架。不知道你有没有发现,在我们每天都…

小米路由器如何设置去广告功能,如何设置小米路由器的自定义Hosts(小米路由器如何去除小米广告、去除小米电视盒子开屏广告、视频广告)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现方案 📒📝 操作步骤📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 小米设备的广告一直是用户头疼的问题,无论是开屏广告、应用内广告还是系统广告,都影响了用户体验。本文将详细介绍如何通过小米路由器实现去除广告…

升级你的提问技巧:ChatGPT-4o时代,如何让对话更智能?

最近,我一直在尝试使用升级版的ChatGPT,也就是GPT-4o,它带来了许多令人兴奋的新功能。要充分利用这个新工具,我们得在提问方式上做些小小的调整。下面,我会从简单到复杂,一一介绍这些调整。 提高提示词的具…

日、周、月度累计发电量、上网电量数据统计平台开发实施案例

一、项目背景及需求 项目需求方为江苏国信集团关联单位:华靖光伏、新能昊扬,项目地点在江苏泰州、江苏扬州,对应分布式光伏发电数采项目。 项目背景:光伏发电并网项目发电量数据采集与开发统计。 需求:对光伏电表数…

STC8增强型单片机进阶开发--OLED显示器(SPI)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…