Java基础 :内部类、枚举、泛型

news2024/11/15 23:47:49

内部类

概念
  • 是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。
场景
  • 当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。

分类
  • 成员内部类(了解)
    • 类中的一个普通成员

    • 内部类中构造器,成员变量和方法都可以定义,与普通类一样
    • 成员内部类可以直接访问外部类的静态成员和实例成员,不需要new对象
    • 外部类名.this.外部类成员 可以访问外部类的成员
    • 创建成员内部类对象:new 外部类( ).new 内部类( )
  • 静态内部类(了解)
    •     有static修饰的内部类,属于外部类自己持有
    •     类有的内容,静态内部类都可以有
    •     只能直接访问外部类的静态成员,但是不能直接访问外部类的实例成员,需要new对象
    •         因为同静态方法一样,直接属于类,而外部类的实例成员是属于对象,每个对象内容不同
    •     创建静态内部类对象:new 外部类.new 内部类( )
       
局部内部类(了解)
  • 定义在方法中、代码块中、构造器等执行体中

匿名内部类(重点)
  • 一种特殊的局部内部类,不需要为这个类声明名字

  • 特点

    • 匿名内部类本质就是一个子类,并会立即创建出一个子类对象。
  • 作用

    • 用于更方便的创建一个子类对象。
//使用匿名内部类
public class Tets {
    public static void main(String[] args) {
        // 匿名内部类
        //匿名内部类的本质是继承类或者实现接口
        //下面的代码会定义一个继承了Fu类的匿名内部类并且创建该子类对象
        Fu f = new Fu(){
            @Override
            public void show() {
                System.out.println("Son show");
            }
        };
        
        f.show();
    }
}

class Fu{
    public void show(){
        System.out.println("Fu show");
    }
}
/*
result:
		Son show
*/

常见应用场景

  • 通常作为一个参数传输给方法

    • 在开发中一般都不是我们主动用,而是在调用API时,根据API需要的参数被动使用
//简单应用
public class Test {
    public static void main(String[] args) {
        //下面两个代码把匿名内部类直接作为参数传入
        //等价于创建两个类实现Fly接口并分别创建对象,并将对象作为参数传入
        showFly(new Fly() {
            @Override
            public void fly() {
                System.out.println("鸟飞了");
            }
        });
        showFly(new Fly() {
            @Override
            public void fly() {
                System.out.println("我飞了");
            }
        });
    }
    
    public static void showFly(Fly f) {
        f.fly();
    }
}

interface Fly {
    void fly();
}

枚举

枚举是一种特殊类

特点

  •     枚举类中的第一行,只能写一些合法的标识符(名称),多个名称用逗号隔开。
  •         每个名称记住的都是枚举类的一个对象,默认使用public static final修饰,本质为常量
  •     枚举类中,从第二行开始,可以定义类的其他各种成员。
  •     枚举类的构造器都是默认私有,因此枚举类对外不能创建对象。
  •     枚举都是最终类,默认使用final修饰,不可以被继承。
  •     编译器为枚举类新增了几个方法,并且枚举类都是继承:java.lang.Enum类的,从enum类也会继承到一些方法。
     
public enum A {
    // 枚举对象,必须放在第一行,表示A类的三个实例对象的名字,都为常量,使用public static final修饰
    X,Y,Z;

