【Java】内部类

目录

概念:

内部类访问特点

示例代码:

运行结果:

内部类分类

1. 成员内部类

示例代码:

2. 静态内部类

示例代码:

 3. 方法内部类(局部内部类)

示例代码:

4. 匿名内部类

示例代码:


概念:

就是在一个类中定义一个类,就是为内部类。

比如:在一个类A的内部定义一个类B,类B就被称为内部类,类A相应的称为外部类

内部类定义格式:

内部类访问特点

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象

示例代码:

MayiktA.java

package com.面向对象.Demo33;public class MayiktA { //外部类private int age = 10;public int code = 20;/*** 在类中定义的类——内部类*/public class MayiktB { //内部类public void mayiktB() {// 在内部类中是可以直接访问到 外部类中 成员属性 包括(私有)System.out.println("内部类MayiktB-mayiktB()");System.out.println(age);System.out.println(code);}}// 在外部类中 想使用到内部类,则需要new 内部类 再通过内部类对象引用.内部类方法public void mayiktA() {MayiktB mayiktB = new MayiktB();mayiktB.mayiktB();}
}

Test01.java

package com.面向对象.Demo33;public class Test01 {public static void main(String[] args) {MayiktA mayiktA = new MayiktA();mayiktA.mayiktA();}
}

运行结果:


内部类分类

成员内部类与局部内部类区别:

  • 如果类定义在方法里面,该类就是为方法内部类或者局部内部类
  • 如果类定义在方法外面,该类就是为成员内部类,如果加上了static 静态修饰 则该类是为静态内部类 

1. 成员内部类

按照内部类在类中的定义的位置不同,可以分为如下两种格式:

  • 成员内部类(静态内部类,成员内部类)
  • 局部内部类(方法内部类,匿名内部类)

成员内部类,外界如何创建对象使用呢?

格式:外部类名.内部类名 对象名 = 外部对象.内部对象;

范例:MayiktA.MayiktB mayiktB = new MayiktA().new MayiktB();

在实际开发中是不会这样使用的。

因为一般内部类就是不让外界直接访问的。

成员内部类的常见修饰符 private 为了保证数据的安全性 

示例代码:

MayiktA.java

package com.面向对象.Demo34;public class MayiktA { //外部类/*** 在方法外定义的 内部类 ————成员内部类*///privatepublic class MayiktB { //内部类——成员内部类public void mayiktB() {System.out.println("内部类MayiktB——成员内部类-mayiktB()");}}public void mayiktA() {MayiktB mayiktB = new MayiktB();mayiktB.mayiktB();}
}

Test01.java

