内部类

一.概念

当一个事物内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么将这个内部的完整结构最好使用内部类。在Java中,可以将一个类定义在另一个类或者一个方法内部,前者称为内部类,后者称为外部类,内部类也是封装的一种体现

注意:

1.定义在类名{}外部的,即使在同一个文件里,都不能称为内部类

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

二.内部类的分类

内部类可以在一个类的哪些位置进行定义呢?

public class Outclass{//成员位置定义,未被static修饰-实例内部类public class Innerclass1{}//成员位置定义,被static修饰-静态内部类static class Innerclass2{}public void method(){//方法中也可以定义内部类-局部内部类,几乎不用class Innerclass3{}}
}

根据内部类定义的位置不同,一般可分为几种形式

三.实例内部类

即未被static修饰的成员内部类

public class OutClass {private int a;static int b;int c ;public void methodA(){a=10;System.out.println(a);}public static void methodB(){System.out.println(b);}//实例内部类:未被static修饰class InnerClass{int c;public void methodInner(){//在实例内部类中可以直接访问外部类中:任意访问限定符修饰的成员a = 100;b = 200;methodA();methodB();//如果外部类和实例内部类中具有相同名称的成员时,优先访问的是内部类自己的c = 300;System.out.println(c);//输出300//如果要访问外部类同名成员时,必须:外部类名称.this.同名成员名字OutClass.this.c = 400;System.out.println(OutClass.this.c);//输出400}}public static void main(String[] args) {//外部类:对象创建以及成员访问OutClass outClass = new OutClass();System.out.println(outClass.a);System.out.println(OutClass.b);System.out.println(outClass.c);outClass.methodA();OutClass.methodB();}
}

要访问实例内部类中成员,必须要创建实例内部类的对象

而普通内部类定义与外部类成员定义位置相同,因此创建实例内部类对象时必须借助外部类

//创建实例内部类对象OutClass.InnerClass innerClass1 = new OutClass().new InnerClass();//这样写比较奇怪,也可以先将外部类对象先创建出来,然后再实例化内部类对象
//        OutClass outClass = new OutClass();OutClass.InnerClass innerClass2 = outClass.new InnerClass();innerClass2.methodInner();

四.静态内部类

被static修饰的内部成员类称为静态内部类

public class OutClass {private int a;static int b;public void methodA(){a=10;System.out.println(a);}public static void methodB(){System.out.println(b);}//静态内部类:被static修饰的成员内部类static class InnerClass{public void methodInner(){//在静态内部类中只能访问外部类的静态成员//a = 100; 编译失败a不是类成员变量b = 200;//methodA(); 编译失败,不是静态方法methodB();}}public static void main(String[] args) {//静态内部类对象创建&成员访问OutClass.InnerClass innerClass = new OutClass.InnerClass();innerClass.methodInner();}
}

不能直接在静态内部类中直接访问外部类的非静态成员,可以拿外部类对象访问

OutClass outClass = new OutClass();
System.out.println(outClass.a);

五.局部内部类

定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用较少

