Java从入门到精通(五)· 内部类,枚举,泛型

news2024/11/22 20:54:42

Java从入门到精通(五)· 内部类,枚举,泛型

一 内部类

1.概述

简单来说,如果一个类定义在另一个类的内部,这个类就是内部类。

使用场景:当一个类的内部,包含了一个完整的事务,且这个事务没有单独设计的必要时,就可以把这个事务设计成内部类。

2.成员内部类

成员内部类就是类中的一个普通成员,类似普通的成员变量,或成员方法。

public class Outer {
    private String name;
    public class Inner{
        public void getName(){
            //内部类可以直接访问外部类的成员变量
            System.out.println(name);
            System.out.println("内部类可以直接访问外部类的成员变量");
        }
    }
}

成员内部类创建对象时,需要先创建外部类的对象。因为成员内部类包含在外部类里。

Outer.Inner inner=new Outer().new Inner();
inner.getName();

注意:从JDK16开始,内部类中才可以创建静态成员

3.静态内部类

静态内部类,即有static修饰的内部类,属于外部类自己持有

@Data
public class Outer {
    private String name;
    private Inner inner;
    public static class Inner{
        public void getName(){
            Outer outer=new Outer();
            System.out.println(outer.getName());
            System.out.println("静态内部类中访问外部类对象,需要创建对象");
        }
    }
}

以下是静态内部类创建对象的语法:

Outer outer=new Outer();
Outer.Inner inner=new Outer.Inner();
outer.setInner(inner);

注意:静态内部类可以直接访问外部类的静态成员,但是无法直接访问外部类的实例成员

4.匿名内部类

匿名内部类是一种特殊的局部内部类,所谓匿名是指程序员不需要为这个类声明类名。

new 类或接口(参数值...){
   类体(一般是方法重写)
}

以下为匿名内部类示例:

创建一个接口,声明两个方法

public interface C {
    String getName();
    void showInfo();
}

在调用接口时实现接口中的方法

public static void main(String[] args) {
    C c=new C() {
        @Override
        public String getName() {
            return "shawn";
        }
        @Override
        public void showInfo() {
            System.out.println("这是匿名内部类");
        }
    };
    c.getName();
    c.showInfo();
}

在这里插入图片描述

以下是匿名内部类编译后的class文件,可以看出,它继承了接口C,实现了C中的两个方法

匿名类的核心功能是简化代码。当匿名类中只有一个函数需要实现时,可以省略多余代码。利用lambda表达式达到匿名类的效果。

test(new D() {
    @Override
    public void showInfo() {
        System.out.println("这是简化前的代码");
    }
});
 test(() -> System.out.println("这是简化后的代码"));

二 枚举(Enum)

1.枚举概述

枚举是一种特殊的类,可以理解为,枚举在本质上是一种类。

枚举其实就是将某个类的几个常用对象都罗列出来,方便后期在项目中使用。

注意:枚举罗列出来的是该枚举的对象

public enum AEnum {
    成员1,成员2,
    //.其他成员
}

枚举中的其他成员,包含构造器,成员方法,成员变量

  • 枚举类的构造器都是私有的(默认且只能私有),因此枚举类对外不能创建对象
  • 枚举都是最终类,不可以被继承
  • 枚举类中,从第二行开始,可以定义类的其他各种成员
  • 编译器为枚举类新增了几个方法,并且枚举都是集成自 java.lang.Enum 类的。

抽象枚举罗列对象:

1.创建抽象方法

2.使用枚举对象的构造函数实现构造方法

public enum BEnum {
    X(){
        @Override
        public void go() {
            System.out.println("抽象枚举罗列对象-X对象");
        }
    },
    Y(){
        @Override
        public void go() {
            System.out.println("抽象枚举罗列对象-Y对象");
        }
    };
    public abstract void go();
}

2.枚举的使用

一般情况下,枚举被用在列举常用类型的实例上。以下是一个简单示例:

public enum CEnum {(1),(2),其他(3);

    public Integer getValue() {
        return value;
    }
    Integer value;
    CEnum(Integer num){
        this.value=num;
    }
}

想要获取枚举对象的具体值,则可以使用以下写法:

Integer value = CEnum..getValue();
System.out.println(value);

以下是枚举的常见使用场景

public static void main(String[] args) {
    check(CEnum.);
}

static void check(CEnum c){
    switch (c){
        case:
            System.out.println("OK");
        case:
            System.out.println("fail");
        case 其他:
            System.out.println("haha");
        default:
            System.out.println("找不到");
    }
}

三 泛型

在定义类,接口,方法时,同时声明了一个类型变量,这种称之为泛型类,泛型接口,泛型方法,一般将他们统称为泛型。

声明语法:

[访问修饰符] [/接口/方法]<E>

