当前位置: 首页 > news >正文

第5章-第8节-Java面向对象中的内部类

1、内部类:属于类的成员之一,类的内部又定义类,外层的class称为外部类,内部的class称为内部类。

设计了某个类,根据需求发现其内部又需要定义一个独立的内部结构,此时就考虑将其定义为内部类,内部类依赖于外部类,不可能独立存在。

举例:
    母亲 和其 腹中的胎儿

备注:外部类的权限修饰只能用public或者缺省,而内部类可以用所有的四种权限。

2、内部类的分类:

定义位置:

1)、成员内部类: 定义在类的成员位置;
2)、局部内部类: 定义在类的局部位置; 

成员内部类细分:

1)、非静态成员内部类:非静态内部类;
2)、静态成员内部类:  静态内部类;

局部内部类细分:

1)、局部内部类:    定义在局部位置的有名类;  
2)、匿名内部类:    定义在局部位置的匿名类;


1、匿名内部类:内部类中,匿名内部类使用率最高,所以这里先进行说明,其它的内部类直接后面放代码里进行说明。

引入场景:
    类/接口内部定义了某方法,我需要使用该方法,但是发现方法体的逻辑不适合,
    根据之前学习过的技术,我们就定义一个类,让该类去继承父类/实现接口,
    重写其内部的方法,在外界实例化对象,对象调用方法完成需求。

    【问题】:辛辛苦苦设计完一个类,但是在外界只需要使用很少的次数(比如:一次)
              那么有点浪费了!!!

    【解决】:可以使用匿名内部类解决上述的问题

格式:

两种情况:

情况一:和父类有关

模板:
    new 父类名(){
        //设计匿名子类的成员
    };

情况二:和接口有关

模板:
    new 接口名(){
        //设计匿名实现类的成员
    };

解析格式:
    
内部包含两个环节:

环节一:设计匿名子类/实现类
环节二:创建匿名子类/实现类的对象

备注:匿名内部类不能赋值给对象引用,要调用时只能匿名类自己直接在后面.操作进行调用方法,例如下面这样三个例子:

//匿名内部类
new Father(){//重写method方法@Overridepublic void method() {System.out.println("重写method");;}
}.method();//匿名内部类
new Object(){public void myMethod() {System.out.println("匿名内部类自己的方法");}
}.myMethod();//匿名内部类
new Inter(){//重写实现接口的interMethod方法@Overridepublic void interMethod() {System.out.println("实现接口interMethod");}
}.interMethod();

3、成员内部类的几种情况:

1)、非静态内部类:

//外部类
public class Outer {//属性int a = 10;static int b = 20;private int c = 30;//方法public void outM1() {System.out.println("out...m1");}public static void outM2() {System.out.println("out...m2");}public void outM5() {/*非静态方法内部访问非静态内部类的成员步骤如下:1).创建非静态内部类对象2).非静态内部类对象访问其内部成员*/Inner in = this.new Inner();System.out.println(in.i);in.inM3();}public static void outM6() {/*静态方法内部访问非静态内部类的成员步骤如下:1).创建外部类对象2).通过外部类对象去创建非静态内部类对象3).非静态内部类对象访问其内部成员*/Outer o = new Outer();Inner in = o.new Inner();System.out.println(in.i);in.inM3();}//设计非静态内部类class Inner{int i = 100;//非静态内部类中不能定义静态属性
//        static int j = 200;//非静态内部类中可以定义常量static final double PI = 3.14;public void inM3() {System.out.println("in...m3");}//非静态内部类中不能定义静态方法
//        public static void inM4() {
//            //...
//        }{}//非静态内部中不能定义静态代码块
//        static{}public void test() {//访问外部类的属性System.out.println(a);System.out.println(Outer.this.a);System.out.println(b);System.out.println(Outer.b);System.out.println(c);//访问外部类的方法Outer.this.outM1();Outer.outM2();}}
}
public class Test {public static void main(String[] args) {/*在外界(比如:测试类),访问非静态内部类的成员步骤如下:1).创建外部类对象2).通过外部类对象去创建非静态内部类对象3).非静态内部类对象访问成员*/Outer o = new Outer();Outer.Inner in = o.new Inner();System.out.println(in.i);in.inM3();}
}

