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

10、Java继承与多态 - 内部类的概念与分类 1

10、Java继承与多态 - 内部类的概念与分类 1

什么是内部类?

        如果一个事物的内部包含另一个事物,那么这就是一个内部包含另一个类,称作内部类;

        例如:身体和心脏的关系,又如 -> 汽车和发动机的关系;只有在里边才能正常工作,叫做内部类,心脏只有在身体中才能工作吧,发动机也是一个道理;

而我们的内部类大致上分为两种 ->

        - 成员内部类

        - 局部内部类(包含匿名内部类)

成员内部类的定义格式,如下所示 ->

修饰符 class 外部类名称 {

        修饰符 class 内部类名称 {

                ......

        }

        ......

}

使用内部类时注意:内用外,随意访问;外用内,需要内部类对象; 

如何使用成员内部中的方法呢?有两种方式:

        1. 间接方式:在外部类的方法中调用内部类的方法;然后我们调用外部类的方法即可;

        2. 直接方式:通过创建内部类的对象去直接访问内部类的方法,创建方式 - 如下所示->

外部类名称.内部类名称  对象名  =  new  外部类名称( ).new 内部类名称( ); 

下面用代码,给大家演示一下 ->

创建一个 Body 类 和一个 Heart 内部类,如下所示 ->

public class Body {private String name;public void running() {System.out.println("跑步中......");Heart heart = new Heart(); //外部类不能随意访问内部类,需要创建内部类对象才能访问heart.jump();}public class Heart {public void jump() {System.out.println("我叫:" + name); //内部类可随意访问外部类中的属性System.out.println("心脏跳动-蹦蹦蹦......");}}
}

创建一个 Main.java 文件,如下所示 ->

public class Main {public static void main(String[] args) {//1.调用 running() 方法间接调用内部类 Heart 中的 jump() 方法 ->Body body = new Body();body.running();//2.创建内部类对象 -> 直接调用内部类 Heart 中的 jump() 方法 ->Body.Heart bh = new Body().new Heart();bh.jump();}
}

        在 main() 方法中,我们首先通过 Body 对象去调用 running() 方法,然后间接通过 running() 方法去访问内部类中的 jump() 方法 —— 这是间接访问;

        然后我们通过创建内部类 Heart 的对象 bh 可以直接访问到内部类中的属性 —— 这是直接访问; 

那么在内部类中如何区分 - 同名的 - 外部类成员变量内部类成员变量内部类局部变量呢 

下面用代码给大家演示一下:

创建一个 Outer 类 ,并在其内部创建一个 内部类 Inner ,如下代码所示 ->

public class Outer {int num = 30;public class Inner {int num = 20;public void InnerMethod() {int num = 10;System.out.println(num);// num = 10System.out.println(this.num);// num = 20System.out.println(Outer.this.num);// num = 30}}
}

        调用内部类 Inner 中的 InnerMethod( ) 方法输出的结果自然是10 20 30 ;

        这里要注意的是如果我们要在内部类中调用外部类的同名成员变量时,要在 this 关键字前加上外部类的名称;

局部内部类 ->

        如果一个类是定义在一个方法内部的,那么这就是一个局部的内部类;

        局部:只有当前所属的方法才能使用它,出了这方法外面就不能用了;

定义格式,如下所示 ->

修饰符 class 外部类名称 {

        修饰符 返回值类型 外部类方法名称 ( 参数列表 ) {

                class 局部内部类名称 {

                        ......

                }

        } 

}

用代码定义,如下所示 ->

public class Outer {public void OuterMethod() {//在OuterMethod()方法中定义一个局部内部类 - Innerclass Inner {//在局部内部类中定义一个方法 InnerMethod(),然后通过局部内部类对象去调用public void InnerMethod() {System.out.println("局部内部类方法......");}}Inner inner = new Inner(); //因为这是局部内部类,所以只能在该方法中创建局部内部类的对象inner.InnerMethod();}
}

通过调用外部类 Outer 中的方法 OuterMethod(),间接调用内部类中的方法 InnerMethod();如下所示 ->

public class Main {public static void main(String[] args) {Outer outer = new Outer();outer.OuterMethod();}
}

在 局部内部类 中使用到 局部变量 时注意以下几点 ->

        1.如果在局部内部类中使用到局部变量时,该局部变量必须是 -> 有效final

什么是 -> 有效final ?

