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{

            @Override
            public int compareTo(Object o) {
                return 0;
            }
        }
        MyComparable myComparable =  new MyComparable();
        return myComparable;

    //2.提供接口实现类的匿名对象
   /* public Comparable getInstance() {
        class MyComparable implements Comparable{ 
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        }
        return new MyComparable();
    }*/
        //3.提供接口的匿名实现类的对象
        /*Comparable m = new Comparable() {

            @Override
            public int compareTo(Object o) {
                return 0;
            }
        };
        return 0;*/
        
        //4.提供接口的匿名实现类的匿名对
        /*return new Comparable(){
            @Override
            public 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("春天","生机勃勃"){
        @Override
        public void show() {
            System.out.println("春天在哪里");
        }
    },
    SUMMER("夏天","夏日炎炎"){
        @Override
        public void show() {
            System.out.println("夏天吃雪糕");
        }
    },
    AUTUMN("秋天","秋高气爽"){
        @Override
        public void show() {
            System.out.println("秋天的第一别奶茶");
        }
    },
    WINTER("冬天","白雪皑皑"){
        @Override
        public 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;
    }

    @Override
    public String toString() {
        return "季节{" +
                "name='" + name + '\'' +
                ", Desc='" + Desc + '\'' +
                '}';
    }

    //情况1 :枚举类中直接重写,调用时全部一样
   /* @Override
    public 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);*/

  }

  @Test
  public void test2(){
      //方式1
      Integer i1 = 11;
      String i2 = String.valueOf(i1);
      System.out.println(i2);

      Boolean B1 = true;
      String b2 = String.valueOf(B1);
      System.out.println(b2);

      //方式2
      String C1 = i2+"";
      String C2 = b2+"";
      System.out.println(C2);
      System.out.println(C1);

  }

}

四、自动生成单元测试

联网的情况下,输入 @Test,出现红灯并点击,选择Junit4.x下载

由于测试单元的格式是固定的,可以在IDEA中直接设计自动生成单元测试的模板。

找到文件,点击设置

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

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

 

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java集合进阶篇-《Collection集合》

个人主页→VON 收录专栏→java从入门到起飞 目录 一、前言 二、Collection集合简要概述 Collection的主要实现 Collection的方法 迭代器&#xff08;Iterator&#xff09; 三、单列集合顶层接口Collection CollectionDemo01 CollectionDemo02 CollectionDemo03 Collec…

java maven

参考链接 maven相关配置 maven依赖管理 依赖具有传递性。 maven依赖范围 maven的生命周期 分为三个相互独立的生命周期&#xff1a; 在执行对应生命周期的操作时&#xff0c;需要进行前面的操作。比如&#xff0c;执行打包install的时候&#xff0c;会执行test。

算法时间、空间复杂度(二)

目录 大O渐进表示法 一、时间复杂度量级的判断 定义&#xff1a; 例一&#xff1a;执行2*N&#xff0b;1次 例二&#xff1a;执行MN次 例三&#xff1a;执行已知次数 例四:存在最好情况和最坏情况 顺序查找 冒泡排序 二分查找 例五&#xff1a;阶乘递归 ​编辑 例…

线下陪玩导游系统软件源码,家政预约服务源码(h5+小程序+app)

游戏陪玩系统源码陪玩小程序源码搭建基于PHP&#xff0b;MySQL陪玩系统app源码陪玩系统定制开发服务、成品陪玩系统源码 系统基于Nginx或者Apache PHP7.3 数据库mysql5.6 前端为uniapp-vue2.0 后端为thinkphp6 有域名授权加密&#xff0c;其他开源可二开 演示源码下载 开…