2)、静态内部类:

public class Outer {//属性int a = 10;static int b = 20;private int c = 30;//方法public void outM1() {System.out.println("out...m1");}public static void outM2() {System.out.println("out...m2");}public void outM5() {/*外部类非静态方法内部可以直接访问静态内部类的静态成员(属性、方法)通过类名.静态成员*/System.out.println(Inner.j);Inner.inM4();/*外部类非静态方法内部不可以直接访问静态内部类的非静态成员(属性、方法)但是可以间接访问,步骤如下:1).创建静态内部类对象2).通过静态内部类对象访问其非静态成员*/Inner in = new Inner();System.out.println(in.i);in.inM3();}public static void outM6() {/*外部类静态方法内部可以直接访问静态内部类的静态成员(属性、方法)通过类名.静态成员*/System.out.println(Inner.j);Inner.inM4();/*外部类静态方法内部不可以直接访问静态内部类的非静态成员(属性、方法)但是可以间接访问,步骤如下:1).创建静态内部类对象2).通过静态内部类对象访问其非静态成员*/Inner in = new Inner();System.out.println(in.i);in.inM3();}//设计静态内部类static class Inner{int i = 100;static int j = 200;public void inM3() {System.out.println("in...m3");}public static void inM4() {System.out.println("in...m4");}public void test() {/*静态内部类非静态方法内部可以直接访问外部类的静态成员:直接通过类名.静态成员即可*/
//            System.out.println(a);System.out.println(Outer.b);Outer.outM2();/*静态内部类非静态方法内部不可以直接访问外部类的非静态成员:必须先创建外部类对象,在通过对象名.非静态成员*/Outer o = new Outer();System.out.println(o.a);System.out.println(o.c);o.outM1();}public static void test2() {/*静态内部类静态方法内部可以直接访问外部类的静态成员:直接通过类名.静态成员即可*/
//            System.out.println(a);System.out.println(Outer.b);Outer.outM2();/*静态内部类静态方法内部不可以直接访问外部类的非静态成员:必须先创建外部类对象,在通过对象名.非静态成员*/Outer o = new Outer();System.out.println(o.a);System.out.println(o.c);o.outM1();}}
}
public class Test {public static void main(String[] args) {//访问静态内部类的静态成员(属性、方法) ==> 类名直接访问System.out.println(Outer.Inner.j);Outer.Inner.inM4();/*访问静态内部类的非静态成员(属性、方法)先创建静态内部类对象,在通过对象访问非静态成员*/Outer.Inner in = new Outer.Inner();System.out.println(in.i);in.inM3();}
}

4、关于内部类的一个小案例:

class Wai{int a = 10;class Nei{int a = 100;public void test() {int a = 1000;System.out.println("局部变量a=" + a);                   //就近原则  a=1000System.out.println("非静态内部类成员变量a=" + this.a);    //a=100System.out.println("外部类成员变量a=" + Wai.this.a);     //a=10}}
}public class Exer {public static void main(String[] args) {Wai w = new Wai();Wai.Nei n = w.new Nei();n.test();}
}

本电子书目录:《Java基础的重点知识点全集》

相关文章:

第5章-第8节-Java面向对象中的内部类

1、内部类:属于类的成员之一,类的内部又定义类,外层的class称为外部类,内部的class称为内部类。 设计了某个类,根据需求发现其内部又需要定义一个独立的内部结构,此时就考虑将其定义为内部类,内…...

首次引入大模型!Bert-vits2-Extra中文特化版40秒素材复刻巫师3叶奈法

Bert-vits2项目又更新了,更新了一个新的分支:中文特化,所谓中文特化,即针对中文音色的特殊优化版本,纯中文底模效果百尺竿头更进一步,同时首次引入了大模型,使用国产IDEA-CCNL/Erlangshen-Megat…...

从零学Java - 接口

Java 接口 文章目录 Java 接口1.接口的语法1.1 与抽象类的区别 2.如何使用接口?2.1 接口的使用规范 3.什么是接口?3.1 常见关系 4.接口的多态性5.面向接口编程5.1 接口回调 6.特殊接口6.1 常量接口6.2 标记接口 7.接口的好处 补充面向对象 七大设计原则 1.接口的语法 接口&a…...

安全防御之身份鉴别技术

身份认证技术用于在计算机网络中确认操作者的身份。在计算机网络世界中,用户的身份信息是用一组特定的数据来表示的,计算机也只能识别用户的数字身份。身份认证技术能够作为系统安全的第一道防线,主要用于确认网络用户的身份,防止…...

axios post YII2无法接收post参数问题解决

axios post YII2无法接收post参数问题解决 在yii 配置文件中增加 ‘parsers’ > [“application/json” > “yii\web\JsonParser”] 如下所示: $config [id > basic,language > zh-CN,timeZone > env(TIME_ZONE, PRC),basePath > $basePath,bo…...

性能优化-OpenMP基础教程(三)

本文主要介绍OpenMP并行编程的环境变量和实战、主要对比理解嵌套并行的效果。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀CSDN主页 发狂的小花 &…...

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-1+2课程介绍+电路系统建模、基尔霍夫定律

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-12课程介绍电路系统建模、基尔霍夫定律 1. 课程介绍2. 电路系统建模、基尔霍夫定律 1. 课程介绍 2. 电路系统建模、基尔霍夫定律 基本元件: 电量 库伦&…...

VSCode配置C/C++环境

文章目录 1. 安装配置 C 编译器1.1 下载 MinGW1.2 Mingw添加到系统变量1.3 验证 2. 安装和配置VSCode2.1 安装VSCode2.2 VSCode配置C环境2.3. 优化 3.参考文章 本文主要记录在VSCode中配置C环境,非常感谢参考文章中的博主。 1. 安装配置 C 编译器 首先需要安装 C 编…...

ChatGPT绘制全球植被类型分布图、生物量图、土壤概念图、处理遥感数据并绘图、病毒、植物、动物细胞结构图

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...

vmware workstation的三种网络模式通俗理解

一、前言 workstations想必很多童鞋都在用,经常会用来在本机创建不同的虚拟机来做各种测试,那么对于它支持的网络模式,在不同的测试场景下应该用哪种网络模式,你需要做下了解,以便可以愉快的继续测(搬&…...

C++程序设计兼谈对象模型(侯捷)笔记

C程序设计兼谈对象模型(侯捷) 这是C面向对象程序设计的续集笔记,仅供个人学习使用。如有侵权,请联系删除。 主要内容:涉及到模板中的类模板、函数模板、成员模板以及模板模板参数,后面包含对象模型中虚函数调用&…...

selenium实现UI自动化

1.selenium简介 selenium是支持web浏览器自动化的一系列工具和库的综合项目。具有支持linux、windows等多个平台,支持Firefox、chrome等多种主流浏览器;支持Java、Python等多种语言。 主要包括的三大工具有: WebDriver(rc 1.0)、…...

【DevOps-03】Build阶段-Maven安装配置

一、简要说明 下载安装JDK8下载安装Maven二、复制准备一台虚拟机 1、VM虚拟复制克隆一台机器 2、启动刚克隆的虚拟机,修改IP地址 刚刚克隆的虚拟机 ,IP地址和原虚拟的IP地址是一样的,需要修改克隆后的虚拟机IP地址,以免IP地址冲突。 # 编辑修改IP地址 $ vi /etc/sysconfig…...

​已解决java.lang.ArrayIndexOutOfBoundsException异常的正确解决方法,亲测有效!!!​

已解决java.lang.ArrayIndexOutOfBoundsException异常的正确解决方法,亲测有效!!! 目录 报错问题 解决思路 解决方法 总结 Q1 - 报错问题 java.long.ArrayIndexOutOfBoundsException 是Java中的一个运行时异常​&#xff0c…...

Pycharm打包程序为exe文件

Pycharm打包程序为exe文件 【一】导入模块pyinstaller 【1】图片说明 【2】文字说明 根据图片顺序执行 首先点击file进入settings界面,在setting界面找到Project下面的Python Interpretor,点击号进行模块的添加在搜索框中输入pyinstaller,…...

地理空间分析3——数据可视化与地理空间

写在开头 数据可视化是将数据以图形形式呈现,使其更易于理解和分析的过程。在地理空间分析中,数据可视化不仅能够展示地理位置信息,还能够有效地传达地理空间数据的模式、趋势和关联。本文将探讨数据可视化在地理空间分析中的作用,介绍Python中常用的数据可视化工具,并深…...

python开发案例教程-清华大学出版社(张基温)答案(4.3)

练习 4.1 1. 判断题 判断下列描述的对错。 (1)子类是父类的子集。 ( ✖ ) (2)父类中非私密的方法能够被子类覆盖。 ( ✔ ) (3)子类…...

Qt 5.9.4 转 Qt 6.6.1 遇到的问题总结(一)

最近公司对大家的开发的硬件环境进行了升级,电脑主机的配置、显示器(两台大屏显示器)变得的逼格高多了。既然电脑上的开发环境都需要重装,就打算把开发环境也升级到最新版本,要用就用最新版本。下面对升级后的开发环境…...

探索生成式AI:自动化、问题解决与创新力

目录 自动化和效率:生成式AI的颠覆力量 解谜大师生成式AI:如何理解和解决问题 创新与创造力的启迪:生成式AI的无限潜能 自动化和效率:生成式AI的颠覆力量 1. 神奇的代码生成器:生成式AI可以帮助开发人员像魔术一样快…...

UI5与后端的文件交互(一)

文章目录 前言一、RAP的开发1. 创建表格2. 创建CDS Entity3. 创建BDEF4. 创建implementation class5. 创建Service Definition和Binding6. 测试API 二、创建UI5 Project1. 使用Basic模板创建2. 创建View3. 测试页面及绑定的oData数据是否正确4. 创建Controller5. 导入外部包&am…...

[HCTF 2018]Warmup

[HCTF 2018]Warmup wp 进入页面&#xff1a; 查看源码&#xff1a; 发现提示&#xff1a;source.php &#xff0c;直接访问&#xff0c;得到源代码&#xff1a; <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist [&qu…...

编译原理笔记(三)

一、词法分析程序的设计 1、词法分析程序的输出 在识别出下一个单词同时验证其词法正确性之后&#xff0c;词法分析程序将结果以单词符号的形式发送至语法分析程序以回应其请求。 单词符号一般分下列5类&#xff1a; 关键字&#xff1a;如&#xff1a;begin、end、if、whil…...

DDoS攻击的多种方式

DDOS攻击指分布式拒绝服务攻击&#xff0c;即处于不同位置的多个攻击者同时向一个或数个目标发动攻击&#xff0c;或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。由于攻击的发出点是分布在不同地方的&#xff0c;这类攻击称为分布式拒绝服务…...

SpringValidation自定义注解以及分组校验

SpringValidation的参数校验使用可参考&#xff1a;【SpringMVC应用篇】Spring Validation 参数校验-CSDN博客 目录 1. 引入依赖 2. 自定义注解校验 2.1 创建Validation类 2.2 创建注解对象 2.3 使用注解 3. 分组校验 3.1 实体类内部定义接口 3.2 在参数上指定分组 1. …...

Multisim各版本安装指南

Multisim下载链接 https://pan.baidu.com/s/1En9uUKafhGOqo57V5rY9dA?pwd0531 1.鼠标右击【Multisim 14.3(64bit)】压缩包&#xff08;win11及以上统需先点击“显示更多选项”&#xff09;选择【解压到 Multisim 14.3(64bit)】。 2.打开解压后的文件夹&#xff0c;双击打开【…...

大学生搜题软件,未来可期吗?

作为一家专注于软件开发的公司《智创有术》&#xff0c;我们致力于为客户提供创新、高效和可靠的解决方案。通过多年的经验和专业知识&#xff0c;我们已经在行业内建立了良好的声誉&#xff0c;并赢得了客户的信任和支持。 支持各种源码&#xff0c;网站搭建&#xff0c;APP&a…...

JMeter使用

目录 启动JMeter 创建线程组 设置线程参数 设置http请求参数 ​编辑 创建查看结果树(显示成功/失败多少以及返回结果等信息) 创建聚合报告(显示响应时间、吞吐量、异常数等信息) 点击上方的执行按钮即可开始压力测试 结果树显示 聚合报告结果显示 启动JMeter 在JMete…...

ChatGPT 进行 SEO的使用技巧

搜索引擎优化 (SEO) 是使网站对搜索引擎友好的一种不断发展的实践。 自搜索引擎和新兴技术的发展以来&#xff0c;它从未保持不变。 最近发布的 ChatGPT 是一种人工智能对话工具&#xff0c;似乎在搜索引擎优化方面有很好的应用。 从创建吸引人的标题到只需一个简短的提示就可…...

PDF.js实现搜索多个不同的关键词高亮显示效果

static\PDF\web\viewer.js 392行左右 // 自定义搜索关键词---------------------------------------- this.searchKeywords = keyword => {if (typeof PDFViewerApplication !== undefined) {PDFViewerApplication.eventBus.dispatch(find, {query: keyword,caseSensitive:…...

ES高级用法:DeleteByQueryRequest

背景 在Elasticsearch中&#xff0c;delete_by_query API 允许你基于查询条件删除文档。在Java中&#xff0c;你可以使用Elasticsearch的Rest High Level Client或者Transport Client来执行这个操作。 示例代码 下面是使用Rest High Level Client进行delete_by_query操作的一…...

贵阳网站建设托管/嵌入式培训班一般多少钱

学习写一个最简单的web交互页面&#xff0c;可以向apache传送数据&#xff0c;通过cgi接受&#xff0c;并返回数据。 示例代码 View Code <input id"my" type"submit" value"submit"/><script type"text/javascript"> …...

家里做网站买什么服务器好/免费seo排名优化

ThinkPHP学生社团管理系统一 系统介绍 学生社团管理系统基于ThinkPHP框架开发&#xff0c;系统角色分为学生&#xff0c;社团管理员和超级管理员三种。学生可参加社团、活动&#xff0c;创建社团等&#xff0c;社团管理员申请活动&#xff0c;管理制度&#xff0c;值班等&…...

一个网站的开发周期/最有效的恶意点击软件

RedHat Linux 6.2下Oracle10g安装配置手册以下都是root用户操作1. 安装准备1.1 RedHatLinux Server 6.2安装文件RatHatLinuxServer-6.2-x86_64.iso1.2 Oracle10g Linux安装文件10201_database_linux_x86_64.cpio.gz1.3 检查安装包rpm -qa |grep makeautomake-1.11.1-1.2.el6.n…...

公司做个网站/磁力狗在线引擎

抓包工具WireShark工具栏过滤器时间格式报文层报文标识tcpdump常规选项文件选项时间选项详细分析选项WireShark 工具栏 过滤器 时间格式 报文层 报文标识 tcpdump 常规选项 -D 列举所有网卡设备如&#xff1a;tcpdump -D-i 选择网卡设备&#xff0c; 不指定-i则表示抓取的是…...

html网站登陆注册怎么做/教育培训网

/*** 原生支付(扫码支付)及公众号支付的异步回调通知* 说明&#xff1a;需要在native.php或者jsapi.php中的填写回调地址。例如&#xff1a;http://www.xxx.com/wx/notify.php* 付款成功后&#xff0c;微信服务器会将付款结果通知到该页面*/header(Content-type:text/html; Cha…...

网站建设 博客/营销策略方案

目录 1 绪论 2 1.1 倍耐力轮胎有限公司简介 2 1.2 设备效率改善的研究概况 3 1.3 本文选题背景 3 1.4 本文研究意义及主要内容 4 1.4.1 本文研究意义 4 1.4.2 本文主要内容 4 1.5 本章小结 4 2 双复合挤出机研究分析 5 2.1 轮胎概况 5 2.1.1 轮胎简介 5 2.1.2 轮胎组成 5 2.1.3…...