public class OutClass {int a;public void methodd(){int b = 10;//局部内部类:定义在方法内部//不能被public,static等访问限定符修饰class InnerClass{public void methodInnerClass(){System.out.println(a);System.out.println(b);}}//只能在方法体内部使用,其他位置不能用InnerClass innerClass = new InnerClass();innerClass.methodInnerClass();}public static void main(String[] args) {//OutClass.InnerClass innerClass = null; 编译失败}
}

编译器也有自己独立的字节码文件。命名格式:外部类名字$数字内部类名字.class

六.匿名内部类

定义:匿名内部类其实就是没有名称的内部类

说明:在调用包含有接口类型参数的方法时吗,通常为了简化代码,可以直接通过匿名内部类的形式传入一个接口类型参数,在匿名内部类中直接完成方法的实现

前提:必须是类或接口

格式:new 类名/接口名(){

                重写抽象方法

        }

public abstract class Animal {public abstract void eat();
}
public class Demo {public static void main(String[] args) {new Animal(){  //整体就等效于:是Animal父类的子类对象public void eat(){System.out.println("狗吃肉");}}}
}

此时只是创建了子类对象,没有调用方法

若要调用方法,有两种方式

public class Demo {public static void main(String[] args) {new Animal(){  //整体就等效于:是Animal父类的子类对象public void eat(){System.out.println("狗吃肉");}}.eat();}
}
public class Demo {public static void main(String[] args) {Animal a = new Animal() {public void eat(){System.out.println("狗吃肉");}};a.eat();}
}

注意:通过匿名内部类访问局部变量,此局部变量不能被修改

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

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

相关文章

将gdip-yolo集成到yolov9模型项目中(支持预训练的yolov9模型)

1、yolov9模型概述 1.1 yolov9 YOLOv9意味着实时目标检测的重大进步,引入了可编程梯度信息(PGI)和通用高效层聚合网络(GELAN)等开创性技术。该模型在效率、准确性和适应性方面取得了显著改进,在MS COCO数…

GNU Radio使用Python Block实现模块运行时间间隔获取

文章目录 前言一、timestamp_sender 模块二、timestamp_receiver 模块三、测试 前言 GNU Radio 中没有实现测量两个模块之间的时间测量模块,本文记录一下通过 python block 制作一个很简单的测时 block。 一、timestamp_sender 模块 使用 python block 做一个发送…

【python】super()函数的用法详解!

今天分享一个我在实际项目中用到过的super()函数,来说说该函数的主要功能是什么,简单来说,super()函数是用来做调用父类的一个方法。 super() 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题&#xf…

外包干了30天,技术倒退明显

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能…

【详细的Kylin使用心得】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

超级USB设备工具箱V2.0 绿色版-供大家学习研究参考

1、芯片精灵 ChipGenius V3.01 2、惠普U盘格式化工具 V2.2.0 3、MFormat V1.00中文版 4、MyDisk V2.50 5、安全移除USB磁盘(Disk Ejector) 6、U盘烧录修复工具(PortFree Production Program) V3.38 7、护U使者 V1.28 8、闪存精灵2…

【缺啥补啥】图表征学习-1

图表征学习: 学习图中的元素,如节点、边、子图或整个图的向量表征,并应用基于向量的机器学习算法进行图数据的建模和分析 动态环境: 图数据包括结构、特征、性质、任务等,随时间发生变化 开放环境: 泛指数据…

如何批量给Word文件增加前缀序号?“汇帮批量重命名”帮助你批量给word文件增加前缀序号。

批量给Word文件增加前缀序号的过程,对于经常处理大量文档的人来说,是一项既繁琐又必要的任务。首先,我们需要明确为什么要给Word文件增加前缀序号。在很多情况下,当我们需要按照一定的顺序对多个文档进行管理和归档时,…

基于STC15系列库操作LED灯

一、准备工作 1. 基于STC15系列库的工程模板 参考:51单片机工程模板的建立(基于STC15系列库)-CSDN博客 2. Keil编译器 二、程序编写 1. 新建 led.c 和 led.h 文件并存放于 user/led 文件夹下; 2. 新建 user.c 和 user.h 文件并…

如何辨别:DNS污染or DNS劫持?

DNS劫持和DNS污染的情况在互联网中并不少见,到底是出现了DNS污染还是DNS劫持。什么是DNS污染?什么是DNS劫持?我们该如何辨别DNS污染和DNS劫持? DNS劫持: DNS 劫持是指恶意攻击者通过非法手段篡改了网络中的 DNS 服务…

android 创建module

文章目的: 快速创建module并使用 创建步骤: 1 创建module 2 修改module下的build.gradle文件 3 修改清单文件中MainActivity属性,否则APP会因为有多个启动界面而崩溃 4 在主项目build.gradle引用该object Module 至此,可在APP中…

针对springcloud gateway 跨域问题解决方案

springcloud gateway版本 <spring-boot.version>2.3.3.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR8</spring-cloud.version>跨域问题说明 application:1 Access to XMLHttpRequest at https://xxxxxxxxxx from origin http://l…

Goland远程连接Linux进行项目开发

文章目录 1、Linux上安装go的环境&#xff12;、配置远程连接3、其他配置入口 跑新项目&#xff0c;有个confluent-Kafka-go的依赖在Windows上编译不通过&#xff0c;报错信息&#xff1a; undefined reference to __imp__xxx似乎是这个依赖在Windows上不支持&#xff0c;选择让…

IMX6ULL-UBOOT驱动移植

介绍 IMX6ULL正点原子开发板使用的是14x14_evk的芯片 其中14x14代表的是芯片的尺寸。 本教程的标识符以nsouther或者 NSOUTHER NSouther为主 添加板子自己的配置文件 板子的默认配置文件保存在 configs目录下&#xff0c;我们以mx6ull_14x14_evk_emmc_defconfig为主&#xf…

SOT23-6封装单键触摸感应触发芯片TC233A

前言&#xff1a; 触摸芯片很多&#xff0c;现在触摸按键已经应用到很多行业&#xff0c;虽然不能覆盖所有的按键&#xff0c;但确实用的越来越多&#xff0c;国产的价格也便宜的令人发指&#xff0c;比如这个TC233A&#xff0c;也就一毛多一点。 TC233A概述 TC233A 是一个单…

【Shell语言】linux中awk命令

linux中awk命令 看这里放声嘶吼谁也不舍得沉默 宽阔也抓不住我下一秒钟的echo ——《暂时失控》苏打绿 awk命令简介 AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&#xff0c;Peter Weinberger, 和 B…

请陪伴Kimi和GPT成长

经验的闪光汤圆 但是我想要写实的 你有吗&#xff1f; 岁数大了&#xff0c;希望如何学习新知识呢&#xff1f;又觉得自己哪些能力亟需补强呢&#xff1f; 看论文自然得用Kimi&#xff0c;主要是肝不动了&#xff0c;眼睛也顶不住了。 正好昨天跟专业人士学会了用工作流的办法跟…

Python中的Super方法实现问题及解决方案

1、问题背景 在Python中&#xff0c;super方法用于在子类中调用父类的方法。Guido van Rossum曾给出了一个纯Python实现的super方法&#xff0c;以便更好地理解其工作原理。然而&#xff0c;在这个实现中&#xff0c;存在一个问题&#xff1a;当传入的对象不是要调用的父类的实…

C++入门 (2)

文章目录 C入门C输入输出缺省参数全缺省半缺省函数声明与定义分离 函数重载C支持函数重载的原理--名字修饰 C入门 C输入输出 C输入输出包含在# include《iostream》中 cout 类似在控制台中输出&#xff0c;使用cout需要使用流插入符&#xff08;<<&#xff09; 这个符号…

Hotcoin4月16日上新热门资产:头部RWA技术提供方Centrifuge(CFG)

Hotcoin持续为全球600万用户发掘优质潜力资产&#xff0c;热门币种交易上热币。一文快速了解今日上新资产:Centrifuge(CFG) 推荐指数 8.2 交易对 CFG/USDT 交易时间 4月16日 19:00 资产赛道 RWA 项目简介 Centrifuge是一个去中心化资产融资协议&#xff0c;专注于释放现实世界资…