【实战项目】——Boost搜索引擎(五万字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、项目的相关背景 1.1、什么是Boost库&#xff1f; 1.2、什么是搜索引擎&#xff1f; 1.3、为什么要做Boost库搜索引擎&#xff1f; 二、搜索引擎的宏观原…

大数据开发电脑千元配置清单

大数据开发电脑配置清单 电脑型号HUANANZHI 台式电脑操作系统Windows 11 专业版 64位&#xff08;Version 23H2 / DirectX 12&#xff09;处理器英特尔 Xeon(至强) E5-2673 v3 2.40GHz主板HUANANZHI X99-P4T&#xff08;P55 芯片组&#xff09;显卡NVIDIA GeForce GT 610 ( 2…

负载均衡和反向代理区别和nginx负载均衡模块

目录 负载均衡和反向代理区别 相似之处&#xff1a; 区别&#xff1a; 负载均衡和反向代理使用什么服务 nginx的负载均衡模块 ​编辑 负载均衡和反向代理区别 相似之处&#xff1a; 请求分发&#xff1a;两者都可以将客户端的请求分发到多个后端服务器&#xff0c;以提…

【AI绘画】Midjourney进阶:留白构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;留白构图特点使用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 【AI绘画】Midjourney进阶&…

Java后端面试题:JVM篇

目录 1. 什么是JVM&#xff1f; 2. 请你介绍JVM的整体结构 3. 了解过字节码文件的组成吗&#xff1f; 4. 说一下运行时数据区&#xff08;介绍一下JVM内存模型&#xff09;。 5. 哪些区域会出现内存溢出&#xff0c;会有什么现象&#xff1f; 6. 请你说说类的生命周期。 …

AD9361 的 TX 输出中添加前置放大器,并在 RX 输入中添加 LNA。

AD9361 的 TX 输出中添加前置放大器&#xff0c;并在 RX 输入中添加 LNA。 https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/AD-TRXBOOST1-EBZ.html https://wiki.analog.com/resources/eval/user-guides/ad-trxboost1-ebz/in…

QT--文本框 QLineEdit、qtextedit

在Qt中&#xff0c;文本框&#xff08;QLineEdit 或 QTextEdit&#xff09;和标签&#xff08;QLabel&#xff09;是两种不同的部件&#xff08;widget&#xff09;&#xff0c;它们的主要区别在于用途和功能&#xff1a; QLabel&#xff08;标签&#xff09; 用途&#xff1…

PythonExcel批量pingIP地址

问题&#xff1a; 作为一个电气工程师&#xff08;PLC&#xff09;&#xff0c;当设备掉线的时候&#xff0c;需要用ping工具来检查网线物理层是否可靠连接&#xff0c;当项目体量过大时&#xff0c;就不能一个手动输入命令了。 解决方案一&#xff1a; 使用CMD命令 for /L %…

算法.图论-BFS及其拓展

文章目录 广度优先搜索简介经典bfs习题地图分析贴纸拼词 01bfs解析基本过程相关习题 广度优先搜索简介 bfs的特点是逐层扩散, 从源头到目标点扩散了几层, 最短路就是多少 bfs的使用特征是任意两个节点的距离(权值)是相同的(无向图, 矩阵天然满足这一特点) bfs开始的时候可以是…

树莓派应用--AI项目实战篇来啦-10.OpenCV进行车牌检测

1. 介绍 本项目使用 esseract、OpenCV和Python探索光学字符识别&#xff08;OCR&#xff09;的神奇世界&#xff0c;本项目将 带你了解最受欢迎的OCR引擎 Tesseract 背后的技术&#xff0c;以及如何用 Pytesseract 和 OpenCV实现字符识别。 从图像中检测字符的技术称为…

图(Java语言实现)

一、图的概念 顶点&#xff08;Vertex&#xff09;&#xff1a;图中的数据元素&#xff0c;我们称之为顶点&#xff0c;图至少有一个顶点&#xff08;非空有穷集合&#xff09;。 边&#xff08;Edge&#xff09;&#xff1a;顶点之间的关系用边表示。 1.图&#xff08;Graph…

Python Django 数据库优化与性能调优

Python Django 数据库优化与性能调优 Django 是一个非常流行的 Python Web 框架&#xff0c;它的 ORM&#xff08;对象关系映射&#xff09;允许开发者以简单且直观的方式操作数据库。然而&#xff0c;随着数据量的增长&#xff0c;数据库操作的效率可能会成为瓶颈&#xff0c…

如何在Ubuntu上更改MySQL数据存储路径

文章目录 0 背景1 备份现有数据库数据2 停止 MySQL 服务3 复制现有的 MySQL 数据到新目录4 修改 MySQL 配置文件5 更新 AppArmor 或 SELinux 配置&#xff08;如有启用&#xff09;6. 修改 MySQL 系统文件中的 datadir7. 启动 MySQL 服务8. 验证更改参考资料 0 背景 在原先划分…

股市入门常见术语介绍

鉴于最近行情讨论火热&#xff0c;我也想借此平台&#xff0c;结合我大学时期身边同学老师的投资经历&#xff0c;写一篇交易入门术语简介。内容不多但是足以达到科普之用。 ​ 希望大家能谨慎对待投资&#xff0c;始终保持谦虚学习的态度。不要迷失在瞬息万变的金融市场&…

webstorm 编辑器配置及配置迁移

1.下载地址 WebStorm&#xff1a;JetBrains 出品的 JavaScript 和 TypeScript IDE 其他版本下载地址 2.安装 点击下一步安装&#xff0c;可根据需要是否删除已有版本 注意&#xff1a; 完成安装后需要激活 3.设置快捷键 以下为个人常用可跳过或根据需要设置 如&#xff1a…

满级抗摔续航王者,荣耀X60系列发布,起步价仅1199元

10月16日&#xff0c;荣耀X60系列暨荣耀平板新品发布会正式举办&#xff0c;荣耀X60 Pro、荣耀X60以及荣耀平板GT Pro、荣耀亲选耳机LCHSE X7e、荣耀亲选WhizKid儿童手表2 Pro等新品悉数亮相。其中&#xff0c;荣耀X60 Pro首次搭载6600mAh最大青海湖电池、绿洲护眼屏、双向北斗…