Java的内部类

Java内部类

什么是内部类?

  • 类的五大成员:属性、方法、构造方法、代码块、内部类
  • 在一个类的里面,再定义一个类
public class Outer { // 外部类class Inner { // 内部类}
}
public class Test { // 外部其他类public static void main(String[] args) {}
}
  • 内部类表示的事物是外部类的一部分

  • 内部类单独出现没有任何意义

内部类的访问特点:

  1. 内部类可以直接访问外部类的成员,包括私有
  2. 外部类要访问内部类的成员,必须创建对象

内部类的分类

  • 成员内部类
  • 静态内部类
  • 局部内部类
  • 匿名内部类

1、成员内部类

  • 写在成员位置的,属于外部类的成员
  • 成员内部类可以被一些修饰符所修饰,比如:private,默认,protectedpublicstatic
  • 在成员内部的类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量
1.1获取成员内部类对象的两种方法:
  1. 在外部类的编写方法,对外提供内部类的对象
  2. 直接创建格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;

示例

public class Outer { // 外部类String name;int a;class Inner { // 内部类int a = 10;}private class Iner { // (私密)内部类int a = 10;public void sj() {System.out.println("我是私密的内部类");}}public Iner getIner() { // 获取私密内部类的方法return new Iner();}public void getmessageIner() { // 获取私密内部类中内容的方法Iner in = getIner();System.out.println(in.a); // 输出: 10in.sj(); // 输出: 我是私密的内部类}
}
package com.inner.a01innerclassdemo01;public class Test { // 测试类public static void main(String[] args) {// 默认访问修饰符  直接创建内部类Outer.Inner oi = new Outer().new Inner();System.out.println(oi.a); // 输出: 10// 如果加上私有的private修饰符// 要么改变访问修饰符,要么在外部类编写方法,对外提供内部类对象Outer o = new Outer();Object iner = o.getIner();// 但也只能通过它的父类Object获取它(多态),但并不能使用它(因为父类是Object)// 如果要想使用它内部的成员变量和方法,只能在外部类中创建公共方法o.getmessageIner();}
}
1.2当外部类变量重名时:

外部类成员变量和内部类成员变量重名时,使用外部类名.this.变量名

public class Outer {private int a = 10;class Inner {private int a = 20;public void show() {int a = 30;System.out.println(Outer.this.a); // 输出: 10System.out.println(this.a); // 输出: 20System.out.println(a); // 输出: 30}}
}
1.3成员内部类的内存图:

在这里插入图片描述

  1. 测试类的字节码文件加载到内存,虚拟机会自动调用main方法,main方法会加载进栈
  2. 第一行代码,发现用到了OuterInner,所以就会把外部类和内部类的字节码文件加载到方法区(两个独立的字节码文件)。等号左边,在栈区开辟一个空间用来记录Inner对象的地址值;等号右边,分为两个部分,第一部分new Outer()会在堆区开辟一个新空间存放外部类对象,第二部分new Inner()会在堆区再次开辟一个空间存放内部类对象,同时Java还会给内部类的对象,去加一个隐藏的成员变量this——用在记录外部类成员对象的地址值,并将内部类对象的地址值返回给栈区的oi变量
  3. 第二行代码,调用oishow方法,此时show方法会被加载建栈,此时的调用者的地址值是002,第一条输出语句,就近原则;第二条输出语句,打印调用者里面的变量;第三条输出语句,有Outer前缀,会先从内部类对象中找到外部类对象的地址001,在打印外部类里面的变量

2、静态内部类

​ 静态内部类是一种特殊的成员内部类

​ 静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。

public class Outer { // 外部类static class Inner { // 静态内部类}
}
2.1创建静态内部类的格式:
  • 外部类名.内部类名 对象名 = new 外部类名.内部类名();
  • 调用非静态方法的格式:先创建对象,用对象调用
  • 调用静态方法的格式:外部类名.内部类名.方法名();

示例

public class Outer { // 外部类// 静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象int a = 10;static int b = 20;// 静态内部类static class Inner {public void show01() {// 会报错
//            System.out.println(a);// 若想要访问外部类中的对象 则需要创建对象Outer o = new Outer();System.out.println(o.a);	// 输出: 10System.out.println(b);		// 输出: 20System.out.println("非静态的方法被调用了");}public static void show02() {// 报错
//            System.out.println(a);Outer o = new Outer();System.out.println(o.a);	// 输出: 10System.out.println(b);		// 输出: 20System.out.println("静态的方法被调用了");}}
}
public class Test {public static void main(String[] args) {// 创建静态内部类的对象// 只要是静态的东西,都可以用类名.直接调用Outer.Inner oi = new Outer.Inner();oi.show01();// 若想要调用静态方法oi.show02();// 这种方法可以,但不提倡// 可以通过类名直接调用静态方法Outer.Inner.show02();}
}

3、局部内部类