        就是该变量由 final 关键字修饰,或者只赋值过一次;(后者只有从 Java8 开始才可以实现);

public class Outer {public void OuterMethod() {// 1. 要么局部变量 num 只赋值一次;// 2. 要么给 num 之前加上final 修饰符int num = 10; class Inner {public void InnerMethod() {System.out.println("num = "+num);}}}
}

给大家解释一下原因,如下 ->

其实之所以这么规定是因为 局部变量 受到 生命周期 的约束 ->

1.new 出来的对象在堆内存中;
2.局部变量是跟着方法走的,在栈内存当中;
3.方法运行结束之后,立刻出栈,局部变量就会立刻被销毁;
4.但是 new 出来的对象会在堆当中持续存在,直到垃圾回收才会 -> 消失;

小结一下类的权限修饰符:

public  >  protected  >  ( default )  >  private

定义一个类的时候,权限修饰符的规则:

        1. 外部类:public  /  ( default ) 

        2.成员内部类:public  /  protected  /  ( default )  /  private

        3.局部内部类:什么都不能写  

相关文章:

10、Java继承与多态 - 内部类的概念与分类 1

10、Java继承与多态 - 内部类的概念与分类 1 什么是内部类? 如果一个事物的内部包含另一个事物,那么这就是一个内部包含另一个类,称作内部类; 例如:身体和心脏的关系,又如 -> 汽车和发动机的关系&#x…...

Java SE 面试题

文章目录 Java SE 面试题基本知识请简要介绍 Java SE。请解释 Java 的垃圾回收机制。请解释 Java 中的访问修饰符。 面向对象请解释封装、继承和多态。请解释接口和抽象类的区别。 集合框架请解释 ArrayList 和 LinkedList 的区别。请解释 Set 和 Map 接口。 异常处理请解释 Ja…...

Linux 之十九 编译工具链、.MAP 文件、.LST 文件

.map 文件和 .lst 文件是嵌入式开发中最有用的俩调试辅助文件。现在主要从事 RISC-V 架构,开始与 GCC 打交道,今天就重点学习一下 GCC 的 .map 文件、.lst 文件,并辅助以 ARMCC 和 IAR 作为对比。 编译工具链 .map 文件和 .lst 文件都是由编…...

小 C 的数学(math)

祝大家劳动节快乐!!小手动起来 言归正传┏ (゜ω゜)☞ 题目描述 小 C 想要成为一名 OIer,于是他提前学习数学,为 OI 做好铺垫。这一天,他的数学老师给了一道题:给定正整数 a,以及给定一个区间 …...

应用运行环境实时洞察,亚马逊云科技Cisco AppDynamics展优势

Cisco AppDynamics(APM)产品,现已正式上线亚马逊云科技Marketplace(中国区域)。可以通过亚马逊云科技Marketplace(中国区域)网站,灵活便捷地部署该解决方案,以便充分利用云原生APM(应用性能管理…...

C++程序设计——lambda表达式

一、问题引入 在C98中,如果想对一个数据集合中的元素进行排序,可以使用sort()方法,但如果待排序元素为自定义类型,就需要用户自己定义排序时的比较规则。 随着C语法的发展,人们开始觉得其编写比较复杂,每次…...

Unity 高级程序员应该具备怎样的能力?要怎样成长为 Unity 高级程序员?

如何从零基础小白成长为 Unity 高级程序员?【全篇学习内容免费!快来白嫖】 高能预警,下文包含从零基础新手到高级程序员一站式技术学习、学习方法、心态等内容,供各个阶段的同学进行参考。 从零基础到高级程序员 上干货 话不多说…...

禁止触摸屏触控板手指缩放,需要这样处理

要禁止触摸屏的手指缩放&#xff0c;可以使用如下的CSS 只要在页面上使用css样式touch-action: none&#xff0c;就能禁止web在手机或平板上的缩放了。 <html style"touch-action: none;">注意&#xff1a; 使用 touch-action: none作用于html元素上&#xff0…...

opencv cuda版本windows编译

目录 1. 编译准备2. 编译3. 遇到的问题及解决方案3.1 boostdesc_bgm.i,vgg_generated_48.i等文件的缺失3.2 fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件或目录 1. 编译准备 编译工具是cmakevisual studio2022&#xff0c;首先安装这两个工…...

python哲学

进入python编辑器模式下&#xff0c;输入import this 会打印python之禅(The Zen of Python) Beautiful is better than ugly. 优美胜于丑陋。 Explicit is better than implicit. 明了胜于晦涩。 Simple is better than complex. 简单胜过复杂。 Complex is better than co…...

(2023)用AIGC写iOS项目单元总结

尝试开发的项目 项目功能 用 ChatGPT 开发了一个视频播放器。需要它编写的功能包括&#xff1a; ☆ 本地文件&#xff0c;在线 URL 播放&#xff0c;暂停 ☆ 点击空白区域弹出操作菜单&#xff0c;再点击消失 ☆ 手动横竖屏切换 ☆ 播放速度调整&#xff0c;限定 0.5, 1.0, …...

k8s扩容node节点会影响上面已存在的pod吗?

理论上不影响 扩容 Kubernetes 集群中的节点不会影响已经运行的 Pod&#xff0c;因为 Pod 是在节点上运行的&#xff0c;而不是在集群中运行的。当您添加新的节点时&#xff0c;Kubernetes 调度器会在新节点上启动新的 Pod&#xff0c;而已经运行的 Pod 会继续在它们当前的节点…...

深度学习 -- pytorch 计算图与动态图机制 autograd与逻辑回归模型

前言 pytorch中的动态图机制是pytorch这门框架的优势所在&#xff0c;阅读本篇博客可以使我们对动态图机制以及静态图机制有更直观的理解&#xff0c;同时在博客的后半部分有关于逻辑回归的知识点&#xff0c;并且使用pytorch中张量以及张量的自动求导进行构建逻辑回归模型。 …...

计算机网络学习03(OSI、TCP/IP网络分层模型详解))

1、OSI 七层模型 OSI 七层模型 是国际标准化组织提出一个网络分层模型&#xff0c;其大体结构以及每一层提供的功能如下图所示&#xff1a; 每一层都专注做一件事情&#xff0c;并且每一层都需要使用下一层提供的功能比如传输层需要使用网络层提供的路由和寻址功能&#xff0…...

ChatGPT是什么?ChatGPT里的G、P、T分别指什么

文章目录 ChatGPT是什么GTP中的 生成式 是什么意思GTP中的 预训练 是什么意思GTP中的 变换模型 是什么意思 什么是Transformer什么是注意力机制 监督学Xi、无监督学Xi、强化学Xi ChatGPT是什么 GPT: Generative Pre-trained Transformer 生成式预训练变换模型 ChatGPT是由Ope…...

Linux服务使用宝塔面板搭建网站,并发布公网访问 - 内网穿透

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 转载自远程内网穿透的文章&#xff1a;Linux使用宝塔面板搭建网站&#xff0c;并内网穿透实现公网访问 前言 宝塔面板作为简单好用的服务器运维管理面板&#…...

TDA4VH j784s4 使用

// sdk https://www.ti.com/tool/PROCESSOR-SDK-J784S4 // Jacinto Processors TDA4AP-Q1/TDA4VP-Q1/TDA4AH-Q1/TDA4VH-Q1 EVM User’s Guide https://www.ti.com/lit/ug/spruj62/spruj62.pdf?ts1682337275236&ref_urlhttps%253A%252F%252Fwww.ti.com%252Fsitesearch%252…...

CSS布局基础(字体,文本,背景)

字体 常见字体设置 body {font-family: font-family: "Microsoft YaHei", Tahoma, Arial, Hiragino Sans GB,sans-serif; }浏览器从前到后匹配&#xff0c;找到可用字体结束&#xff0c;都没匹配上&#xff0c;使用浏览器默认字体 常用字号 不同浏览器默认字号可…...

Redis入门指南:深入了解这款高性能缓存数据库

本文将带您了解Redis的基本概念、数据类型、特性以及如何在实际项目中应用Redis。通过阅读本文&#xff0c;您将更好地理解如何利用Redis优化您的应用程序性能。 1. 什么是Redis&#xff1f;2. Redis的数据类型3. Redis的特性4. 如何使用Redis4.1 安装与启动4.2 基本命令4.3 应…...

# 数据结构和算法面试题系列-随机算法总结

0 概述 随机算法涉及大量概率论知识&#xff0c;有时候难得去仔细看推导过程&#xff0c;当然能够完全了解推导的过程自然是有好处的&#xff0c;如果不了解推导过程&#xff0c;至少记住结论也是必要的。本文总结最常见的一些随机算法的题目&#xff0c;是几年前找工作的时候…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...