泛型的最基本的作用:在编译阶段约束了所能操作的数据类型,并自动进行检查,避免了强制类型转换以及其可能出现的问题。

泛型的本质:把具体的数据类型作为参数传递给类型变量

1.泛型类

以下是一个泛型类的简单示例,模拟了ArrayList存取元素的基本过程:

public class MyArrayList<E> {
    private Object[] arr=new Object[10];
    private Integer size=0;
    //定义一个参数类型为泛型的方法
    public Boolean add(E e){
        if(size<arr.length){
            arr[size++]=e;
            return true;
        }else{
            return false;
        }
    }
    //定义一个返回值为泛型的方法
    public E getInfo(Integer index){
        if(index>=0 && index<arr.length){
            return (E) arr[index];
        }else{
            return null;
        }
    }
}

以下是含有两个泛型类型的泛型类:

public class MyClassTwo<E,K> {
    public Integer get(E e,K k){
        System.out.println("这里使用了两个泛型变量");
        return 1;
    }
}

以下是一个限制了泛型类型必须是某一个类或该类的子类的限定:

public class Teacher<E extends People> {
}

2.泛型接口

泛型接口与泛型类基本相似,实现该接口的类需要按照接口约定

public interface F<E> {
    String getName(E e);
    E getObj(Integer id);
}

3.泛型方法

有方法自己申明类型变量的方法,称之为泛型方法。

以下是泛型方法的基本语法及示例说明:

修饰符 <类型变量1,类型变量2,...> 返回值类型 方法名(参数列表...{

}
public static <T> T getName(T t){
    return t;
}

如果参数中传递了泛型类型,则可以使用通配符(?)来接收。

// ArrayList<E> 是已经定义好的类型,我们在使用是可以使用?表示能接收一些类型的ArrayList集合
public static void getName2(ArrayList<?> name){
}

4.泛型的上下限

  • 上限:? extends ClassName:能接受的类必须是 ClassName 或它的子类
  • 下限:? superClassName:能接受的类必须是 ClassName 或它的父类

5.泛型擦除和基本数据类型的问题

  • 泛型是工作在编译阶段的,一旦程序编译成class文件,class中就不存在泛型类型了。这叫做泛型擦除
  • 泛型类型不支持基本数据类型,只支持引用类型,使用基本类型时需要换成对应的包装类

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

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

相关文章

常见的软件测试模型

目录 1、瀑布模型 2、V模型 3、W模型 4、H模型 5、X模型 1、瀑布模型 瀑布模型是一种线性的、顺序的软件开发模型 上一阶段的输出结果作为下一阶段的输入 优点&#xff1a; &#xff08;1&#xff09;为项目提供了按阶段划分的检查点。 &#xff08;2&#xff09;当前一阶段…

【校招VIP】产品面试之面试官的真实意图

考点介绍&#xff1a; 大厂面试时&#xff0c;面试官提出的问题除了了解经历和想法外&#xff0c;最看重的是思维逻辑能力、团队协作能力和协调能力。 『产品面试之面试官的真实意图』相关题目及解析内容可点击文章末尾链接查看&#xff01; 一、考点题目 1. 你遇到的最大的…

QT 相关设置

目录 1.安装QT2.安装好之后需要做一些设置2.1 基本的字体及主题设置2.2 格式化美化代码插件设置 1.安装QT 具体教程不写了 2.安装好之后需要做一些设置 2.1 基本的字体及主题设置 进入选项 选择喜欢的主题 字号字体设置 2.2 格式化美化代码插件设置 先下载一个格式化插…

五、多表查询-4.6练习

一、准备数据 【效果展示】 emp1表&#xff08;员工表&#xff09;&#xff1a; dept1表&#xff08;部门表&#xff09;&#xff1a; salgrade表&#xff08;薪资等级表&#xff09;&#xff1a; 二、案例 1、查询员工的姓名、年龄、职位、部门信息&#xff08;隐式内连接&am…

JUC详解

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱发博客的嗯哼&#xff0c;爱好Java的小菜鸟 &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;社区论坛&#xff1a;希望大家能加入社区共同进步…

leetcode 823. 带因子的二叉树(dp+双指针+Long类型)

leetcode 823. 带因子的二叉树(dp双指针Long类型) 题目表述 给出一个含有不重复整数元素的数组 arr &#xff0c;每个整数 arr[i] 均大于 1。 用这些整数来构建二叉树&#xff0c;每个整数可以使用任意次数。其中&#xff1a;每个非叶结点的值应等于它的两个子结点的值的乘积…

个人博客论坛系统测试报告

目录 一、项目介绍 二、测试计划 1、功能测试 &#xff08;1&#xff09;测试环境&#xff1a; &#xff08;2&#xff09;测试用例编写 &#xff08;3&#xff09;部分功能测试 2、自动化测试 &#x1f351;注册页面测试 验证注册成功的情况 验证注册失败的情况 &a…

WebDAV之π-Disk派盘 + 思源笔记

思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。 融合块、大纲和双向链接,重构你的思维。 π-Disk派盘 – 知识管理专家 派盘是一款面向个人和企业的本地云存储解决方案,它可以帮助用户打造“数字第二大脑”,并支持KMS知识管理系…

Qt自定义标题栏

一、创建项目 最终项目文件结构如下 “iconfont.tff”的使用方式见如下博客&#xff0c;用于更改图标颜色Qt更改图标颜色_怎么追摩羯座的博客-CSDN博客 二、MyTitleBar.pro #------------------------------------------------- # # Project created by QtCreator 2023-08-2…

antd upload组件beforeUpload返回promise之后,获取的文件不是file类型导致上传失败

之前的beforeUpload直接返回一个false值 &#xff0c;文件是可以正常与服务端进行传输的 beforeUpload: (file) > {return false},但是这样并不能阻止文件上传&#xff0c;看了官方文档后&#xff0c;改用返回promise对象上传 beforeUpload: (file) > {console.log(-befo…

Primeng table filter 重置条件

我用一个overlayPanel装了p-table&#xff0c;里面有个count的filter&#xff0c;但是我设置值之后&#xff0c;让overlayPanel消失&#xff0c;再出现的时候&#xff0c;明明已经重新设置了表里面的数据和filter的变量值&#xff0c;但是上一次的条件仍然在,旁边的文字filter依…

openGauss本地Centos7.6单机安装和简单应用

openGauss本地Centos7.6单机安装和简单应用 openGauss基础环境配置openGauss安装openGauss使用测试openGauss常用命令 openGauss基础环境配置 在VMware Workstation中安装一台 centos7.6 内存&#xff1a;8GB&#xff0c;亲测4GB安装不够 磁盘&#xff1a;测试50GB-100GB够用 …

谈了千百遍的数据一致性

今天来说一个老生常谈的问题&#xff0c;来看一个实际案例&#xff1a; 现有业务中往往都会通过缓存来提高查询效率&#xff0c;降低数据库的压力&#xff0c;尤其是在分布式高并发场景下&#xff0c;大量的请求直接访问Mysql很容易造成性能问题。 有一天老板找到了你… 老板…

四川玖璨电子商务有限公司:开抖店怎么运营

开抖店是一种越来越流行的创业方式&#xff0c;在社交媒体平台上开店销售各种商品&#xff0c;比如服装、配饰、美妆和家居用品等等。对于新手来说&#xff0c;他们可能会很关心自己开抖店能够多久出单。虽然这个问题没有一个固定的答案&#xff0c;但是以下是一些关键的运营方…

一文讲透:低代码平台是什么?低代码平台应该如何挑选?

低代码平台是什么&#xff1f;低代码平台的边界在哪&#xff1f;低代码平台的优势&#xff1f;低代码平台哪个好用&#xff1f;2023年有哪些国内值得关注的低代码平台&#xff1f;本文将深入浅出的带大家了解低代码平台&#xff0c;并且为大家带来2023年国内最热六款低代码平台…

【MySQL系列】-ORDER BY……HAVING详解及limit

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【ELK日志收集系统】

目录 一、概述 1.作用 2.为什么使用&#xff1f; 二、组件 1.elasticsearch 1.1 作用 1.2 特点 2.logstash 2.1 作用 2.2 工作过程 2.3 INPUT 2.4 FILETER 2.5 OUTPUTS 3.kibana 三、架构类型 1.ELK 2.ELKK 3.ELFK 4.ELFKK 四、案例 - 构建ELK集群 1.环境…

【行为树】py_trees 学习笔记

学习资料 《Introduction to behavior trees》 1. 概念说明 1.1 Action&#xff1a;pt.behaviour.Behaviour 在一个行为树中&#xff0c;Action 是一个叶节点&#xff08;Leaf Node&#xff09;&#xff0c;它实际执行某种行为或任务&#xff0c;并返回成功、失败或运行中的…

微服务·架构组件之注册与发现

引言 微服务架构在现代软件开发中越来越受欢迎&#xff0c;它通过将系统拆分为多个小型、自治的服务来提高可维护性、可扩展性和灵活性。然而随着服务数量的增多&#xff0c;服务之间的通信何发现变得更加复杂。本报告旨在深入探讨微服务中的注册与发现&#xff0c;介绍其背景…

使用rem + sass + 媒体查询 进行横竖屏适配移动端项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、 媒体查询&#xff08;Media Query&#xff09;1.简单了解2.简单例子3. 语法&#xff08;1&#xff09;媒体类型&#xff08;mediatype &#xff09;&#xff0…