  1. 将内部类的定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。(不能使用四大权限修饰符,可以使用final等)
  2. 外界是无法直接使用,需要在方法内部创建对象并使用。
  3. 该类可以直接访问外部类的成员,也可以访问方法内的局部变量。

示例

public class Outer { // 外部类int a = 10;public void show() {int b = 20;// 局部内部类class Inner {String name;// 该类可以直接访问外部类的成员int age = a;public void method01() {System.out.println(a);  // 输出: 10System.out.println(b);  // 输出: 20System.out.println("局部内部类中的method01方法");}public static void method02() {System.out.println("局部内部类中的method02方法");}}// 要想访问,必须在方法内部创建对象并使用Inner i = new Inner();System.out.println(i.name); // 输出: nullSystem.out.println(i.age);  // 输出: 10i.method01();Inner.method02();}
}
public class Test { // 测试类public static void main(String[] args) {Outer o = new Outer();o.show();}
}

4、匿名内部类

  • 匿名内部类的本质上就是隐藏了名字的内部类。(只是自己没写名字,编译java会自己生成相应的class文件——Test$1.class数字依次累加)

  • 隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置。

4.1使用场景:
  • 当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类对象只要使用一次,就可以用匿名内部类简化代码
4.2匿名内部类的格式:
new 类名或者接口名() {重写方法;
};
4.3格式的细节:
  • 包含了继承或实现,方法重写,创建对象。整体就是一个类的子类对象或者接口的实现对象

示例

public interface Swim { // Swim接口public abstract void swim();
}
public abstract class Animal { // Animal抽象类public abstract void show();
}
public class Test { // 测试类public static void main(String[] args) {use(new Swim() {@Overridepublic void swim() {System.out.println("打印重写的游泳接口");}});use(new Animal() {@Overridepublic void show() {System.out.println("打印重写的动物类");}});// 也可以直接使用new Animal() {@Overridepublic void show() {System.out.println("重写了动物这个类中的方法");}}.show(); // 重写了动物这个类中的方法Swim s = new Swim() {@Overridepublic void swim() {System.out.println("重写了游泳的接口");}};s.swim(); // 重写了游泳的接口}// 使用匿名内部类public static void use(Swim s) {// 相当于Swim s = new Swim(){};s.swim(); // 打印重写的游泳接口}public static void use(Animal a) {// 相当于Animal a = new Animal(){};a.show(); // 打印重写的动物类}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

WPF+MVVM案例实战(二十二)- 制作一个侧边弹窗栏(CD类)

文章目录 1、案例效果1、侧边栏分类2、CD类侧边弹窗实现1、样式代码实现2、功能代码实现3 运行效果4、源代码获取1、案例效果 1、侧边栏分类 A类 :左侧弹出侧边栏B类 :右侧弹出侧边栏C类 :顶部弹出侧边栏D类 :底部弹出侧边栏2、CD类侧边弹窗实现 1、样式代码实现 在原有的…

字符串算法

字符串 1.kmp匹配算法Anya and 1100 1.kmp匹配算法 模板题链接 不懂可以看这个~详细的思路 #include <string> #include <iostream>using namespace std; const int N 1000010;string s,p;// s[]是长文本&#xff0c;p[]是模式串&#xff0c;n是s的长度&#xff…

掌控板micropython编程实现OLED显示天气信息

掌控板micropython编程实现OLED显示天气信息 上一个例子已经实现了在掌控板的OLED上显示汉字&#xff0c;本例使用掌控板的wifi访问心知天气&#xff0c;获取天气信息显示在掌控板的OLED上。 访问心知天气主页&#xff08; https://www.seniverse.com/&#xff09;&#xff0…

golang通用后台管理系统03(登录校验,并生成token)

代码 package serviceimport ("fmt"//"fmt""gin/common""gin/config"sysEntity "gin/system/entity"sysUtil "gin/system/util""github.com/gin-gonic/gin""log" )func Login(c *gin.Contex…

三维测量与建模笔记 - 2.2 射影几何

教程中H矩阵写的有问题&#xff0c;上图中H矩阵应该是&#xff08;n1) x (m1) 共点不变性,下图中黄色方块标记的点&#xff0c;在射影变换前后&#xff0c;虽然直线的形状有所变化&#xff0c;但仍然相交于同一个点。 共线不变性&#xff0c;下图黄色标记的两个点&#xff0c;在…

操作系统(10) (并发(2)------基于软件/硬件/操作系统层面解决两个进程之间的临界区问题/抢占式/非抢占式内核)

目录 1. 基于软件层面(Petersons Solution) Petersons Solution 满足三个要求: 好处: 缺点 2. 基于硬件层面 1. Disabling Interrupts (禁用中断) 概念解释&#xff1a; 代码框架&#xff1a; 要求&#xff1a; 禁用中断的好处与问题&#xff1a; 2. Test and Set Lock (…

系统架构设计师-未来信息综合技术(1)

目录 一、信息物理系统CPS 1、CPS体系结构 2、CPS的技术体系 3、CPS的应用场景 二、人工智能技术 1、人工智能关键技术 2、人工智能&#xff08;AI&#xff09;芯片 一、信息物理系统CPS 定义&#xff1a;CPS通过集成先进的感知、计算、通信、控制等信息技术和自动控制技术&a…

支持向量机背后的数学奥秘

一、基本概念与原理 1.1 支持向量机的定义 支持向量机是一种二分类模型&#xff0c;其核心思想是在样本空间中寻找一个超平面&#xff0c;将不同类别的样本分开。这个超平面被称为决策边界或分隔超平面。支持向量是距离决策边界最近的点&#xff0c;这些点决定了决策边界的位…

LeetCode 热题100 之 回溯1

1.全排列 思路分析1&#xff08;回溯&#xff09;&#xff1a;要生成一个不含重复数字的数组 nums 的所有可能全排列&#xff0c;我们可以使用回溯算法。这种算法通过递归的方法探索所有可能的排列组合&#xff0c;并在合适的时机进行回溯&#xff0c;确保不会遗漏任何排列。回…

「C/C++」C/C++ 之 变量作用域详解

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

深度学习-如何计算神经网络的输出?

给定一个包含输入层、隐藏层和输出层的神经网络架构&#xff0c;可以逐层推导出各节点的输出值。具体步骤如下&#xff1a; 输入层计算&#xff1a; 输入层有 3 个节点&#xff0c;编号为 1、2、3&#xff0c;输入向量为 x_1, x_2, x_3 。输入层节点的输出值直接就是输入向量&a…

【ESP32】ESP-IDF开发 | I2C从机接收i2c_slave_receive函数的BUG导致程序崩溃解决(idf-v5.3.1版本)

1. 问题 在调试I2C外设的demo时&#xff0c;按照官方文档的描述调用相关API&#xff0c;烧录程序后发现程序会不断崩溃&#xff0c;系统log如下。 初步分析log&#xff0c;原因是访问到了不存在的地址。一开始我以为是自己的代码问题&#xff0c;反反复复改了几次都会出现同样的…

vue3学习记录-nextTick

vue3学习记录-nextTick 1. 案例场景2. 使用方法2.1 回调方式2.2 async&#xff0c;await 3.原理 1. 案例场景 聊天框实现输入内容&#xff0c;滚动条默认滚到最底部。 <template><div class"chat_box"><div class"chat_list" ref"chat…

microsoft defender smartscreen怎么关闭

打开windows安全中心 点击基于声誉的保护设置 把检查应用和文件等开关关掉即可

【c++日常刷题】两个数字的交集、点击消除、最小花费爬楼梯

两个数字的交集⭐ 两个数组的交集_牛客题霸_牛客网 (nowcoder.com) 题目描述&#xff1a; 解题思路&#xff1a; 通过遍历num1&#xff0c;如果遍历到的元素如果在num2中能找到&#xff0c;则这是num1和num2的公告元素&#xff1b; 这里需要借助两个数组来实现&#xff1a;…

【ACM出版,EI稳定检索,九大高校联合举办, IEEE Fellow支持】2024年计算机视觉与艺术研讨会(CVA 2024,11月29-12月1日)

大会官网&#xff1a;www.icadi.net (CVA为ICADI分会&#xff0c;网站沿用主会议&#xff1b;议程、出版将以主会为准&#xff09; 大会时间&#xff1a;2024年11月29-12月1日 大会地点&#xff1a;中国-天津 终轮截稿&#xff1a;2024年11月22号&#xff08;特殊情况联系会…

Leetcode—3216. 交换后字典序最小的字符串【简单】

2024每日刷题&#xff08;196&#xff09; Leetcode—3216. 交换后字典序最小的字符串 实现代码 class Solution { public:int flagodd_even(int num) {if(num % 2) {// 奇数return 1;} else {// 偶数return 0;}}string getSmallestString(string s) {int n s.length();int …

HarmonyOS Next星河版笔记--界面开发(3)

属性 1.1.设计资源-svg图标 需求&#xff1a;界面中展示图标→可以使用的svg图标(任意放大缩小不失真、可以改变颜色) 使用方式&#xff1a; ①设计师提供&#xff1a;基于项目的图标&#xff0c;拷贝到项目目录使用 Image($r(app.media.ic_dianpu)) .width(40) fillColor…

从数据提取到管理:TextIn平台的全面解析与产品体验

一、引言 在现代信息时代&#xff0c;文档解析和管理已经成为企业和开发者不可或缺的工具。TextIn是合合信息旗下的一款智能文档处理平台&#xff0c;为开发者和企业提供高效、精准的文档解析工具&#xff0c;帮助用户轻松应对各种复杂的文档处理需求。本文将深入探讨TextIn的…

WorkFlow源码剖析——Communicator之TCPServer(中)

WorkFlow源码剖析——Communicator之TCPServer&#xff08;中&#xff09; 前言 上节博客已经详细介绍了workflow的poller的实现&#xff0c;这节我们来看看Communicator是如何利用poller的&#xff0c;对连接对象生命周期的管理。&#xff08;PS&#xff1a;与其说Communica…