    public static String name;
    private int a;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
    public void say(){
        System.out.println("成员方法");
    }
}
public class Test {
    public static void main(String[] args) {
        A.name = "静态类变量";
        System.out.println(A.name);//输出类变量

        //X,Y,Z都是A类的实例对象,都是常量,使用public static final修饰
        A a1 = A.X;
        System.out.println(a1);//输出a1所指向的枚举类中的对应对象
        A a2 = A.Y;
        System.out.println(a2);//输出a1所指向的枚举类中的对应对象

        // 枚举类型的构造器私有,无法对外创建对象,默认使用private修饰
        // A a2 = new A();

        //枚举类包含的额外的API
        A[] as = A.values();//获取枚举类中的所有对象
        System.out.println(Arrays.toString(as));
        for (A a : as) {
            System.out.print(a + " ");
        }//输出枚举类中的所有对象
        System.out.println();
        A a3 = A.valueOf("Z");
        System.out.println(a3.name());//输出a3所指向的枚举类中的对应对象的名字
        System.out.println(a3.ordinal());//输出a3所指向的枚举类中的对应对象的序号
        a3.setA(10);
        System.out.println(a3.getA());//输出a3所指向的枚举类中的对应对象的成员变量a的值
        a3.say();//输出a3所指向的枚举类中的对应对象的成员方法
    }
}
/*
result:
        静态类变量
        X
        Y
        [X, Y, Z]
        X Y Z 
        Z
        2
        10
        成员方法
*/
抽象枚举

枚举类中有抽象方法,此时只有每个对象都重写抽象方法后才不会报错

public enum B {
    //CAT是一个对象,并且重写枚举类B中抽象方法,使用无参构造
    CAT(){
        @Override
        public void say() {
            System.out.println(getName() + "喵喵喵");
            //因为这是个对象,所以不能直接用name调用
        }
    },DOG("小狗"){
        @Override
        public void say() {
            System.out.println(getName() + "汪汪汪");
        }
    };//DOG也是一个对象,并且重写枚举类B中抽象方法,使用有参构造

    B() {
    }

    B(String name) {
        this.name = name;
    }

    public abstract void say();//抽象方法
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class Test1 {
    public static void main(String[] args) {
        B.CAT.setName("小猫");
        B.CAT.say();//因为CAT是枚举类中常量对象,所以两次的B.CAT都是同一个对象
        B.DOG.say();
    }
}
/*
result:
        小猫喵喵喵
        小狗汪汪汪
*/

泛型

        定义类,接口,方法时,声明一个或多个类型变量,成为泛型类,泛型接口和泛型方法,统称为泛型

  • 作用

        泛型提供了在编译阶段 约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常,保证所操作的数据类型的统一。

  • 本质

        将具体的数据类型作为参数传给泛型变量,也就是操作阶段不需要知道具体数据类型,只需要操作泛型编写,最后通过传入的具体的数据类型来替换泛型变量,自动操作

  • 泛型类

        通过定义泛型类使泛型类中的成员可以通过传入的不同的泛型执行相同的操作

格式:

修饰符 class 类名<类型变量,类型变量, ...>{
    
}

类型变量常用大写的英文字母,常用的有:E、T、K、V等

泛型类:

泛型接口和泛型类 类似,也可以同样可以单泛型,多泛型与继承泛型

泛型方法:

格式:

修饰符<类型变量,类型变量,...> 返回值类型 方法名(形参){
    
}
//这是泛型方法
public <E> void test(E e){
    
}

 例子:

public class People {
}
public class Teacher extends People{
}
public class Student extends People{
}
public class Test {
    public static void main(String[] args) {
        test1("单泛型方法");
        test2("多泛型方法", "方法");

        //只要是People的子类或者People类都可以传入
        test3(new People());
        test3(new Student());
        test3(new Teacher());
    }

    public static <T> void test1(T t) {
        System.out.println(t);
    }

    public static <T,E> void test2(T t,E e) {
        System.out.print(t);
        System.out.println(e);
    }

    public static <T extends People> void test3(T t) {
        System.out.println("=======上限泛型方法======");
        System.out.println(t);
    }
}
/*
result:
        单泛型方法
        多泛型方法方法
        =======泛型方法上限======
        com.LMH.Fanxingmethod.People@1b6d3586
        =======泛型方法上限======
        com.LMH.Fanxingmethod.Student@4554617c
        =======泛型方法上限======
        com.LMH.Fanxingmethod.Teacher@74a14482
*/

通配符和泛型上下限

