Java进阶学习笔记19——内部类

1、 内部类:

是类中五大成分之一(成员变量、方法、构造函数、内部类、代码块),如果一个类定义在另一个 类的内部,这个类就是内部类。

场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。

内部类的四种形式:

成员内部类:了解

静态内部类:了解

局部内部类:了解

匿名内部类:重点

成员内部类:

就是类中的一个普通成员,类似前面我们学过的普通的成员变量、成员方法。

Outer类:

内含内部类:

package cn.ensource.d1_inner_class1;public class Outer {private int age = 99;public static String a;// 普通成员内部类public class Inner{private String name;private int age = 88;public static String schoolName;  // JDK16才支持静态成员的public void test() {System.out.println(age);System.out.println(a);int age = 66;// 66System.out.println(age);// 88System.out.println(this.age);// 99System.out.println(Outer.this.age);}public String getName() {return name;}public void setName(String name) {this.name = name;}}
}

测试类:

package cn.ensource.d1_inner_class1;public class Test {public static void main(String[] args) {// 目标:了解成员内部类Outer.Inner in = new Outer().new Inner();in.test();}
}

注意:

JDK16之前,成员内部类中不能定义静态成员,JDK16开始也可以定义静态成员了。

创建对象的格式:

成员内部类中访问其他成员的特点:

1)和前面学过的实例方法一样,成员内部类的实例方法中,同样可以直接访问外部类的实例成员、静态成员。

2)可以在成员内部类的实例方法中,拿到当前外部类对象,格式: 外部类名.this

静态内部类:

所谓静态内部类,有static修饰符的内部类,属于外部类自己持有。

静态内部类是外部类持有的。

Outer类:包含静态内部类:

package cn.ensource.d1_inner_class2;public class Outer {private int age;public static String schoolName;// 静态内部类public static class Inner {private String name;public static int a;public void test() {
//            System.out.println(age);  // 只能通过外部类对象访问System.out.println(schoolName);}public String getName() {return name;}public void setName(String name) {this.name = name;}public static int getA() {return a;}public static void setA(int a) {Inner.a = a;}}public static void test2() {System.out.println(schoolName);
//        System.out.println(age);}
}

 测试类:

