Java 内部类

目录

一、什么是内部类及为何要有内部类

二、四种内部类

 1.成员内部类 

 成员内部类定义:

获取成员内部类对象的方法:

成员内部类获取外部类变量:

 额外:

2.局部内部类

局部内部类定义:

如何实现内部类当中的方法:

3.静态内部类 

静态内部类定义

 获取静态内部类对象的方法:

静态内部类获取外部变量:

调用静态内部类方法:

4.匿名内部类


一、什么是内部类及为何要有内部类

内部类是指在一个类的内部定义的另一个类。它可以访问外部类的成员,并且可以被外部类的成员访问。

内部类有以下好处:

  1. 封装性:内部类可以访问外部类的私有成员,这样可以增强了封装性,外部类的私有成员不需要暴露给外部类以外的类,可以被内部类私有化访问。

  2. 实现多继承:内部类在Java中类似于C++中的多重继承。一个类可以有多个内部类,每个内部类可以继承自不同的类或实现不同的接口,从而实现多继承的效果。

  3. 隐藏实现细节:内部类可以对实现细节进行隐藏,外部类无法直接访问内部类的方法和属性,只能通过外部类对象来访问。

  4. 回调机制:通过内部类可以实现回调机制,内部类可以访问外部类的方法和成员,可以在内部类中引用外部类对象的方法,实现回调功能。

  5. 方便访问外部类的成员:外部类可以访问内部类的私有成员,这使得外部类可以很方便地访问内部类的属性和方法,而不需要通过公共的接口或方法。

  6. 高级别的封装和模块化:内部类可以将一些逻辑相关的代码集中在一起,使得外部类更加简洁和模块化。内部类可以隐藏在外部类中,只在需要的时候才暴露给外部程序。 

二、四种内部类

 1.成员内部类 

 成员内部类定义:


成员内部类是定义在一个类的内部,并直接于类的成员位置,相当于该内部类与外部类当中的成员变量和成员方法处于同等地位。它可以访问外部类的所有成员,包括私有成员。成员内部类的定义格式为:外部类.内部类 内部类对象 = 外部类对象.new 内部类()。

public class OuterClass {private int num;public class InnerClass {public void display() {System.out.println("num:" + num);}}
}

获取成员内部类对象的方法:

OuterClass outerObj = new OuterClass();  // 创建外部类对象
OuterClass.InnerClass innerObj = outerObj.new InnerClass();  // 创建成员内部类对象//或者OuterClass.InnerClass oi = new outerObj().new InnerClass();

请注意:如果成员内部类被私有(private)或受保护(protected)修饰,外部类是无法直接访问和创建成员内部类的对象的。

但仍然有几种方式可以获取成员内部类的对象: 

在外部类中提供一个公共的方法来获取成员内部类的对象。在该公共方法中,可以通过创建内部类对象并返回它来实现获取成员内部类的对象。

public class OuterClass {private class InnerClass {// ...}private InnerClass createInnerInstance() {return new InnerClass();}public void outerMethod() {InnerClass innerObj = createInnerInstance();// 使用 innerObj 进行操作}
}

成员内部类获取外部类变量:

成员内部类可以直接调用外部类的变量,但是如果成员内部类当中存在与外部类重名的变量可以参考如下代码:

public class OuterClass {private int outerVariable = 10;public class InnerClass {private int outerVariable = 20;public void printOuterVariable() {System.out.println("Inner variable: " + outerVariable);System.out.println("Outer variable: " + OuterClass.this.outerVariable);}}
}

 额外:

在JDK 16以前 是不能在成员内部类里面定影一个静态的变量的

2.局部内部类

局部内部类定义:

局部内部类地位处于外部类的局部位置,与外部类的局部变量处于同等地位。局部内部类是定义在一个方法或作用域内部的类。它只能在所在的方法或作用域内被访问,无法从外部进行访问。局部内部类的定义格式为:在方法或作用域内定义的类。 

public class OuterClass {public void display() {class LocalInnerClass {public void print() {System.out.println("局部内部类");}}LocalInnerClass innerObj = new LocalInnerClass();innerObj.print();}
}

