java面向对象编程--高级(二)

news2024/11/24 19:41:08

目录

一、内部类

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

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

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

相关文章

vector(3)

vector(3) vector 迭代器失效问题。&#xff08;重点&#xff09; 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就是一个指针&#xff0c;或者是对 指针进行了封装&#xff0c;比如&#xff1a;vector的迭代器就是原生态指针T 。因此迭代器失效…

sql server 用户只读表权限

新建登录名 数据库建用户 用户赋予登录名和架构 赋予用户只读权限 GRANT SELECT ON Users TO gt

Vue——Uniapp回到顶部悬浮按钮

代码示例 <template><view class"updata" click"handleup" :style"{bottom: bottomTypepx}" ><i class"iconfont icon-huidaodingbu"></i></view> </template><script> export default {n…

利用弹性盒子完成移动端布局(第二次实验作业)

需要实现的效果如下&#xff1a; 下面是首先是这个项目的框架&#xff1a; 然后是html页面的代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"wid…

解决element-ui图标不出现,或者乱码问题(已解决)复制粘贴

其实就是资源没找到&#xff0c;需要你手动添加。 下载个文件 通过百度网盘分享的文件&#xff1a;css 链接&#xff1a;https://pan.baidu.com/s/1jLngnKV3PuDYu2ohSlE5IQ?pwdt1z9 提取码&#xff1a;t1z9 https://pan.baidu.com/s/1jLngnKV3PuDYu2ohSlE5IQ?pwdt1z9 提取…

Python_函数式编程(生成器、迭代器、动态性)

简单说&#xff1a;时间换空间&#xff01;想要得到庞大的数据&#xff0c;又想让它占用空间少&#xff0c;那就用生成器&#xff01;延迟计算&#xff01;需要的时候&#xff0c;再计算出数据&#xff01; 创建生成器的方式二(生成器函数)生成器函数&#xff1a; 如果一个函数…

Spirng事务的传播学习

事务传播&#xff1a;一个事务方法在被调用时&#xff0c;如何与现有事务的交互行为。当方法被事务性地调用时&#xff0c;他应该加入当前事务还是开启一个新事物。 常见的事务传播机制&#xff08;7种&#xff09;&#xff1a; Propagation枚举类&#xff0c;定义了传播机制…

【D3.js in Action 3 精译_034】4.1 D3 中的坐标轴的创建(中一)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

文件与fd

访问文件前&#xff0c;为什么必须要打开文件&#xff1f;/ 打开文件的实质 访问文件前&#xff0c;都必须先打开它&#xff0c; 如fopen 访问文件时&#xff0c;是进程在访问 所以文件必须加载到内存中 我们要访问文件时&#xff0c;一定要通过内存访问 文件没有被打开时&am…

UML(统一建模语言)

面向对象设计主要就是使用UML的类图&#xff0c;类图用于描述系统中所包含的类以及它们之间的相互关系&#xff0c;帮助人们简化对系统的理解&#xff0c;它是系统分析和设计阶段的重要产物&#xff0c;也是系统编码和测试的重要模型依据。 画图软件&#xff1a;ProcessOn思维…

人工智能和机器学习之线性代数(一)

人工智能和机器学习之线性代数&#xff08;一&#xff09; 人工智能和机器学习之线性代数一将介绍向量和矩阵的基础知识以及开源的机器学习框架PyTorch。 文章目录 人工智能和机器学习之线性代数&#xff08;一&#xff09;基本定义标量&#xff08;Scalar&#xff09;向量&a…

通过观测云 DataKit Extension 接入 AWS Lambda 最佳实践

前言 AWS Lambda 是一项计算服务&#xff0c;使用时无需预配置或管理服务器即可运行代码。AWS Lambda 只在需要时执行代码并自动缩放。借助 AWS Lambda&#xff0c;几乎可以为任何类型的应用程序或后端服务运行代码&#xff0c;而且无需执行任何管理。 Lambda Layer 是一个包…

5 个免费高清无水印视频素材库

短视频创作&#xff0c;素材是关键。以下为你推荐 5 个超棒的免费且无版权的高清无水印短视频素材网站&#xff0c;助你获取创作资源。 蛙学网 国内顶级素材站&#xff0c;有海量高质量素材&#xff0c;领域涉及自然风光、情感生活、游戏动漫以及社会人文等。其素材均为 4K 高…

集合框架07:LinkedList使用

1.视频链接&#xff1a;13.14 LinkedList使用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p142.LinkedList集合的增删改查操作 package com.yundait.Demo01;im…

Vmware开箱即用win7系统

下载文件 下载VMWare与win7成品虚拟机资料&#xff08;PS&#xff1a;里面有Win10 和Win11&#xff0c;使用方法都是一样的&#xff09; ⏬下载链接⏬ 下载链接 使用虚拟机打开成品虚拟机

python怎么引用文件

新建python文件 &#xff1a;在同目录lib下创建mylib.py和loadlib.py两个文件。 在mylib.py文件中创建一个Hello的类&#xff0c;并且给这个类添加一个sayHello的方法&#xff0c;让它输出hello python 在loadlib.py 文件中引入mylib import mylib 在loadlib中调用引用过来的py…

QT开发--串口通信

第十六章 串口通信 16.1 串口通信基础 串口通信主要通过DB9接口&#xff0c;适用于短距离&#xff08;<10米&#xff09;。关键参数包括&#xff1a; 波特率&#xff1a;每秒传输bit数&#xff0c;如9600。数据位&#xff1a;信息包中的有效数据位数。停止位&#xff1a;…

Excel:vba实现禁止新增工作表

实现效果&#xff1a;禁止新增工作表 步骤如下&#xff1a; 1.点击开发工具里面的Visual Basic 2.不要自己创建&#xff0c;点击ThisWorkbook&#xff0c;点击选择Workbook&#xff0c;点击选择NewSheet 这里的NewSheet就是工作簿事件 代码如下&#xff1a; 这是事件处理程序…

day∞-过滤器-拦截器

一、过滤器 二、拦截器

【Java面试——基础知识——Day5】

1. 异常 1.1 Exception 和 Error 有什么区别&#xff1f; 在 Java 中&#xff0c;所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。Throwable 类有两个重要的子类: Exception :程序本身可以处理的异常&#xff0c;可以通过 catch 来进行捕获。Exception 又可以…