当前位置: 首页 > news >正文

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中测试一遍,实验成功

http://www.lryc.cn/news/461937.html

相关文章:

  • 定时发送邮件
  • 基于Java的免税商品优选购物商城设计与实现代码(论文+源码)_kaic
  • 解决selenium启动慢问题
  • Springboot + zset + lua 实现滑动窗口
  • 【深度学习】transformer为什么使用多头注意力极致?为什么不使用一个头
  • 利用Excel数据合并到Word功能,官方名为“Word邮件合并”
  • 当代世界著名哲学家‌起名大师颜廷利:全球公认最厉害思想家
  • Would you like conda to send this report to the core maintainers? [y/N]:
  • 数据结构编程实践20讲(Python版)—18哈希表
  • Html 标题加图标
  • 机器学习探索性数据分析 (EDA)
  • 【K8S系列】Kubernetes pod节点Pending或CrashLoopBackOff 问题及解决方案详解【已解决】
  • 【Redis】Zset类型常用命令
  • js中map,filter,find,foreach的用法介绍
  • Linux 重置 root 密码
  • 【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的停车场管理系统
  • 博睿数据首届“观测先锋 · 2024 可观测平台创新应用案例大赛”现已启动!
  • 笔记:SOME/IP-SD报文中的TTL
  • 9.存储过程安全性博客大纲(9/10)
  • android 打包成aar
  • 服务器和中转机在网络安全方面
  • 解决“无法从 System.String 强制转换或转换为 Class 对象”错误
  • Git:LF will be replaced by CRLF、pytest PermissionError以及Git应用中的一些问题解决及一些使用技巧
  • 云原生之运维监控实践-使用taosKeeper与TDinsight实现对TDengine服务的监测告警
  • 前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
  • 树莓派刷入OpenWrt后扩容overlay的方法
  • 【JS】Node.js读取execle表格中的数据
  • 怎么为pdf文件设置密码?几种PDF文件设置密码的方法推荐
  • Rust : FnOnce、线程池与多策略执行
  • 一个汉字占几个字节、JS中如何获得一个字符串占用多少字节?