五大元素之一,累不累——Java内部类
目录
简略版:
详解版:
使用场景:
内部类的优点:
内部类的分类:
一. 成员内部类
1.创建对象
2.访问方法
3. 外部类名.this.
二. 静态内部类
1. 创建对象
2. 访问特点
三. 局部内部类
四. 匿名内部类
1. 格式:
2. 作用:
3. 本质:
4. 使用场景
简略版:
1.简述:ava的类中有五大组成部分,分别是:成员变量,成员方法,构造函数(构造器),代码块,内部类;大多数情况下,类与类之间在位置上是平行的,独立的,而内部类是在一个类中添加另一个类,相当于类的“嵌套”。
2.使用场景:一个类中包含另一个事物,该事物也有自己的方法和属性,我们就可以将它定义为内部类;
3.优点:隐藏程序的细节和内部结构,提高程序的封装性;使结构看起来更加优美且合理;
4.分类:根据内部类的位置,我们分为静态内部类,成员内部类,局部内部类,匿名内部类;
详解版:
java的类中有五大组成部分,分别是:成员变量,成员方法,构造函数(构造器),代码块,内部类;
今天就讲讲内部类。大多数情况下,类与类之间在位置上是平行的,独立的,而内部类是在一个类中添加另一个类,相当于类的“嵌套”。
使用场景:
一个类中包含另一个事物,该事物也有自己的方法和属性,我们就可以将它定义为内部类;
如下代码所以,定义了一个汽车类,“嵌套”了一个引擎类,该类也有自己的的方法和属性;
class Motor{//汽车类class Engine{//发动机类String size;//发动机型号public void spin(){//发动机的行为/作用System.out.println("转速很快的");}}
}
而这种内部类的创建,就没有任何意义,因为Weight类没有自己的方法和行为 ;
class Animal{//定义一个动物类class Weight{//“嵌套”一个重量类}
}
内部类的优点:
隐藏程序的细节和内部结构,提高程序的封装性;使结构看起来更加优美且合理;
内部类的分类:
根据内部类的位置,我们分为静态内部类,成员内部类,局部内部类,匿名内部类;
一般类该有的,内部类也都有,比如成员变量,成员方法,构造器等。
下面的代码可以辅助理解;
class A{int b=10;//成员变量class B{};//成员内部类,与成员变量统一等级static int c=10;//静态变量static class C{};//静态内部类void method(){int d=7;//局部变量class D{};//局部内部类}
}
内部类与成员变量,成员方法同等级:
对于非静态内部类,其作用与成员变量,成员方法相同;由于是非静态的,所以需要使用类的对象才能调用,所以创建内部类的对象不同于创建普通类的;
public class OuterClass {//成员变量String name;//成员方法public void play(){System.out.println("这是外部类的方法");}//内部累;与成员变量,成员方法同等级class InnerClass{int age;public void eat(){System.out.println("这是内部类的方法");}}public static void main(String[] args) {OuterClass o=new OuterClass();o.play();OuterClass.InnerClass i=o.new InnerClass();i.eat();}
}
这是外部类的方法
这是内部类的方法进程已结束,退出代码0
见名知意,通过类的名字我们知道,不同的类所处范围不同,作用范围不同,这就是不同内部类的本质区别;
一. 成员内部类
与类的成员变量,成员方法所处等级相同,且在使用时,与类的成员变量,成员方法使用也相同,需要先创建类的对象,再进行调用;
1.创建对象
外部类名.内部类名 对象名 = new 外部类名(). new 内部类名();
Outer1.Inner i=new Outer1().new Inner();//内部类对象的创建
2.访问方法
内部类实例方法直接使用其外部类实例/静态成员,实例成员即 无static 修饰的方法或属性,静态成员即 static 修饰的方法或成员;
void inner(){//这是内部类的无实例方法int a=10;//内部类局部方法System.out.println(a);System.out.println(this.a);//内部类成员变量System.out.println(Outer1.this.a);//外部类成员变量,外部类名 点 this 点 变量名}
3. 外部类名.this.
System.out.println(Outer1.this.a);//外部类成员变量,外部类名 点 this 点 变量名
下面的代码将给予说明:
public class Outer1 {int a=100;void outer(){System.out.println("这是方法!");}class Inner{int a=50;void inner(){int a=10;System.out.println(a);System.out.println(this.a);System.out.println(Outer1.this.a);//直接使用外部类成员变量}public static void main(String[] args) {Outer1.Inner i=new Outer1().new Inner();//内部类对象的创建i.inner();}}
}
二. 静态内部类
在成员内部类的基础上,被关键字static修饰;
1. 创建对象
外部类名.内部类名 对象名 = new 外部类名.内部类名();
Outer2.Inner i=new Outer2.Inner();//内部类对象的创建
2. 访问特点
内部类的实例化方法可以直接访问外部类静态成员,不能直接访问外部类实例化成员;
void inner(){//这是内部类的无实例方法// System.out.println(a);//不可以直接访问外部类的静态成员System.out.println(b);//可以直接访问外部类的静态成员}
下面将给予代码进行说明:
class Outer2 {int a=100;static int b=200;//外部类静态成员变量static class Inner{//静态内部类void inner(){//这是内部类的无实例方法// System.out.println(a);//不可以直接访问外部类的静态成员System.out.println(b);//可以直接访问外部类的静态成员}public static void main(String[] args) {Outer2.Inner i=new Outer2.Inner();//内部类对象的创建i.inner();}}
}
三. 局部内部类
与局部方法的位置相同,定义在方法体中;该内部类几乎用不到,了解即可;
class Outer3{void inner(){//这是外部类的方法class Inner{//内部类int a=19;void play(){System.out.println("这是内部类的方法");}}Inner i=new Inner();//内部类的对象创建i.play();}public static void main(String[] args) {Outer3 out= new Outer3();out.inner();}
}
四. 匿名内部类
匿名内部类是一种i特殊的局部内部类;匿名,是指该类没有名字;
1. 格式:
new 抽象类/接口名(){
重写抽象方法;
}
2. 作用:
匿名内部类是抽象类/接口的子类,使用它可以不需要写实现类,直接调用接口,降低代码的冗余性;
下面将给予代码进行说明:
class S{public static void main(String[] args) {//new Inter() {//new出来的是接口的实现类对象,相当于创建对象的等号右边,而左边是名字,这里没有,即匿名Inter i=new Inter(){//也可以使用多态接收该实现类对象,这里不是创建接口对象,接口不能创建对象@Overridepublic int sum(int x, int y) {//重写方法return x+y;}};//注意这里的分号,毕竟是new对象int a=i.sum(10,50);//调用方法System.out.println(a);}}
//接口
interface Inter{int sum(int x,int y);//抽象方法,public abstract 可以省略不写
}
3. 本质:
其本身就是接口/抽象类的实现类对象;
4. 使用场景
在开发中,匿名内部类作为方法的参数进行传输;
下面将给予代码进行说明:
程序从main方法开始执行,调用含参成员方法UseInter,将参数,即内部类(内部类实质就是接口/抽象类子类对像)传入成员方法的有参变量inter,调用内部类中的重写的接口的sum方法;
class S{//方法的参数如果是一个接口,调用此方法需要传入该接口的实现类对象static void UseInter(Inter inter){//成员方法int a=inter.sum(10,30);System.out.println(a);}public static void main(String[] args) {//调用方法,相当于UseInter(a),,a即内部类,匿名内部类本质是实现类的对象//因为UserInter方法的参数是一个接口,调用此方法需要传入该接口的实现类对象UseInter(new Inter(){@Overridepublic int sum(int x, int y) {//重写方法return x+y;}});}
}
//接口
interface Inter{int sum(int x,int y);//抽象方法,public abstract 可以省略不写
}
相关文章:
五大元素之一,累不累——Java内部类
目录 简略版: 详解版: 使用场景: 内部类的优点: 内部类的分类: 一. 成员内部类 1.创建对象 2.访问方法 3. 外部类名.this. 二. 静态内部类 1. 创建对象 2. 访问特点 三. 局部内部类 四. 匿名内部类 …...
YAML快速编写示例
一、案例 1.1 自主式创建service关联上方的pod 资源名称my-nginx-kkk命名空间my-kkk容器镜像nginx:1.21容器端口80标签njzb:my-kkk 1.1.1 创建一个demo文件夹 1.1.2 创建并获取模版文件 1.1.3 查看服务并编写yaml文件 1.1.4 编写yaml文件并部署,查看服务是否运行成…...
2024 江苏省大学生程序设计大赛 2024 Jiangsu Collegiate Programming Contest(FGKI)
题目来源:https://codeforces.com/gym/105161 文章目录 F - Download Speed Monitor题意思路编程 G - Download Time Monitor题意思路编程 K - Number Deletion Game题意思路编程 I - Integer Reaction题意思路编程 写在前面:今天打的训练赛打的很水&…...
【C语言】基于C语言实现的贪吃蛇游戏
【C语言】基于C语言实现的贪吃蛇游戏 🔥个人主页:大白的编程日记 🔥专栏:C语言学习之路 文章目录 【C语言】基于C语言实现的贪吃蛇游戏前言一.最终实现效果一.Win32 API介绍1.1Win32 API1.2控制台程序1.3控制台屏幕上的坐标COORD…...
代码审计(工具Fortify 、Seay审计系统安装及漏洞验证)
源代码审计 代码安全测试简介 代码安全测试是从安全的角度对代码进行的安全测试评估。(白盒测试;可看到源代码) 结合丰富的安全知识、编程经验、测试技术,利用静态分析和人工审核的方法寻找代码在架构和编码上的安全缺陷…...
cocos creator 3.x 手搓背包拖拽装备
项目背景: 游戏背包 需要手动 拖拽游戏装备到 装备卡槽中,看了下网上资料很少。手搓了一个下午搞定,现在来记录下实现步骤; 功能拆分: 一个完整需求,我们一般会把它拆分成 几个小步骤分别造零件。等都造好了…...
运维开发.Kubernetes探针与应用
运维系列 Kubernetes探针与应用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263…...
Spring 框架:Java 企业级开发的基石
文章目录 序言Spring 框架的核心概念Spring 框架的主要模块Spring Boot:简化 Spring 开发Spring Cloud:构建微服务架构实际案例分析结论 序言 Spring 框架自 2002 年发布以来,已经成为 Java 企业级开发的标准之一。它通过提供全面的基础设施…...
在Docker中使用GPU
一、安装nvidia-container-toolkit 总之一句话:nvidia-docker和nvidia-docker2,nvidia-container-runtime 已经被英伟达迭代了,可以认为nvidia-container-toolkit是nvidia-docker和nvidia-docker2, nvidia-container-runtime 的替…...
vue3 前端实现导出下载pdf文件
这样的数据实现导出 yourArrayBufferOrByteArray 就是后端返回数据 // 创建Blob对象const blob new Blob([new Uint8Array(res)], { type: application/pdf })// 创建一个表示该Blob的URLconst url URL.createObjectURL(blob);// 创建一个a标签用于下载const a document.cr…...
AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比
博客导读: 《AI—工程篇》 AI智能体研发之路-工程篇(一):Docker助力AI智能体开发提效 AI智能体研发之路-工程篇(二):Dify智能体开发平台一键部署 AI智能体研发之路-工程篇(三&am…...
电商物流查询解决方案助力提升消费者体验
截至2023年12月,中国网络购物用户规模达9.15亿人,占网民整体的83.8%。这一庞大的数字不仅展现了电子商务的蓬勃发展,也标志着数字零售企业营销战略的转变——从以产品和流量为核心,到用户为王的新阶段。因此,提升消费者…...
【深度密码】神经网络算法在机器学习中的前沿探索
目录 🚝前言 🚍什么是机器学习 1. 基本概念 2. 类型 3. 关键算法 4. 应用领域 5. 工作流程 🚋什么是神经网络 基本结构 🚂神经网络的工作原理 前向传播(Forward Propagation): 损失函…...
搭载算能 BM1684 芯片,面向AI推理计算加速卡
搭载算能 BM1684 芯片,是面向AI推理的算力卡。可集成于服务器、工控机中,高效适配市场上所有AI算法,实现视频结构化、人脸识别、行为分析、状态监测等应用,为智慧城市、智慧交通、智慧能源、智慧金融、智慧电信、智慧工业等领域进…...
Python开发 我的世界 Painting-the-World: Minecraft 像素图片生成器
简介 Painting-the-World 是一款创新的工具,专为《我的世界》(Minecraft) 玩家及创作者设计,旨在将数字图片转变为游戏内的像素艺术。通过利用 RCON (Remote Console) 协议,本项目可以直接与《我的世界》服务器对话,根据输入的图…...
【经验分享】盘点“食用“的写文素材
一、构建框架 简介 1. 身份 擅长领域 2. 博客内容 3. 目前示例: 阿里云专家博主,华为云-云享专家,专注前、后端开发 博客内容:前后端实战教学、源码剖析、常见面试知识解析、算法题解与心得、日常考研总结等 目前正在备战考研&…...
实习碰到的问题w1
1.vueelementUI在输入框中按回车键会刷新页面 当一个 form 元素中只有一个输入框时,在该输入框中按下回车应提交该表单。如果希望阻止这一默认 行为,可以在 <el-form> 标签上添加 submit.native.prevent 。 参考:element-ui 表单 form …...
c#实现BPM系统网络传输接口,http协议,post
BPM通过http协议实现网络传输,语言使用.net(c#),在这里只提供一个接口,具体代码如下,请参照: public string MakeRequest(string parameters) { ServicePointManager.ServerCertificateValidationCallback new Syst…...
如何修改开源项目中发现的bug?
如何修改开源项目中发现的bug? 目录 如何修改开源项目中发现的bug?第一步:找到开源项目并建立分支第二步:克隆分支到本地仓库第三步:在本地对项目进行修改第四步:依次使用命令行进行操作注意:Gi…...
结构设计模式 - 代理设计模式 - JAVA
代理设计模式 一. 介绍二. 代码示例2.1 定义 CommandExecutor 类2.2 定义 CommandExecutorProxy代理类2.3 模拟客户端2.4 测试结果 三. 结论 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