 局部内部类的对象只能在所在方法或作用域内创建和使用,无法在外部进行访问。

局部内部类的作用范围在定义它的代码块内部,对外部类的其他方法和代码块都是不可见的

该类可直接访问外部类的成员和方法内的局部变量 

如何实现内部类当中的方法:

在测试类当中 获取外部类的对象,用该对象来调用包含局部内部类的成员方法 

3.静态内部类 

静态内部类定义

静态内部类是定义在一个类的内部,且被static修饰的类。静态内部类属于成员内部类的一种,静态内部类独立于外部类的对象存在,可以直接通过外部类访问,即外部类.静态内部类。

public class OuterClass {private static int num;public static class StaticInnerClass {public void display() {System.out.println("静态内部类,num:" + num);}}}

 获取静态内部类对象的方法:

OuterClass.StaticInnerClass innerObj = new OuterClass.StaticInnerClass();  // 创建静态内部类对象

静态内部类获取外部变量:

静态内部类可以访问外部类的静态成员和非静态成员。如果需要访问外部类的非静态成员,需要通过创建外部类的对象来访问:

OuterClass outerObj = new OuterClass();
outerObj.nonStaticMethod(); // 访问外部类的非静态方法

调用静态内部类方法:

1.非静态方法:需先创建内部类的对象

2.静态方法 :直接Outer.Inner.method();即可

4.匿名内部类

匿名内部类是一种没有命名的内部类,它通常用于创建接口、抽象类的非静态对象。匿名内部类没有构造方法,通过实例初始化块来实现特定的初始化操作。

格式:

interface MyInterface { //接口public abstract void display();//抽象方法
}new MyInterface (){
@Overridepublic void display(){
//重写该方法}
};

匿名内部类会直接实现接口或继承抽象类,并重写方法。创建匿名内部类的同时创建了该类的对象。旨在完成一些简单或者一次性操作的时候不需要创建一些类

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

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

相关文章

【opencv】多版本安装

安装opencv3.2.0以及对应的付费模块 一、安装多版本OpenCV如何切换 按照如下步骤安装的OpenCV,在CMakeLists.txt文件中,直接指定opencv的版本就可以找到相应版本的OpenCV,为了验证可以在CMakeLists.txt文件中使用如下指令输出版本验证&…

二、创建个人首页页面

简介 改造 App.vue 创建一个展示页面,实现一个可以轮播的功能效果。欢迎访问个人的简历网站预览效果 本章涉及修改与新增的文件:style.css、App.vue、assets 一、 自定义全局样式 将 style.css 中的文件样式内容替换为如下代码 /* 初始化样式 --------------------------…

python-爬虫-xpath方法-批量爬取王者皮肤图片

import requests from lxml import etree获取NBA成员信息 # 发送的地址 url https://nba.hupu.com/stats/players # UA 伪装 google header {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.3…

CSS笔记(黑马程序员pink老师前端)盒子阴影,文字阴影

盒子阴影 属性值为box-shadow,盒子阴影不占空间,不影响盒子之间的距离. 值说明h-shadow必需,水平阴影位置,允许为负值v-shadow必需,水平阴影位置,允许为负值blur可选,模糊距离,数值越大影子越模糊spread可选,影子的尺寸color可选,影子的颜色inset可选, 将外阴影改为内阴影(省…

微服务04-Gateway网关

作用 身份认证:用户能不能访问 服务路由:用户访问到那个服务中去 负载均衡:一个服务可能有多个实例,甚至集群,负载均衡就是你的请求到哪一个实例上去 请求限流功能:对请求进行流量限制,对服务…

sklearn中make_blobs方法:聚类数据生成器

sklearn中make_blobs()方法参数: n_samples:表示数据样本点个数,默认值100 n_features:是每个样本的特征(或属性)数,也表示数据的维度,默认值是2。默认为 2 维数据,测试选取 2 维数据也方便进行可视化展示…

FPGA实战小项目2

基于FPGA的贪吃蛇游戏 基于FPGA的贪吃蛇游戏 基于fpga的数字密码锁ego1 基于fpga的数字密码锁ego1 基于fpga的数字时钟 basys3 基于fpga的数字时钟 basys3

Android 大图显示优化方案-加载Gif 自定义解码器

基于Glide做了图片显示的优化,尤其是加载Gif图的优化,原生Glide加载Gif图性能较低。在原生基础上做了自定义解码器的优化,提升Glide性能 Glide加载大图和Gif 尤其是列表存在gif时,会有明显卡顿,cpu和内存占用较高&…

lambda表达式介绍

前言 lambda表达式是C11标准才支持的,有了它以后在一些地方进行使用会方便很多,尤其在一些需要仿函数的地方,lambda表达式完全可以替代它的功能。代码的可读性也会提高。 目录 1.lambda表达式 2.lambda表达式语法 3.函数对象和lambda表达…

2023年MySQL实战核心技术第二篇

目录 五 . 日志系统:一条SQL更新语句是如何执行的? 5.1 解释 5.2 重要的日志模块:redo log 5.2.1 解释 5.2.2 WAL(Write-Ahead Logging) 5.2.3 crash-safe。 5.3 重要的日志模块:binlog 5.3 .1 为什么会有…

元素周期表-背诵元素周期表更简单

元素周期表是一款极其炫酷、简约的记忆和查看周期表元素的软件。 【软件特点】: ●有趣谐音速记:软 件内有按周期、化合价、元素符号分类使用谐音速记的小技巧。 ●3D元素周期表:用户可以选择按表面、球体、螺旋、网格来3D炫酷的展示元素周期…

小白备战大厂算法笔试(三)——栈、队列、双向队列

文章目录 栈栈常用操作栈的实现基于链表的实现基于数组的实现 两种实现对比栈典型应用 队列队列常用操作队列实现基于链表的实现基于数组的实现 队列典型应用 双向队列双向队列常用操作双向队列实现基于双向链表的实现基于数组的实现 双向队列应用 栈 栈是一种遵循先入后出的逻…

MySQL之用户管理

用户 用户信息 MySQL中的用户,都存储在系统数据库mysql的user表中 ps: host: 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆 user: 用户名 authentication_string: 用户…

【数据库事务日志碎片原理分析与方案】-分析篇

前言:说都数据库的事务日志,可以说我们是再熟悉不过的了。一般而言,我们都没有必 要去关心事务日志中的虚拟日志文件的个数。这里提到的“虚拟日志文件”的概念,我们 后面会进行专门的讲述。很多的时候,我们在建立数据库的时候&am…

使用Caffeine实现帖子的缓存来优化网站的运行速度

导入依赖 <!-- https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine --><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.7</version>…

PyCharm下载安装

PyCharm下载链接 点击下载PyCharm Community Edition社区版&#xff08;PyCharm Professional专业版需要收费&#xff0c;但可以免费试用 30 天&#xff0c;也可以找到激活方式&#xff1b;而社区版是完全免费的&#xff0c;初学者学习 Python建议使用社区版&#xff0c;不会有…

Kafka的文件存储与稀疏索引机制

![在这里插入图片描述](https://img-blog.csdnimg.cn/dde7fc866d214985baaa87300a472578.png)这些是存储在分区(分区才是实际的存储)文件中的. seg是逻辑概念 而实际由log存储的. index是偏移量索引而timeindex是时间戳索引 log就是seg 找数据就是先找log 再从log去找

MYSQL 高级SQL语句

1、按关键字排序&#xff1a; order by 语句用来实现 &#xff0c;前面可以使用where字句使查询结果进一步过滤 asc 是按照升序排序 &#xff0c; 默认的 desc 是按照降序排序 order by的语法结构 例&#xff1a;select name,score from ku order by score desc; 表示将数…

数字图像处理-形态学图像处理

形态学图像处理 一、基础知识1.1 什么是形态学操作 二、腐蚀与膨胀2.1 腐蚀2.2 膨胀 三、开操作与闭操作3.1 开操作3.2 闭操作3.3 实验对比 四、一些基本的形态学算法4.1边界提取4.2空洞填充4.3 凸壳 一、基础知识 1.1 什么是形态学操作 数字图像处理中的形态学操作是一组用于…

链路追踪Skywalking快速入门

目录 1 Skywalking概述1.1 微服务系统监控三要素1.2 什么是链路追踪1.2.1 链路追踪1.2.2 OpenTracing1、数据模型&#xff1a;2、核心接口语义 1.3 常见APM系统1.4 Skywalking介绍1、SkyWalking 核心功能&#xff1a;2、SkyWalking 特点&#xff1a;3、Skywalking架构图&#x…