package com.面向对象.Demo34;public class Test01 {public static void main(String[] args) {/*** 在外界如何访问到该类 内部类?* 格式: 外部类.内部类 name=new 外部类().new 内部类();*/MayiktA.MayiktB mayiktB = new MayiktA().new MayiktB();mayiktB.mayiktB(); // 内部类MayiktB——成员内部类-mayiktB()}/*** 企业实际开发中* 外界不能直接 访问内部类* 通过私有private 形式 让外界 无法访问 内部类* 但是 在该外部类里是可以通过 new 内部类*/
}

2. 静态内部类

有 static 关键字修饰的内部类为静态内部类;

静态内部类访问外部类的静态成员变量或方法必须是静态的。

访问格式:new MayiktA.MayiktB()

示例代码:

MayiktA.java

package com.面向对象.Demo35;public class MayiktA {private static int code = 20;public static void show() {System.out.println("static内部类访问外部类中的方法,必须是static");}public static class MayiktB {public void mayiktB() {show();System.out.println(code);//内部类访问外部类的属性 该属性也必须是staticSystem.out.println("static内部类MayiktB-mayiktB()");}}/*** 在内部类的外部类中 静态方法 如果访问 内部类* 则 该内部类必须是static 静态访问*/public static void main(String[] args) {MayiktB mauiktB = new MayiktB();}
}

Test01.java

package com.面向对象.Demo35;public class Test01 {public static void main(String[] args) {//外界如果访问 static内部类 ==> new 外部类.内部类MayiktA.MayiktB mayiktB = new MayiktA.MayiktB();mayiktB.mayiktB(); //static内部类MayiktB-mayiktB()}
}

 3. 方法内部类(局部内部类)

局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用

该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

示例代码:

MayiktA.java

package com.面向对象.Demo36;public class MayiktA {private int age = 20;private int code = 30;/*** 在方法里面定义的内部类 就是为 局部内部类(方法内部类)*/public void mayikt() {int num = 10;class MayiktB { //局部内部类(方法内部类)public void mayiktB() {System.out.println("局部内部类MayiktB-mayiktB()");System.out.println("局部内部类是可以直接访问外部类的成员");System.out.println(age);System.out.println(code);show();System.out.println("也可以访问方法内的局部变量");System.out.println(num);}}MayiktB mayiktB = new MayiktB();mayiktB.mayiktB();}/*** 局部内部类MayiktB 只能在该方法mayikt()里面访问,不能在外界(方法外面)访问*/
//    public void show(){
//        MayiktB mayiktB = new MayiktB(); 局部内部类不能在外界(方法外面)访问
//        mayiktB.mayiktB();
//    }public void show() {}
}

Test01.java

package com.面向对象.Demo36;public class Test01 {public static void main(String[] args) {MayiktA mayiktA = new MayiktA();mayiktA.mayikt();}
}

4. 匿名内部类

可以 new 出接口(实现类) 或者 抽象类(子类)

示例代码:

MayiktB.java

package com.面向对象.Demo37;public interface MayiktB {/*** 抽象方法*/void mayiktB();
}

MayiktC.java

package com.面向对象.Demo37;public abstract class MayiktC {public abstract void mayiktC();
}

Test01.java

package com.面向对象.Demo37;public class Test01 {public static void main(String[] args) {// 匿名内部类/*** 匿名内部类* 这里的接口为什么可以实例化?* 请看下篇博客*/MayiktB mayiktB = new MayiktB() {//重写了 接口中的方法@Overridepublic void mayiktB() {System.out.println("匿名内部类-mayiktB()");}};mayiktB.mayiktB(); //匿名内部类-mayiktB()/*** 使用匿名内部类 就不需要创建 实现类和子类* 直接通过 new 内部类的形式 简化不需要创建 实现类和子类*///        new MayiktC(); //报错,抽象类是不可以直接new出来,可以使用下面的匿名内部类形式//底层实际上是创建 子类的MayiktC mayiktC = new MayiktC() {@Overridepublic void mayiktC() {System.out.println("匿名内部类-mayiktC()");}};mayiktC.mayiktC();}
}

下一篇文章:匿名内部类开发使用场景

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

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

相关文章

【开发篇】十七、消息:模拟订单短信通知

文章目录 1、消息2、JMS3、AMQP4、案例:模拟订单短信通知 相关文章: 【同步通讯与异步通讯】 1、消息 消息的发送方,即生产者。消息的接收方,即消费者。同步通信就行打视频,等着对方接电话才能继续往下,而…

文件编码格式

一、问题场景 笔者在写controller层出现了一些小问题:测试controller层的一些请求的时候,后端控制台打印的是乱码,网上找了很多说改UTF-8的,但是我去设置里面全部都改为UTF-8了,结果仍然无济于事,甚至还把…

泊车功能专题介绍 ———— AVP系统基础数据交互内容

文章目录 系统架构系统功能描述云端子系统车辆子系统场端子系统用户APP 工作流程基础数据交互内容AVP 系统基础数据交互服务车/用户 - 云基础数据交互内容车位查询工作流程技术要求数据交互要求 车位预约工作流程技术要求数据交互要求 取消预约工作流程技术要求数据交互要求 泊…

2023最新ICP备案查询系统源码 附教程 Thinkphp框架

2023最新ICP备案查询系统源码 附教程 thinkphp框架 本系统支持网址备案,小程序备案,APP备案查询,快应用备案查询 优势: 响应速度快,没有延迟,没有缓存,数据与官方同步 源码下载:ht…

关于MAC电脑无法正常登陆H3C iNodes登陆的解决办法

背景 前段时间,单位的网络在做升级改造,网络出口也进行彻底调整同时单位的网络出口设备做了机房物理迁移,迁移后网络正常使用,但是出现自己的MAC电脑无法登陆iNodes问题,总是出现“正在查询SSL 网关参数..查询SSL 网关…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 2 - 改善深层神经网络 - 第二周测验

课程2_第2周_测验题 目录:目录 第一题 1.当输入从第8个mini-batch的第7个的例子的时候,你会用哪种符号表示第3层的激活? A. 【  】 a [ 3 ] { 8 } ( 7 ) a^{[3]\{8\}(7)} a[3]{8}(7) B. 【  】 a [ 8 ] { 7 } ( 3 ) a^{[8]\{7\}(3)} a…

无状态自动配置 DHCPv6无状态配置 DHCPv6有状态配置

1、无状态自动配置 配置命令 AR1 ipv6 #开启路由器ipv6报文转发功能 interface GigabitEthernet0/0/0 ipv6 enable #开启路由器接口IPv6报文转发功能 ipv6 address FC01::1/64 …

怎么将Linux上的文件上传到github上

文章目录 1. 先在window浏览器中创建一个存储项目的仓库2. 复制你的ssh下的地址1) 生成ssh密钥 : 在Linux虚拟机的终端中,运行以下命令生成ssh密钥2)将ssh密钥添加到github账号 : 运行以下命令来获取公钥内容: 3. 克隆GitHub存储库:在Linux虚拟机的终端中&#xff0…

Springboot实现登录功能(token、redis、登录拦截器、全局异常处理)

登录流程: 1、前端调用登录接口,往接口里传入账号,密码 2、根据账号判断是否有这个用户,如果有则继续判断密码是否正确 3、验证成功后,则是根据账号,登录时间生成token(用JWT) 4、将…

数据结构与算法(四):哈希表

参考引用 Hello 算法 Github:hello-algo 1. 哈希表 1.1 哈希表概述 哈希表(hash table),又称散列表,其通过建立键 key 与值 value 之间的映射,实现高效的元素查询 具体而言,向哈希表输入一个键…

VR开发(一)——SteamVR实现摇杆移动

一、基础环境搭建 1.AssetStore 找到SteamVR并导入; 2.添加一个 VR 中代表玩家自己的物体。我可以打开 Assets/SteamVR/InteractionSystem/Core 文件夹,将 Player 物体拖入场景: 二、修改手柄按钮映射集 3.windows/steamVR input&#xff…

Http常见问题

说说 HTTP 常用的状态码及其含义? HTTP 状态码首先应该知道个大概的分类: 1XX:信息性状态码2XX:成功状态码3XX:重定向状态码4XX:客户端错误状态码5XX:服务端错误状态码 301:永久性…

C#,数值计算——数据建模FGauss的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class FGauss : MultiFuncd { public void funk(double x, double[] a, ref double y, double[] dyda) { int na a.Length; y 0.0; for (int …

卷积网络的发展历史-LeNet

简介 LeNet是CNN结构的开山鼻祖,第一次定义了卷积神经网络的结构。 LeNet模型包含了多个卷积层和池化层,以及最后的全连接层用于分类。其中,每个卷积层都包含了一个卷积操作和一个非线性激活函数,用于提取输入图像的特征。池化层…

TCP端口崩溃,msg:socket(): Too many open files

一、现象 linux系统中运行了一个TCP服务器,该服务器监听的TCP端口为10000。但是长时间运行时发现该端口会崩溃,TCP客户端连接该端口会失败: 可以看到进行三次握手时,TCP客户端向该TCP服务器的10000端口发送了SYN报文,…

驱动器类产品的接口EMC拓扑方案

驱动器类产品的接口EMC拓扑方案 1. 概述 本文以高压伺服驱动器和变频器类产品为例,对常用端口滤波拓扑方案进行总结,后续根据不同的应用场景可进行适当删减,希望对大家有帮助。 2. 驱动器验证等级 本文推荐拓扑的实验结果,满足…

jar 命令启动java 指定配置文件路径 jar如何启动

一、各种启动方式 1.java -jar # 例子 java -jar test.jar 1. 2. 这是最简单的启动方式,同时弊端也是很多的。 弊端1:exit 退出终端会导致java进程中断。 弊端2:ctrlc 退出启动展示页会导致java进程中断。 弊端3:直接关闭终端会…

IDEA添加Vue文件模板

代码模板&#xff1a; <!-- *${COMPONENT_NAME} *author niemengshi *date ${DATE} ${TIME} --> <template> #[[$END$]]# </template> <script> export default { name: "${COMPONENT_NAME}", props: { }, components: {}, mounted: {}, d…

mysql-执行计划

1. 执行计划表概述 id相同表示加载表的顺序是从上到下。 id不同id值越大&#xff0c;优先级越高&#xff0c;越先被执行。id有相同&#xff0c;也有不同&#xff0c;同时存在。 id相同的可以认为是一组&#xff0c;从上往下顺序执行&#xff1b;在所有的组中&#xff0c;id的值…

洛谷刷题:数组

好累&#xff0c;学习令我快乐 一、小鱼比可爱 题目链接&#xff1a;https://www.luogu.com.cn/problem/P1428 题目描述 人比人&#xff0c;气死人&#xff1b;鱼比鱼&#xff0c;难死鱼。小鱼最近参加了一个“比可爱”比赛&#xff0c;比的是每只鱼的可爱程度。参赛的鱼被从…