Java基础语法之内部类

什么是内部类

就是在一个类中又定义了另一个类

分类

实例内部类

即未被static修饰的内部类

1.外部类中的任何成员都可以在内部类里面直接访问,不管这个成员是什么权限

2.内部类对象的创建必须是在有外部类成员的前提下

这是错误的,那如何实例化呢?

先要有一个外部类对象,然后再实例化内部类对象,等号左边是这个对象的类型,即OutClass.InnerClass,等号右边则是通过外部类对象去实例化内部类对象

也可以按照下面的方式:

实际上,内部类也是外部类的一个普通成员变量,它是未被static修饰的成员变量,所以它的使用是要依赖外部类对象的

3.内部类里面不能有static修饰的变量,除非加上final

这是因为,内部类的实例必须要有外部类对象的帮助,而static是不依赖对象的

如果说可以有static修饰的成员,那我们就可以用内部类类名.变量来访问这个static变量,但是上面的第二点说了,内部类的加载是要依赖外部类对象的,也就是要想用这个内部类,就必须进行实例化,这就与我们的静态变量的初衷相违背了

但要想用static修饰,就要加上final,因为final修饰的变量会在编译时就被看作常量处理,直接用确定的值来替代,就免去了类加载这一个环节

4.内部类如何访问外部类的成员

当变量名不相同时,直接访问即可

当变量名相同时,要用到this,例如:在外部,a=111;在内部,a=1;下面代码:

会打印出:

为什么不是111呢?修改代码:

这是就可以打印出111了

这是因为,在内部类中隐藏了俩个this,一个时外部的,一个是内部的,这也是为什么对于不重名的变量,直接访问即可,而不需要通过外部类对象或类名来调用,其实就是有了this了,其实实际上this就是一个对象了

而对于外部类的方法,在内部类中也是用上面的方式来调用(不论是否是静态的):

5.外部类如何访问内部类的成员

因为内部类是外部类的一部分,所以直接在非静态方法中实例化一个内部类对象即可

但注意,如果这个外部类的方法是一个静态的,就无法实例化内部类对象了

这是因为,内部类对象的创建依赖外部类对象,如果是一个非静态方法,那么他就有一个隐藏的参数this表示外部对象的引用,但如果是一个静态的方法,就没有this参数,所以就无法对内部类对象进行实例化

静态内部类

被static修饰的内部成员类称为静态内部类

1.在静态内部类中不可以直接访问非静态的外部类成员

由于静态内部类是外部类的一个静态成员,它就和普通静态成员一样,是不依赖对象的,这就导致它的所有方法里面没有隐藏的this参数,所以就无法访问非静态的外部类成员变量和方法

那如何访问呢,只要实例化一个外部类对象即可

2.对于静态的外部类变量和方法,可以直接访问,既不需要实例化外部类对象,也不需要用类名来引出,不论这个内部类方法是否为静态方法

3.外部类的方法如何访问内部类成员

不论这个外部类方法是否为静态的,它要想访问内部类的非静态成员,就必须实例化内部类对象,因为非静态成员依赖对象

而不论这个外部类方法是否为静态的,它要想访问内部类的静态成员,不需要实例化内部类对象,只需要用类名引出即可

4.如何在外部类之外创建静态内部类对象

由于静态内部类同外部类的普通静态成员一样不依赖对象,所以只需要用类名引出即可,如下:

局部内部类

就是定义在外部类的方法体中或者{}中,它只能在对应的方法中使用,不能被static,public等访问修饰限定符修饰。

但注意,final不是访问修饰限定符,所以它可以被final修饰

匿名内部类

我们知道,对于一个接口,是不能直接实例化对象的:

但下面的方法却可以:

这实际上相当于创建了一个匿名对象,实现了IA接口,重写了它的方法

那如何调用这个重写的方法呢?

如上,可以用IA的引用来接收这个内部类对象,这实际上是向上转型,而在调用test方法时则发生了动态绑定

如上,也可以不接收,而是直接调用

其实不用匿名内部类,而是用局部内部类也可以,但不如匿名内部类简洁

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

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

相关文章

你知道在MyBatis中传参的#{}和${}的区别吗???

首先我们先将其区别列举出来: 首先演示sql注入: 基于上两篇博客的准备工作,继续开发:MyBatis的删除、修改、插入操作!!!-CSDN博客 #{}的使用 UserMapper.java: User testLogin(User user); U…

时序预测 | Python实现GRU-XGBoost组合模型电力需求预测

时序预测 | Python实现GRU-XGBoost组合模型电力需求预测 目录 时序预测 | Python实现GRU-XGBoost组合模型电力需求预测预测效果基本描述程序设计参考资料预测效果 基本描述 该数据集因其每小时的用电量数据以及 TSO 对消耗和定价的相应预测而值得注意,从而可以将预期预测与当前…

手把手教你搭建谷歌Gemini

