【Java】-- 内部类

文章目录

  • 1. 静态内部类(重要)
  • 2. 实例内部类(重要)
  • 3. 局部内部类(很少用)
  • 4. 匿名内部类(使用较多)
    • 4.1 第一种写法(类)
    • 4.1 第二种写法(接口)

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

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

1. 静态内部类(重要)

OuterClass类:

public class OuterClass {//被不同修饰符所修饰的成员变量public int data1 = 1;private int data2 = 2;public static int data3 = 3;//定义一个静态内部类:定义在类的里面,方法的外面static class InnerClass{public int data4 = 4;public void test(){System.out.println("静态内部类test().....");
//            System.out.println(data1);//报错
//            System.out.println(data2);//报错//原因:这个内部类是静态的,静态的不依赖于对象,而data1 和 data2 是依赖于对象的//要想调用data1和data2 只能实例化一个外部类对象,通过对象的引用来调用.OuterClass outerClass = new OuterClass();System.out.println(outerClass.data1);System.out.println(outerClass.data2);System.out.println(data3);System.out.println(data4);}}
}

Test类:

public class Test {public static void main(String[] args) {//如何去实例化一个静态内部类对象
//        InnerClass innerClass = new InnerClass();//错误的实例化//将静态内部类当作外部类中的一个静态成员去实例化OuterClass.InnerClass inner = new OuterClass.InnerClass();inner.test();}
}
输出结果:静态内部类test().....

问:什么时候需要设计一个内部类呢?
答:外部类是由另外一个完整的对象组成的时候。比如要定义一辆火车,火车的组成是一个一个的车厢,这个车厢属于一个完整的对象,所以可以把车厢设计成火车类中的内部类。

2. 实例内部类(重要)

OuterClass类:

public class OuterClass {public int data1 = 1;private int data2 = 2;public static int data3 = 3;//定义一个实例内部类class InnerClass{public int data1 = 11111;//如果实例内部类有一个data1,外部类也有一个data1,// 那么此时输出data1的话就会输出实力内部类自己的data1public int data4 = 4;public static int data5 = 5;public void test(){System.out.println("实例内部类test().....");//访问内部类data1System.out.println(data1);//输出内部类的data1: 11111System.out.println(this.data1);//输出内部类的data1: 11111(这个this指代的是谁,就看是谁调用的test)//访问外部类data1OuterClass outerClass = new OuterClass();System.out.println(outerClass.data1);//输出1System.out.println(OuterClass.this.data1);//输出1//OuterClass.this 拿到的就是外部类的this; 通过外部类的this来访问data1System.out.println(data2);System.out.println(data3);System.out.println(data4);System.out.println(data5);}}
}

Test类:

public class Test {public static void main(String[] args) {//如何实例化一个实例内部类对象// 实例内部类是依赖于对象的,要想访问到实例内部类就必须需要通过对象去访问OuterClass out = new OuterClass();OuterClass.InnerClass innerClass = out.new InnerClass();innerClass.test();//上面的实例化方法等同于下面的实例化方法OuterClass.InnerClass innerClass1 = new OuterClass().new InnerClass();innerClass1.test();}
}

输出结果:

实例内部类test().....
11111
11111
1
1
2
3
4
5
实例内部类test().....
11111
11111
1
1
2
3
4
5

实例内部类的对象如果想被获取,必须要有一个外部类对象。

如果想在实力内部类的方法里面去访问外部类的成员,此时,在实力内部类的方法里面是包含了外部类this的,而外部类的this需要外部类类名.this 来拿到。

3. 局部内部类(很少用)

public class Test {public void func(){//定义一个局部内部类:定义在方法的里面,且局部内部类只能在当前方法内使用class InnerClass{//这里的前面不能使用访问修饰限定符public int a = 1;private int b = 2;public void method(){System.out.println("局部内部类的method方法....");}}InnerClass innerClass = new InnerClass();innerClass.method();}public void func2(){//错误的局部内部类的使用方法
//        InnerClass innerClass = new InnerClass();
//        innerClass.method();}}
  1. 局部内部类只能在所定义的方法体内部使用
  2. 不能被public、static等修饰符修饰
  3. 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
  4. 几乎不会使用

4. 匿名内部类(使用较多)


4.1 第一种写法(类)

Student类:

public class Student {public void test() {System.out.println("Student类的test方法....");}
}

Test类:

public class Test {public static void func(){//匿名内部类:相当于继承了Student类new Student(){@Overridepublic void test() {System.out.println("func方法中的匿名内部重写的test方法.....");}public void test2(){System.out.println("func方法中的匿名内部类自己特有的test2方法.....");}//如何调用重写的test方法}.test();}public static void func1(){//匿名内部类:相当于继承了Student类new Student(){@Overridepublic void test() {System.out.println("func1方法中的匿名内部重写的test方法.....");}public void test2(){System.out.println("func2方法中的匿名内部类自己特有的test2方法.....");}//如何调用匿名内部类自己特有的test2方法}.test2();}public static void func2(){Student student = new Student(){@Overridepublic void test() {System.out.println("func2方法中的匿名内部类重写的test方法.....");}public void test2(){System.out.println("func2方法中的匿名内部类自己特有的test2方法.....");}};//访问重写的test方法student.test();//student.test2();//错误的代码//原因:student这个引用的的类型是Student类,// 此时Student就相当于这个匿名内部类的子类,使用父类类型的引用不能访问子类特有的成员。}public static void main(String[] args) {func();System.out.println("========================================");func1();System.out.println("========================================");func2();//此时,会触发func func1和func2 方法中的匿名内部类,同时会调用响应的代码}
}

输出结果:

func方法中的匿名内部重写的test方法.....
func1方法中的匿名内部类重写的test方法.....

4.1 第二种写法(接口)

IA接口:

public interface IA {void testA();
}

Test类:

public class Test {public static void func(){new IA(){@Overridepublic void testA() {System.out.println("func方法中的匿名内部类重写的testA方法.....");}//调用重写的testA方法}.testA();}public static void func1(){new IA(){@Overridepublic void testA() {System.out.println("func1方法中的匿名内部类重写的testA方法.....");}public void testA2(){System.out.println("func1中的匿名内部类IA自己的testA2方法.....");}//调用func1方法中匿名内部类自己特有的的testA2方法}.testA2();}public static void func2(){IA ia = new IA() {@Overridepublic void testA() {System.out.println("func2方法中的匿名内部类重写的testA方法.....");}public void testA2(){System.out.println("func2方法中的匿名内部类自己的testA2方法.....");}};ia.testA();//ia.testA2();//错误的调用//原因:ia引用的类型是IA接口,而testA2是子类特有=的方法,//    IA接口中定义的只有一个testA方法,所以只能使用ia引用调用testA方法}public static void main(String[] args) {func();System.out.println("==========================================");func1();System.out.println("==========================================");func2();}
}

输出结果:

func方法中的匿名内部类重写的testA方法.....
==========================================
func1中的匿名内部类IA自己的testA2方法.....
==========================================
func2方法中的匿名内部类重写的testA方法.....

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

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

相关文章

【C语言学习笔记】

C语言发展史: 1960 原型A语言->ALGOL语言 1963 CPL语言1967 BCPL1970 B语言1973 C语言 C语言特点: 基础性语言语法简洁 紧凑 方便 灵活(得益于指针)运算符 数据结构丰富结构化 模块化编程移植性好 执行效率…

STL学习-无序容器-unordered set和unorderde multiset

1.定义及初始化 #include <unordered set> #include <iostream> using namespace std; //输出s中的所有元素 template<typename T> void Show(const T& s) { for(auto&x:s) cout << x<<" ";cout << endl; } int main()…

docker-高级(待补图)

文章目录 数据卷(Volume)介绍查看方法删除方法绑定方法匿名绑定具名绑定Bind Mount 数据卷管理 网络bridge(桥接模式 默认)HOST(主机模式)Nonecontainer(指定一个容器进行关联网络共享)自定义(推荐)docker network 命令创建网络docker network create 实例展示-自定义实例展示-…

玩转Docker | Docker基础入门与常用命令指南

玩转Docker | Docker基础入门与常用命令指南 引言基本概念help帮助信息常用命令管理镜像运行容器构建镜像其他Docker命令整理结语引言 Docker 是一种开源的应用容器引擎,它允许开发者将应用程序及其依赖打包进一个可移植的容器中,然后发布到任何流行的 Linux 机器上。这大大简…

基于SSM医药进出口交易系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;商品信息管理&#xff0c;仓储部门管理&#xff0c;供应部门管理&#xff0c;业务部门管理&#xff0c;客户管理&#xff0c;财务部管理 业务部门账号功能包括&#xff1a;系统首页&#xff0c;个人中…

2024年大湾区杯粤港澳金融数学建模赛题浅析——助攻快速选题

一图流 赛题难度 A:B2:1 选题人数 A:B2:3 A题&#xff1a;证券市场投资风险控制模型设计 问题简述 随着金融市场的发展&#xff0c;系统性风险的管理变得越来越重要。本题要求通过量化方法测度和监测系统性风险&#xff0c;设计风险计量指标&#xff0c;并基于这些指标构建预…

胡壮麟《语言学教程》第五版PDF英文版+中文版翻译

胡壮麟《语言学教程》中文版&#xff1a;https://pan.quark.cn/s/9491130ec572 《语言学教程》&#xff08;英文版&#xff09;是一部经典的语言学教材&#xff0c;自 1988 年面世以来&#xff0c;被众多高校广泛采用&#xff0c;长销不衰。该教材自出版以来不断修订&#xff…

在浏览器和Node.js环境中使用Puppeteer的Rollup与Webpack打包指南

Puppeteer是一个Node.js库&#xff0c;它提供了一套高级API来通过DevTools协议控制Chrome或Chromium。虽然Puppeteer通常在服务器端使用&#xff0c;但有时你可能需要在浏览器环境中使用它的某些功能。本文将介绍如何使用Rollup和Webpack来打包包含Puppeteer或其轻量级版本Pupp…

C# 如何处理 WebSocket 连接异常

在 C# 中使用 WebSocket 进行通信时&#xff0c;处理连接异常是确保应用程序稳定性和可靠性的重要环节。本文将详细介绍如何在 C# 中有效地处理 WebSocket 连接异常&#xff0c;并附带代码示例进行拆分讲解。 一、理解 WebSocket 连接异常 WebSocket 连接可能会由于多种原因出现…

基于Pycharm和Django模型技术的数据迁移

1.配置数据库 在trip_server/settings.py中修改配置&#xff1a; 其格式可访问官网&#xff1a;Settings | Django documentation | Django 1.1 配置数据库 文件地址&#xff1a;trip_server/settings.py 配置前需要创建&#xff08;NaviCat&#xff09;个人数据库 "…

java访问华为网管软件iMaster NCE的北向接口

最近做的一个项目&#xff0c;需要读取华为一个叫iMaster NCE的网管软件的北向接口。这个iMaster NCE&#xff08;以下简称NCE&#xff09;用于管理项目的整个网络&#xff0c;尤其是光网络。业主要求我们访问该软件提供的对外接口&#xff0c;读取一些网络信息&#xff0c;比如…

创造tips的秘籍——PHP回调后门

0x00 前言 php中包含回调函数参数的函数&#xff0c;具有做后门的潜质。 我就自己给这类webshell起了个名字&#xff1a;回调后门。 0x01 回调后门的老祖宗 php中call_user_func是执行回调函数的标准方法&#xff0c;这也是一个比较老的后门了&#xff1a; call_user_func…

InstructIR: High-Quality Image Restoration Following Human Instructions 论文阅读笔记

这是Radu大佬所在的Wrzburg大学的computer vision lab实验室发表在ECCV2024上的一篇论文&#xff0c;代码开源。文章提出了一种文本引导的All-in-One的restoration模型&#xff0c;如下图所示&#xff1a; 这个工作其实跟"InstructPix2Pix: Learning to Follow Image Edit…

【实用教程】.NET C# PDF 生成技术:哪种方法适合您的项目?

概述&#xff1a;本文介绍了 TX Text Control 真正的 WYSIWYG&#xff08;所见即所得&#xff09;模板系统所带来的独特优势&#xff0c;与传统的 PDF 生成系统&#xff08;如 HTML 到 PDF 转换器或需要自定义编程的 PDF 库&#xff09;相比&#xff0c;模板是可视化设计的&…

Chromium HTML5 新的 Input 类型email对应c++

一、Input 类型: email email 类型用于应该包含 e-mail 地址的输入域。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body><form action"demo-form.php"…

notepad++ compare插件的离线下载和安装

一、离线安装 去改地址找到最新的插件&#xff1a;https://github.com/notepad-plus-plus/nppPluginList/blob/master/doc/plugin_list_x64.md下载之后复制到插件文件夹&#xff0c;插件文件夹的打开方式如下 注意目录&#xff1a; 二、问题汇总 &#xff08;1&#xff09…

echarts地图,柱状图,折线图实战

1.地图 <template><div style"height: 100%;" class"cantainerBox"><div class"top"><div class"leftTop"><span class"firstSpan">推广进度</span><div>省份选择&#xff1a;&l…

this关键字详解

文章目录 this使用示例执行原理线程安全 this 在Java中&#xff0c;this是一个特殊的引用&#xff0c;指向当前对象的实例。JVM会给每个对象分配一个this&#xff0c;来代表当前对象&#xff0c;换句话说&#xff0c;this是一个特殊的变量&#xff0c;它保存了当前对象的内存地…

Kafka物理存储机制深度解析

Kafka物理存储机制深度解析 Apache Kafka&#xff0c;作为一个分布式流处理平台&#xff0c;其物理存储机制是确保数据高效、可靠存储和处理的关键。Kafka通过一系列精心设计的存储结构和策略&#xff0c;实现了对海量数据的快速读写、持久化存储以及高效的删除和管理。以下是…

HTB:Cicada[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机进行开放端口扫描 使用nmap对靶机开放端口进行脚本、服务信息扫描 首先尝试空密码连接靶机SMB服务 由于不知道账户名&#xff0c;这里我们使用crackmapexec对smb服务进行用户爆破 通过该账户连接至靶机SMB服务器提取敏感信…