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循环等,使…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...