 泛型的注意事项

泛型擦涂

  • 泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了
  • 泛型不支持基本数据类型,只能支持引用数据类型
public class Test3 {
    public static void main(String[] args) {
//        ArrayList<int> list1 = new ArrayList<>();
//        会报错,因为泛型只能是引用类型,不能是基本类型   
        ArrayList<Integer> list2 = new ArrayList<>();
    }
}

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

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

相关文章

工作之余Happy一下(实现时钟特效)

样式 测试代码&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>时钟特效</title><style> body{background: #000;}.content{width: 400px;margin: auto;color: #fff;}#title…

openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换

文章目录 openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换104.1 操作场景104.2 前提条件104.3 注意事项104.4 操作步骤 openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换 openGaus…

工业企业网络推广解决方案 | 网络营销专家分享 | 上海添力

在国内&#xff0c;工业企业如果想在线上做推广&#xff0c;其主要途径就是做搜索引擎推广&#xff0c;在几个常用的搜索引擎&#xff08;百度、360、搜狗、必应&#xff09;中&#xff0c;一般都是从百度开始做起。但不少工厂做百度广告&#xff0c;钱花了不少&#xff0c;就是…

做PPT或制作表情包时,不会把视频转成gif动图?5分钟学会

一、背景 当我们在做PPT时&#xff0c;不可避免的需要放一些视频&#xff0c;但视频占用空间太大&#xff0c;而且比较烦的是需要点一下才能播放。因此需要将视频转成gif动态&#xff0c;以自动播放。 GIF的全称是Graphics Interchange Format&#xff0c;可译为图形交换格式…

SQL题目记录

1.商品推荐题目 1.思路&#xff1a; 通过取差集 得出要推荐的商品差集的选取&#xff1a;except直接取差集 或者a left join b on where b null 2.知识点 1.except selectfriendship_info.user1_id as user_id,sku_id fromfriendship_infojoin favor_info on friendship_in…

ATE测试工程师的前景待遇如何?薪资天花板有多高?

在芯片行业&#xff0c;ATE测试工程师扮演着至关重要的角色。 他们不仅需要理解电路和芯片内部的工作原理&#xff0c;还需要利用各种测试工具和方法对芯片进行精确的测试和分析。那么ATE测试工程师前景如何&#xff1f;需要具备哪些技能要求呢&#xff1f; 首先来了解什么是…

【数据库范式】实际案例分析

前言 在日常业务研发过程中&#xff0c;我们常常需要与数据库表打交道。设计范式是数据表设计的基本原则&#xff0c;对于数据表的设计范式&#xff0c;我们特别容易忽略它的存在。很多时候&#xff0c;当数据库运行了一段时间之后&#xff0c;我们才发现数据表设计上有问题。然…

2023年中国润滑油分散剂市场需求量及行业竞争现状分析[图]

润滑油分散剂是一种两亲性化学品&#xff0c;可以增加油性部分以及水性部分在同一体系中的相容性&#xff0c;能降低分散体系中固体或液体粒子聚集的物质。换油时&#xff0c;可将有害的悬浮物从油中清除。 国内从60年代末开始试制丁二酰亚胺型分散剂&#xff0c;并于80年代初在…

93. 递归实现组合型枚举

题目&#xff1a; 93. 递归实现组合型枚举 - AcWing题库 思路&#xff1a; 1.从n个数中选择m个数&#xff0c;问有多少种选法。---->抽象为有m个坑位&#xff08;设置kenway[N]表示&#xff09;&#xff0c;其中填入编号为1~n的萝卜&#xff0c;问有几种填法。这里我们可…

二叉树题目:从中序与后序遍历序列构造二叉树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;从中序与后序遍历序列构造二叉树 出处&#xff1a;106. 从中序与后序遍历序列构造二叉树 难度 5 级 题目描述 要…

互联网行业汇总

互联网行业汇总&#xff0c;全网最全&#xff01;选行业不愁 从事互联网选什么行业&#xff1f;这似乎是很多朋友的困惑。 所以这里给大家把互联网行业做个细致的汇总&#xff0c;每个行业列举几个典型的APP&#xff0c;简单拆解下各自的盈利模式&#xff0c;希望能给大家提供参…

了解Netty,从IO开始

java程序员要想升级高级工程师或者成为架构师&#xff0c;绕不开Netty的学习&#xff0c;就算你不做IM即时通信&#xff0c;也不是网络编程的工作岗位&#xff0c;仅仅只是CRUD程序员&#xff0c;当你想要了解一下Dubbo、Redis、kafka、rabbitMQ、ES、zookeeper、nginx等等的底…

群硕与Microsoft Dynamics全球团队密切协作,加速ERP产品迭代

群硕具备强大的软件研发能力&#xff0c;搭建自动化测试平台&#xff0c;保证高质量交付。 ERP系统的引入被视为企业走向数字化转型的关键一步。 此系统有助于实现企业内部资源与外部资源的整合&#xff0c;通过软件把人、财、物、产、供、销及相应的物流、信息流、资金流、管…

大数据之LibrA数据库系统部署方案

组网方案 基本概念 FusionInsight LibrA集群的组网方案中包含如下节点&#xff0c;如表1所示。 网络平面类型 FusionInsight LibrA整个系统网络划分为2个平面&#xff0c;即业务平面和管理平面&#xff0c;两个平面之间采用物理隔离的方式进行部署&#xff0c;保证业务、管理…

Lua快速入门教程

文章目录 1、Linux安装Lua2、语法练习2.1、变量2.2、循环2.3、函数2.4、数组2.5、迭代器2.6、Table操作2.7、Lua 模块与包2.8、加载机制2.9、Lua 元表(Metatable) 3、Lua 协同程序(coroutine)4、文件IO操作4.1、简单模式4.2、完全模式 5、错误处理 内容来源菜鸟教程&#xff0c…

软考-访问控制技术原理与应用

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 访问控制概念 访问控制是计算机安全的一个重要组成部分&#xff0c;用于控制用户或程序如…

Linux | gdb的基本使用

目录 前言 一、调试文件的生成 二、调试指令 1、选择调试文件 2、查看代码 3、运行代码 4、断点 5、打印与常显示 6、其他 总结 前言 前面我们学习了如何使用gcc/g来进行对代码进行编译&#xff0c;本章我们将使用gdb来对代码进行调试&#xff0c;学习本章的前提是有…

实验室用超声波清洗机哪家好

随着超声波清洗机在实验室得到广泛应用&#xff0c;超声波清洗机厂家也随之增多&#xff0c;品牌、型号更是数不胜数&#xff0c;价格相差也是十分悬殊。那么面对纷繁复杂的实验室超声波清洗机市场&#xff0c;实验室用超声波清洗机哪家好&#xff1f;小编推荐国内知名超声波清…

《动手学深度学习 Pytorch版》 9.3 深度循环神经网络

将多层循环神经网络堆叠在一起&#xff0c;通过对几个简单层的组合&#xff0c;产生一个灵活的机制。其中的数据可能与不同层的堆叠有关。 9.3.1 函数依赖关系 将深度架构中的函数依赖关系形式化&#xff0c;第 l l l 个隐藏层的隐状态表达式为&#xff1a; H t ( l ) ϕ l …

用宝塔部署静态html页面

云服务器安装宝塔面板搭建LNMP环境&#xff0c;可以看另一文零基础搭建个人网站详细流程。 本文主要介绍用宝塔部署静态页面&#xff0c;比较简单&#xff0c;以部署一个用户协议为例。 首先&#xff0c;去“网站”中“添加站点”。有域名用域名&#xff0c;没域名用IP。 然后…