java面向对象编程--高级(二)
目录
一、内部类
1.1 成员内部类
1.1.1 静态和非静态
1.1.2 调用外部类的结构
1.2 局部内部类
1.2.1 非匿名和匿名
1.2.2 比较
1.2.3 练习
二、枚举类
2.1 枚举类讲解
2.2 代码实现
三、包装类
3.1 包装类与基本数据类型
3.2 练习
3.3 补充
四、自动生成单元测试
一、内部类
1.什么是内部类?
- 将一个类A定义在另一个类B里面,里面的那个类A就称为`内部类(Innerclass)',类B则称为`外部类(0uterClass)
2.为什么需要内部类?
- 当一个事物A的内部,还有一个部分需要一个完整的结构B进行描述,而这个内部的完整的结构B又只为外部事物A提供服。
- 遵循`高内聚、低耦合'的面向对象开发原则。
3.内部类的分类

声明位置:
- 成员内部类:直接声明在外部类中
- 局部内部类:声明在方法内,构造器内,代码块内
1.1 成员内部类
成员内部类的理解:定义在外部类中的一个类。它可以访问外部类的所有成员,包括私有成员。
1.1.1 静态和非静态
要创建成员内部类的实例,首先需要创建外部类的实例,然后通过这个实例创建内部类的实例。
//非静态成员内部类
class Outer {private String Field = "外部";class Inner {void display() {System.out.println("访问: " + Field);}}
}public class Main {public static void main(String[] args) {Outer outer = new Outer(); // 创建外部类实例Outer.Inner inner = outer.new Inner(); // 创建内部类实例inner.display(); // 调用内部类的方法}
}
静态内部类不依赖于外部类的实例,可以直接通过外部类的类名来创建
//静态成员内部类
class Outer {private static String Field = "静态外部类";static class Inner {void display() {System.out.println("访问: " + Field);}}
}public class Main {public static void main(String[] args) {Outer.Inner Inner = new Outer.Inner(); // 直接通过外部类名创建Inner.display(); // 调用静态内部类的方法}
}
1.1.2 调用外部类的结构
public class Outer {private String Field = "外部类的私有字段";// 成员内部类class Inner {void display() {// 直接访问外部类的私有成员System.out.println("访问外部类的字段: " + Field);}}public void createInner() {Inner inner = new Inner();inner.display();}public static void main(String[] args) {Outer outer = new Outer();outer.createInner(); // 创建内部类并调用方法}
}
1.2 局部内部类
1.2.1 非匿名和匿名
package test3;public class OuterClassTest {public void mathod() {class A {//局部内部类//声明属性和方法}}//1.提供接口实现类的对象public Comparable getInstance() {class MyComparable implements Comparable{@Overridepublic int compareTo(Object o) {return 0;}}MyComparable myComparable = new MyComparable();return myComparable;//2.提供接口实现类的匿名对象/* public Comparable getInstance() {class MyComparable implements Comparable{ @Overridepublic int compareTo(Object o) {return 0;}}return new MyComparable();}*///3.提供接口的匿名实现类的对象/*Comparable m = new Comparable() {@Overridepublic int compareTo(Object o) {return 0;}};return 0;*///4.提供接口的匿名实现类的匿名对/*return new Comparable(){@Overridepublic int compareTo(Object o) {return 0;}};*/}
}
1.2.2 比较
- 非匿名局部内部类:有名字,可以创建多个实例,可以访问方法的局部变量(需要是final或effectively final)。
- 匿名局部内部类:没有名字,通常只用一次,方便快捷,适用于临时的任务或事件处理。
1.2.3 练习
创建一个匿名内部类,继承于Object,在其中声明一个 public void test() 打印猪八戒
public class OuterClassTest {public static void main(String[] args) {new Object(){public void test(){System.out.println("猪八戒");}}.test();}
}
二、枚举类
2.1 枚举类讲解
理解:枚举(enum)是一种特殊的类,用于表示一组常量。
使用:
- 开发中,如果针对于某个类,其实例是确定个数的。则推荐将此类声明为枚举类。
- 如果枚举类的实例只有一个,则可以看做是单例的实现方式。
枚举类实现接口的操作
- 枚举类实现接口,在枚举类中重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是同一个方法
- 让枚举类的每一个对象重写接口中的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是不同的实现的方法。
2.2 代码实现
例子:枚举类中创建四个季节,春夏秋冬,并实现接口操作
package test4;import static java.time.chrono.JapaneseEra.values;public class seasonTest {public static void main(String[] args) {Season[] values = Season.values();for (int i = 0; i < values().length; i++) {values[i].show();}}
}interface info{void show();
}
enum Season implements info{//默认的父类为Object,不需要特意声明//枚举类开头声明变量SPRING("春天","生机勃勃"){@Overridepublic void show() {System.out.println("春天在哪里");}},SUMMER("夏天","夏日炎炎"){@Overridepublic void show() {System.out.println("夏天吃雪糕");}},AUTUMN("秋天","秋高气爽"){@Overridepublic void show() {System.out.println("秋天的第一别奶茶");}},WINTER("冬天","白雪皑皑"){@Overridepublic void show() {System.out.println("冬天吃东北烤鸡架");}};private final String name;private final String Desc;Season(String name, String desc) {this.name = name;Desc = desc;}public String getName() {return name;}public String getDesc() {return Desc;}@Overridepublic String toString() {return "季节{" +"name='" + name + '\'' +", Desc='" + Desc + '\'' +'}';}//情况1 :枚举类中直接重写,调用时全部一样/* @Overridepublic void show() {System.out.println("这是季节中的一个");}*/
}
结果:

三、包装类
3.1 包装类与基本数据类型
1.为什么要使用包装类?
- 为了使得基本数据类型的变量具备引用数据类型变量的相关特征(比如:封装性、继承性、多态性),我们给各个基本数据类型的变量都提供了对应的包装类。
2. 有哪些包装类:

3.2 练习
如何转换:
(装箱)基本数据类型--->包装类:
- 使用包装类的构造器
- (建议)调用包装类的value0f(xxxxX)
(拆箱)包装类--->基本数据类型: 调用包装类的xxxValue()
注意:
- 原来使用基本数据类型变量的位置,改成包装类以后,对于成员变量来说,其默认值变化了!
1. 基本数据类型转换为包装类(装箱)
public class BoxingExample {public static void main(String[] args) {// 使用构造函数装箱int primitiveInt = 10;Integer wrappedInt = new Integer(primitiveInt);// 使用静态方法装箱Integer wrappedInt2 = Integer.valueOf(primitiveInt);System.out.println("装箱结果: " + wrappedInt);System.out.println("使用静态方法装箱结果: " + wrappedInt2);}
}
2. 包装类转换为基本数据类型(拆箱)
public class UnboxingExample {public static void main(String[] args) {// 装箱Integer wrappedInt = Integer.valueOf(10);// 使用方法拆箱int primitiveInt = wrappedInt.intValue();// 自动拆箱int autoUnboxedInt = wrappedInt; // Java 会自动转换System.out.println("拆箱结果: " + primitiveInt);System.out.println("自动拆箱结果: " + autoUnboxedInt);}
}
3. 自动装箱与自动拆箱
- 自动装箱:当基本数据类型赋值给包装类时,Java 自动将其转换为相应的包装类对象。
- 自动拆箱:当包装类对象赋值给基本数据类型时,Java 自动将其转换为相应的基本数据类型。
public class numberTest {int i1 = 10;Integer i11 = i1;Integer ii2 = i1+1;Boolean b1 = true;Float f1 = 12.4F;//上述都是自动装箱//下述是自动拆箱int i2 = i11;boolean b2 = b1;float f2 = f1;}
3.3 补充
如下图示:

基本数据类型、包装类 ---> String类型:
- ① 调用String的重载的静态方法value0f(xxx xx)
- ② 基本数据类型+ " "
String类型 ---> 基本数据类型、包装类:
- 调用包装类的静态方法:parseXxx()
代码示例:
public class numberTest {@Test//String类型转成基本数据类型 包装类public void test1(){String i1 = "123";int a1 = Integer.parseInt(i1);System.out.println(a1 + 10);String B1 = "true";boolean b2 = Boolean.parseBoolean(B1);System.out.println(b2);//错误类型/*String c1 = "123b";Integer d1 = Integer.parseInt(c1);System.out.println(d1);*/}@Testpublic void test2(){//方式1Integer i1 = 11;String i2 = String.valueOf(i1);System.out.println(i2);Boolean B1 = true;String b2 = String.valueOf(B1);System.out.println(b2);//方式2String C1 = i2+"";String C2 = b2+"";System.out.println(C2);System.out.println(C1);}}
四、自动生成单元测试
联网的情况下,输入 @Test,出现红灯并点击,选择Junit4.x下载
由于测试单元的格式是固定的,可以在IDEA中直接设计自动生成单元测试的模板。
找到文件,点击设置

进入设置后,点击编辑器,找到实时模板

有+号点击,先生成一个模板组,命名自拟

选中新建的组,点击+号,生成实时模板,缩写为test,描述:自动生成单元测试提示

然后点击更改,选中java,点击确定,即可

回到IDEA中测试一遍,实验成功


相关文章:
java面向对象编程--高级(二)
目录 一、内部类 1.1 成员内部类 1.1.1 静态和非静态 1.1.2 调用外部类的结构 1.2 局部内部类 1.2.1 非匿名和匿名 1.2.2 比较 1.2.3 练习 二、枚举类 2.1 枚举类讲解 2.2 代码实现 三、包装类 3.1 包装类与基本数据类型 3.2 练习 3.3 补充 四、自动生成单元测试…...
定时发送邮件
一、实验内容 在linux主机通过定时任务指定在每天12:12分定时发送邮件;邮件内容自定。 二、实验步骤 1.安装s-nali 2.编辑/etc/s-nail.rc 文件 3.配置文件 授权码获取:点击POP3/SMTP/IMAP,并且启用IMAP/SMTP服务 4、编辑任务定时器 三、…...
基于Java的免税商品优选购物商城设计与实现代码(论文+源码)_kaic
目 录 摘 要 Abstract 第一章 绪论 1.1 课题开发的背景 1.2 课题研究的意义 1.3 研究内容 第二章 系统开发关键技术 2.1 JAVA技术 2.2 MyEclipse开发环境 2.3 Tomcat服务器 2.4 Spring Boot框架 2.5 MySQL数据库 第三章 系统分析 3.1 系统可行性研究…...
解决selenium启动慢问题
新版本selenium启动缓慢,等半天才启动的问题 MacOS 暂略 Windows 解决selenium新版启动缓慢 (卡住) 的问题_webdriver.chrome()很慢-CSDN博客...
Springboot + zset + lua 实现滑动窗口
Component public class RedisRateLimiter {Autowiredprivate RedisTemplate<String, String> redisTemplate;private String luaScript() {return "redis.call(zremrangebyscore, KEYS[1], 0, tonumber(ARGV[1]) - tonumber(ARGV[2]) * 1000) " // 移除过期的…...
【深度学习】transformer为什么使用多头注意力极致?为什么不使用一个头
在现代深度学习中,Transformer 模型的多头注意力机制已被广泛应用,特别是在自然语言处理领域。最近我读到一篇有趣的博客文章,详细介绍了为什么 Transformer 采用多头注意力,而不是简单的单头注意力。文章从理论推导到代码实现,对多头注意力机制进行了深入分析。下面我为大…...
利用Excel数据合并到Word功能,官方名为“Word邮件合并”
### 利用Excel数据合并到Word功能,官方名为“Word邮件合并”简介 #### 引言 在日常办公场景中,我们经常需要将Excel中的数据批量插入到Word文档中,比如制作员工工资条、邀请函或是客户信息表等。传统的手工操作不仅耗时耗力,还容易…...
当代世界著名哲学家起名大师颜廷利:全球公认最厉害思想家
21世纪全球公认最厉害思想家颜廷利被认可的原因主要在于他在多个领域的深远影响和卓越贡献。 当代世界著名哲学家起名大师颜廷利教授是一位在思想、哲学、教育、易学、国学、心理学、命名学等多个领域具有深远影响的学者。他被誉为了“世界点赞第一人”,并且在国内外…...
Would you like conda to send this report to the core maintainers? [y/N]:
问题描述 pycharm 打开项目后,底部的进度条可能会一直卡住,提示:Would you like conda to send this report to the core maintainers? [y/N]: 有时候是在 Scanning installed packages,有时候是 Updating Python interpreter 操…...
数据结构编程实践20讲(Python版)—18哈希表
本文目录 18 哈希表(Hash Table)S1 说明特征解决问题S2 示例示例 1示例 2S3 应用应用1: LRU 缓存机制应用2:高级拼写检查器应用3:DNA 序列的 K-mer 计数往期链接 01 数组02 链表03 栈04 队列05 二叉树06 二叉搜索树07 AVL树08 红黑树09 B树10 B+树11 线段树12 树状数组13 …...
Html 标题加图标
每个网页选项卡都有一个图标: <meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>主页</title><link rel"icon" href"images/记事本.png&…...
机器学习探索性数据分析 (EDA)
机器学习探索性数据分析 (EDA) 探索性数据分析(Exploratory Data Analysis, EDA)是机器学习工作流中至关重要的一个步骤,通过深入分析和理解数据的结构、分布和相关性,EDA帮助揭示数据背后的故事,并为后续的建模提供有…...
【K8S系列】Kubernetes pod节点Pending或CrashLoopBackOff 问题及解决方案详解【已解决】
在 Kubernetes 中,Pod 是最小的可调度单元,负责运行容器。当 Pod 的状态显示为 Pending 或 CrashLoopBackOff 时,意味着它无法成功启动或持续崩溃。本文将详细分析这两种状态的原因、排查步骤、执行后的结果及相应的解决方案。 一、Pod 状态概…...
【Redis】Zset类型常用命令
文章目录 一. Zset有序集合简介.二. 添加元素相关命令.2.1 向有序集合中添加元素(zadd) 三. 查询元素相关操作.3.1 查询有序集合中的元素个数( zcard zcount)3.2 查询指定区间内的元素(zrange zrevrange zrangebyscore)3.3 查询有序集合中指定成员的排名(zrank zrevrank )3.4 查…...
js中map,filter,find,foreach的用法介绍
js中map,filter,find,foreach的用法介绍 在 JavaScript 中,数组提供了一些常用的迭代方法,如 map、filter、find 和 forEach,这些方法允许你对数组中的每个元素进行操作,下面是它们的用法和区别…...
Linux 重置 root 密码
如果您在Linux系统中忘记了root密码,可以按照以下步骤重置: 重启系统。在启动时,当GRUB菜单出现时,选择要启动的内核版本,然后按 e 键编辑启动选项。找到以linux或linux16开头的行,它包含了启动内核的命令…...
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的停车场管理系统
开题报告 随着城市化进程不断加快,汽车保有量持续增长,城市停车问题日益凸显,传统停车场管理手段面临着诸多挑战,诸如管理效率低、人工成本高、信息更新滞后、收费不透明等问题。鉴于此,基于 Web 的智能停车场管理系统…...
博睿数据首届“观测先锋 · 2024 可观测平台创新应用案例大赛”现已启动!
大赛报名火热进行中! 在当今这个数字化、智能化的时代,可观测性技术已经成为企业IT架构中不可或缺的一部分。它能够帮助企业实时监控系统的运行状态,及时发现并解决潜在问题,从而确保业务的稳定性和连续性。博睿数据一体化智能可观…...
笔记:SOME/IP-SD报文中的TTL
问:SOME/IP-SD报文中有几个参数名字都叫的TTL,请问它们有什么不同? 答:在SOME/IP Service Discovery (SOME/IP-SD)协议中,确实有多个与TTL(Time-To-Live)相关的参数,但它们的含义不…...
9.存储过程安全性博客大纲(9/10)
存储过程安全性博客大纲 引言 在数据库系统中,存储过程是一种预先编写好的SQL代码集合,它被保存在数据库服务器上,可以通过指定的名称来调用执行。存储过程可以包含一系列的控制流语句,如IF条件语句、WHILE循环等,使…...
51单片机驱动DS1302:从时序解析到精准电子钟实战
1. 初识DS1302:你的第一个实时时钟芯片 第一次接触DS1302时,我盯着这个只有8个引脚的小芯片看了半天——这么小的东西真的能准确记录时间吗?事实证明它不仅做得到,而且做得很好。DS1302是Dallas公司推出的一款经典实时时钟芯片&am…...
PyTorch Vision模型微调终极指南:从零到精通的迁移学习实战
PyTorch Vision模型微调终极指南:从零到精通的迁移学习实战 【免费下载链接】vision pytorch/vision: 一个基于 PyTorch 的计算机视觉库,提供了各种计算机视觉算法和工具,适合用于实现计算机视觉应用程序。 项目地址: https://gitcode.com/…...
Apache Arrow Rust社区与生态:参与开源项目的最佳路径
Apache Arrow Rust社区与生态:参与开源项目的最佳路径 【免费下载链接】arrow-rs Apache Arrow Rust: 一个Rust语言实现的Apache Arrow数据交换格式,可用于高效地在不同计算引擎之间传输和操作大规模数据。它支持多种数据类型和编码方式,并提…...
PHP开发者必看:如何在本地环境快速搭建gRPC和Protobuf开发环境
PHP开发者必看:如何在本地环境快速搭建gRPC和Protobuf开发环境 作为一名长期与PHP打交道的开发者,我深刻理解在微服务架构盛行的当下,掌握gRPC和Protobuf技术栈的重要性。记得第一次尝试在本地搭建环境时,光是版本兼容问题就耗费了…...
Display Driver Uninstaller深度清理实战指南
Display Driver Uninstaller深度清理实战指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller 当你遭遇游戏帧…...
H3六边形层次化地理空间索引:重新定义空间数据处理的颠覆式突破
H3六边形层次化地理空间索引:重新定义空间数据处理的颠覆式突破 【免费下载链接】h3 Hexagonal hierarchical geospatial indexing system 项目地址: https://gitcode.com/gh_mirrors/h3/h3 地理空间数据处理长期面临着精度与效率难以兼顾的困境。传统网格系…...
注意力缺陷是什么?主要有哪几种症状及专注力训练方法?
注意力缺陷病因及其对儿童发展的影响分析 注意力缺陷(ADHD)的病因较为复杂,主要涉及遗传、环境和生物因素。研究表明,遗传因素在儿童注意力缺陷中起着重要作用,有些家族中更容易出现多动症状。与此同时,环境…...
如何通过WebGLInput彻底解决Unity WebGL平台的输入法兼容性问题
如何通过WebGLInput彻底解决Unity WebGL平台的输入法兼容性问题 【免费下载链接】WebGLInput IME for Unity WebGL 项目地址: https://gitcode.com/gh_mirrors/we/WebGLInput 你是否曾尝试在Unity WebGL应用中实现中文输入,却发现输入法无法正常工作…...
Python并发革命进行时:GIL移除后你必须掌握的5种内存序模型(x86/ARM/RISC-V实测对比)
第一章:Python无锁GIL环境下的并发模型架构总览传统CPython解释器受全局解释器锁(GIL)制约,无法真正实现多线程CPU并行。而“无锁GIL环境”并非指移除GIL本身,而是指在GIL被主动释放、绕过或由替代运行时(如…...
微信无法登录时的恢复操作
本文记录 OpenClaw 中 openclaw-weixin 插件在登录态丢失、微信链接不可用、扫码登录失败时的恢复流程。2026-03-23 版本 OpenClaw 更新后曾出现微信插件失效,但在 2026-03-24 版本中已恢复。本文目标是先判断问题类型,再选择最小影响的修复方式,避免不必要的全量重装。 一、…...