前言 谷歌上周推出了一款名为 Gemini 的多模态大模型,并且现在发布了免费开放的 Gemini API 供开发者使用。根据谷歌提供的定价信息,Gemini 有两种收费方式。免费版本每分钟可以进行 60 次请求,足够满足个人用户的需求。收费版本目前暂不可用…

【无语】Microsoft Edge 浏览器不显示后台返回的数值数据

Microsoft Edge 禁用 JSON 视图 写在前面禁用 JSON 视图 写在前面 遇到一个有意思的事情,在用 Microsoft Edge 浏览器发送请求测试时发现,后端返回的数值数据没有正常展示,而是类似查看源码的结果,只显示了一个行号1,…

visual stdio code运行vue3

npm init vuelatest 该命令初始化vue项目 使用visual stdio code创建vue项目 ,这边是vue-project文件夹 vs code打开项目 vscode操作vue项目 vscode操作vue项目

Java 数据结构篇-实现二叉搜索树的核心方法

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 二叉搜索树的概述 2.0 二叉搜索树的成员变量及其构造方法 3.0 实现二叉树的核心接口 3.1 实现二叉搜索树 - 获取值 get(int key) 3.2 实现二叉搜索树 - 获取最小…

大创项目推荐 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 🔥 优质竞赛项目系列,今天…

升华 RabbitMQ:解锁一致性哈希交换机的奥秘【RabbitMQ 十】

欢迎来到我的博客,代码的世界里,每一行都是一个故事 升华 RabbitMQ:解锁一致性哈希交换机的奥秘【RabbitMQ 十】 前言第一:该插件需求为什么需要一种更智能的消息路由方式?一致性哈希的基本概念: 第二&…

很抱歉,Midjourney,但Leonardo AI的图像指导暂时还无人能及…至少目前是这样

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

【VScode】设置语言为中文

1、下载安装好vscode 2、此时可看到页面为英文,为方便使用可切换为中文 3、键盘按下 ctrlshiftP 4、在输入框内输入configure display language 5、选择中文,restart即可(首次会有install安装过程,等待安装成功后重启即可&am…

【Python炫酷系列】一闪一闪亮星星,漫天都是小星星(完整代码)

文章目录 环境需求完整代码详细分析系列文章环境需求 python3.11.4及以上版本PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.…

Python 爬虫之简单的爬虫(四)

爬取动态网页(下) 文章目录 爬取动态网页(下)前言一、大致内容二、基本思路三、代码编写1.引入库2.加载网页数据3.获取并保存4.保存文档 总结 前言 上篇主要讲了如何去爬取数据,这篇来讲一下如何在获取的同时将数据整…

利用canvas封装录像时间轴拖动(uniapp),封装上传uniapp插件市场

gitee项目地址,项目是一个空项目,其中包含了封装的插件,自己阅读,由于利用了canvas所以在使用中暂不支持.nvue,待优化; 项目也是借鉴了github上的一个项目,timeline-canvas,​​​​​​​ ​​​​​​​

【2.2操作系统】进程管理

目录 1.进程的基本概念2.进程的状态3.信号量与PV操作4.前趋图5.死锁6.银行家算法 1.进程的基本概念 🌟进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。它由程序块、进程控制块 (PCB) 和数据块三部分组成。 &#x1f…

Kubernetes 的用法和解析 -- 5

一.企业级镜像仓库Harbo 准备:另起一台新服务器,并配置docker yum源,安装docker 和 docker-compose 1.1 上传harbor安装包并安装 [rootharbor ~]# tar xf harbor-offline-installer-v2.5.3.tgz [rootharbor ~]# cp harbor.yml.tmpl harbor…

一篇文章带你了解各个程序员接单平台,让你选择不再迷茫!!!

相信现在很多程序员都已经走上了或者准备走上网上接单这条路,但是目前市面上的接单平台可谓五花八门,对于各个平台的优缺点,不同的程序员该如何选择适合自己的接单平台,你又是否了解呢? 接下来就让小编用一篇文章来为…

Axure动态面板的使用

一. 动态面板 Axure动态面板是Axure RP软件中的一个功能模块,用于创建交互式原型和模拟应用程序的动态效果。它可以模拟用户在应用程序中的操作流程,并展示不同状态之间的变化,提供更真实的用户体验。通过创建不同的状态和添加交互效果&…

springboot 学生信息管理

介绍 一个学生信息管理后台,适用于大作业,课设等 软件架构 springbootmybatisthymeleaf (前后端未分离) 安装教程 注:mysql数据库要8.0以上,,本地mysql新建一个名为 student 的空数据库&am…

ElasticSearch详细搭建以及常见错误high disk watermark [ES系列] - 第497篇

导读 历史文章(文章累计490) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六…

每个开发人员都应该知道的六个生成式 AI 框架和工具

在快速发展的技术环境中,生成式人工智能是一股革命性的力量,它改变了开发人员处理复杂问题和创新的方式。本文深入探讨了生成式 AI 的世界,揭示了对每个开发人员都至关重要的框架和工具。 1. LangChain LangChain 由 Harrison Chase 开发并于…