package cn.ensource.d1_inner_class2;public class Test {public static void main(String[] args) {// 目标:了解静态内部类Outer.Inner in = new Outer.Inner();in.getName();in.test();}
}

特别要注意的是:

可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。

外部类的实例成员只能通过外部类对象来访问。

局部内部类:

局部内部类是定义在方法中,代码块中,构造器等执行体中。

匿名内部类:(重点)

就是一种特殊的局部内部类;所谓匿名:指的是程序员不需要为这个类声明名字。

package d3_inner_class3;public class Test {public static void main(String[] args) {// 目标:掌握匿名内部类,并掌握其作用Animal a = new Cat();   // 创建子类对象a.cry();}
}class Cat extends Animal {@Overridepublic void cry() {System.out.println("喵喵~");}
}abstract class Animal {public abstract void cry();
}

进化:

package d3_inner_class3;public class Test {public static void main(String[] args) {// 目标:掌握匿名内部类,并掌握其作用
//        Animal a = new Cat();   // 创建子类对象
//        a.cry();// 我们只要创建一下子类对象就可以了,不需要经常性的创建子类// 匿名内部类// 把这个匿名内部类编译成一个子类,然后会立即创建一个子类出来Animal a = new Animal() {@Overridepublic void cry() {System.out.println("喵喵~");}};a.cry();}
}class Cat extends Animal {@Overridepublic void cry() {System.out.println("喵喵~");}
}abstract class Animal {public abstract void cry();
}

匿名内部类的概念。

匿名内部类本质上是不是一个子类呢?

反编译可以看到这个匿名类是Animal的子类。

编译生成一个匿名的构造方法。

并且有内部方法cry方法。

特点:匿名内部类本质就是一个子类,并会立即创建出一个子类对象。

作用:用于更方便地创建一个子类对象。

匿名内部类的常见使用场景:

通常作为一个参数传递给方法。

package d3_inner_class3;public class Test2 {public static void main(String[] args) {// 目标:掌握匿名内部类的使用场景:Swimming s1 = new Swimming(){@Overridepublic void swim() {System.out.println("狗游泳!");}};go(s1);Swimming s2 = new Swimming() {@Overridepublic void swim() {System.out.println("猫游泳!");}};go(s2);}// 设计一个方法,可以接收swimming接口的一切实现类对象进来参加游泳比赛// go 表示开始参加比赛public static void go(Swimming s) {System.out.println("开始----------");s.swim();}
}// 猫和狗都要参加有用比赛
interface Swimming{void swim();
}

匿名内部类有啥特点:

匿名内部类本质上就是一个子类,并会立即创建出一个子类对象。

匿名内部类有啥作用、应用场景?

可以更方便创建出一个子类对象。

匿名内部类通常作为一个参数传递给方法。

拓展:

package cn.ensource.d4_inner_class5;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class Test {public static void main(String[] args) {// 拓展:内部类在开发中的真实使用场景// GUI编程:// 1. 创建窗口JFrame win = new JFrame("登录");JPanel panel = new JPanel();win.add(panel);JButton btn = new JButton("登录");panel.add(btn);// 给按钮绑定单击事件监听器// 调别人的匿名内部类,需要用的时候才用// 真实应用场景btn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {JOptionPane.showMessageDialog(win, "登录一下");}});win.setSize(400, 400);win.setLocationRelativeTo(null);win.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);win.setVisible(true);}
}

最终目的是为了简化代码。

箭头语法后面会讲得。

匿名内部类,我们需要的时候才会用。

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

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

相关文章

Android ART 虚拟机简析

源码基于:Android U 1. prop 名称选项名称heap 变量名称功能 dalvik.vm.heapstartsize MemoryInitialSize initial_heap_size_ 虚拟机在启动时,向系统申请的起始内存 dalvik.vm.heapgrowthlimit HeapGrowthLimit growth_limit_ 应用可使用的 max…

Scikit-Learn朴素贝叶斯

Scikit-Learn朴素贝叶斯 1、朴素贝叶斯1.1、贝叶斯分类1.2、贝叶斯定理1.3、贝叶斯定理的推导1.4、朴素贝叶斯及原理1.5、朴素贝叶斯的优缺点2、Scikit-Learn朴素贝叶斯2.1、Sklearn中的贝叶斯分类器2.2、Scikit-Learn朴素贝叶斯API2.3、Scikit-Learn朴素贝叶斯实践(新闻分类与…

爬山算法的详细介绍

目录 🍉概述 🍉 步骤 🍉 优缺点 🍈优点 🍈缺点 🍈应对策略 🍉示例 🍈旅行商问题 🍍步骤 🍍分解代码 🍎包含头文件 🍎定义函…

Cortex-M3的SysTick 定时器

目录 概述 1 SysTick 定时器 1.1 SysTick 定时器功能介绍 1.2 SysTick 定时器功能实现 1.3 SysTick在系统中的作用 2 SysTick应用的实例 2.1 建立异常服务例程 2.2 使能异常 2.3 闹钟功能 2.4 重定位向量表 2.5 消灭二次触发 3 SysTick在FreeRTOS中的应用 3.1 STM…

在docker中运行SLAM十四讲程序

《十四讲》的示例程序依赖比较多,而且系统有点旧。可以在容器中运行。 拉取镜像 docker pull ddhogan/slambook:v0.1这个docker对应的github:HomeLH/slambook2-docker 拉下来之后,假如是Windows系统,需要使用XLaunch用于提供X11…

面试大杂烩之kafka

面试这个领域最近环境不行,所以卷起来流量挺大 关于K8s 其实看我之前的博客,k8s刚有点苗头的时候我就研究过,然后工作的时候间接接触 也自己玩过 但是用的不多就忘记了,正苦于不知道写什么,水一篇 用来面试应该是够了…

C++ | Leetcode C++题解之第111题二叉树的最小深度

题目&#xff1a; 题解&#xff1a; class Solution { public:int minDepth(TreeNode *root) {if (root nullptr) {return 0;}queue<pair<TreeNode *, int> > que;que.emplace(root, 1);while (!que.empty()) {TreeNode *node que.front().first;int depth que…

huggingface 笔记:PretrainModel

1 from_pretrained 从预训练模型配置中实例化一个 PyTorch 预训练模型默认情况下&#xff0c;模型使用 model.eval() 设置为评估模式&#xff08;Dropout 模块被禁用&#xff09; 要训练模型&#xff0c;应该首先使用 model.train() 将其设置回训练模式 1.1 主要参数 pretra…

java 子类继承父类

为什么需要继承 我现在要有两个类一个 一个是小学生&#xff0c;一个是大学生 代码 小学生 package b; public class encapsulatio{public String name;public int age;public double score;public void setscore (double score) {this.scorescore;}public void testing() {S…

(三)MySQL 索引

欢迎访问 什么是索引&#xff1f; 提高查询效率的一种数据结构&#xff0c;索引是数据的目录 索引的分类 按「数据结构」分类&#xff1a;Btree索引、Hash索引、Full-text索引。按「物理存储」分类&#xff1a;聚簇索引、二级索引。按「字段特性」分类&#xff1a;主键索引…

Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤)

详细实现操作步骤 具体实现内容&#xff1a;我们运用 Spring6 和 MyBatis 实现一个转账操作(该转账操作&#xff0c;进行一个事务上的控制&#xff0c;运用 MyBatis 执行 SQL 语句)。 第一步&#xff1a;准备数据库表 使用t_act表&#xff08;账户表&#xff09; 连接数据库的…

三个有意思的链表面试题的完成

上一篇博客我们已经完成了链表的所有内容&#xff0c;那么这一篇博客我们来看一下三个特别有意思的链表题目。 **第一个题目如下&#xff1a;**相信不少朋友看到这题目就已经晕了&#xff0c;那就简单说明下这个题目&#xff0c;题目就是创建一个链表&#xff0c;其中每个节点…

Android14 - 绘制系统 - 概览

从Android 12开始&#xff0c;Android的绘制系统有结构性变化&#xff0c; 在绘制的生产消费者模式中&#xff0c;新增BLASTBufferQueue&#xff0c;客户端进程自行进行queue的生产和消费&#xff0c;随后通过Transation提交到SurfaceFlinger&#xff0c;如此可以使得各进程将缓…

【vue3+elementuiplus】el-select下拉框会自动触发校验规则

场景&#xff1a;编辑弹框省份字段下拉框必填&#xff0c;触发方式change&#xff0c;有值第一次打开不会触发校验提示&#xff0c;关闭弹框再次打开触发必填校验提示&#xff0c;但是该字段有值 问题的原因是&#xff1a;在关闭弹层事件中&#xff0c;我做了resetfileds&…

SpringBoot + MybatisPlus

SpringBoot MybatisPlus 整合记录 1. 硬件软件基本信息2. 相关链接3. 通过idea快速生成一个Springboot项目4. 启动报错问题解决问题一&#xff1a;Springboot启动的时候报错提示 “没有符合条件的Bean关于Mapper类型”问题二&#xff1a;启动的时候提示需要一个Bean&#xff0…

电磁仿真--CST网格介绍

1. 简介 网格会影响仿真的准确性和速度&#xff0c;花时间理解网格化过程是很重要的。 CST 中可用的数值方法包括FIT、TLM、FEM、MoM&#xff0c;使用不同类型的网格&#xff1a; FIT和TLM&#xff1a;六面体 FEM&#xff1a;四面体、平面 MoM&#xff1a;表面 CFD&#…

深入理解与防御跨站脚本攻击(XSS):从搭建实验环境到实战演练的全面教程

跨站脚本攻击&#xff08;XSS&#xff09;是一种常见的网络攻击手段&#xff0c;它允许攻击者在受害者的浏览器中执行恶意脚本。以下是一个XSS攻击的实操教程&#xff0c;包括搭建实验环境、编写测试程序代码、挖掘和攻击XSS漏洞的步骤。 搭建实验环境 1. 安装DVWA&#xff…

【408真题】2009-16

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

推荐一个快速开发接私活神器

文章目录 前言一、项目介绍二、项目地址三、功能介绍四、页面显示登录页面菜单管理图表展示定时任务管理用户管理代码生成 五、视频讲解总结 前言 大家好&#xff01;我是智航云科技&#xff0c;今天为大家分享一个快速开发接私活神器。 一、项目介绍 人人开源是一个提供多种…

Golang | Leetcode Golang题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; func hasPathSum(root *TreeNode, sum int) bool {if root nil {return false}if root.Left nil && root.Right nil {return sum root.Val}return hasPathSum(root.Left, sum - root.Val) || hasPathSum(root.Right, sum - roo…