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

Java面向对象(内部类)(枚举)(泛型)

内部类

内部类是五大成员之一(成员变量、方法、构造方法、代码块、内部类);

一个类定义在另一个类的内部,就叫做内部类;

当一个类的内部,包含一个完整的事物,且这个事务不必单独设计,就可以把这个事务设计为内部类;

Public class Car{//内部类Public class Engine{}}

内部类的四种形式:

成员内部类; 静态内部类; 局部内部类;匿名内部类

成员内部类

定义在成员位置的类,叫做成员内部类;

public class Outner {private String name = "科比";private int age = 43;//访问内部类的成员变量及方法public static void main(String[] args) {//创建内部类的对象Inner inner = new Outner().new Inner();inner.test();}//成员内部类public class Inner{private String name = "詹姆斯";private int age = 38;public void test(){//访问内部类的成员变量System.out.println(name);System.out.println(age);//访问内部类的成员变量System.out.println(Outner.this.name);System.out.println(Outner.this.age);}}
}

创建内部类的对象:new 外部类().new 内部类();

在内部类中调用外部类的成员变量: 外部类.this.外部类的成员变量;

静态内部类

在内部类中用static修饰的内部类叫做静态内部类;

public class Outner {static String name = "科比";private int age = 43;public static void main(String[] args) {//创建内部类的对象new Outner.Inner().test();}static class Inner{public void test(){//访问外部类的静态方法,非静态方法访问不到;System.out.println(Outner.name);//            System.out.println(Outner.this.age); 报错}}
}

静态内部类只能调用外部类的静态变量;

创建内部类对象:new 外部类.内部类();

局部内部类

局部内部类是定义在方法中的类,和局部变量一样,只能在方法中有效。所以局部内部类的局限性很强,一般在开发中是不会使用的。

public class Outer{public void test(){//局部内部类class Inner{public void show(){System.out.println("Inner...show");}}//局部内部类只能在方法中创建对象,并使用Inner in = new Inner();in.show();}
}

局部内部类只能在方法中创建对象,局限性比较强,所以开发中一般不会使用;

匿名内部类

匿名内部类是一种特殊的局部内部类,因为不需要声明名字,所以叫做匿名内部类;

new 父类/接口(参数值){@override重写父类或者接口的方法}

匿名内部类时间上是一个没有名字的子类对象,或者接口实现类的无名对象

public class Dome01 {public static void main(String[] args) {//匿名内部类的实现new Animal(){//符合多态思想的:编译看左,运行看右思想;@Overridepublic void cry() {System.out.println("狗叫旺旺旺");}}.cry();//匿名对象直接调用Animal的cry方法}
}//创建一个动物的抽象类
abstract class Animal{public abstract void cry();
}

需要注意的是,匿名内部类在编写代码时没有名字,编译后系统会为自动为匿名内部类生产字节码,字节码的名称会以外部类$1.class的方法命名

匿名内部类的作用:简化了创建子类对象、实现类对象的书写格式。  

匿名内部类的应用场景

只有在调用方法时,当方法的参数是一个接口或抽象类时,为了简化书写代码,而直接传递匿名内部类给方法。

public class Dome01 {public static void main(String[] args) {//匿名内部类对象1new Swimming(){@Overridepublic void swim() {System.out.println("狗游泳飞快");}}.swim();//匿名内部类对象2new Swimming(){@Overridepublic void swim() {System.out.println("猫不会游泳");}}.swim();}public void go(Swimming s){//将接口Swimming作为形参System.out.println("开始比赛");s.swim();System.out.println("结束比赛");}}
interface Swimming{//接口public void swim();
}

枚举

枚举是一种特殊的类,它的格式:

Public enum A{X,Y,Z}

其中XYZ叫做枚举项,它属于枚举的一个对象。想要获得枚举对象只需要用枚举名调用;

  • 枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
  • 枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。
  • 枚举都是最终类,不可以被继承。
  • 枚举类中,从第二行开始,可以定义类的其他各种成员。 编译器为枚举类新增了几个方法,并且枚举类都是继承:java.lang.Enum类的,从enum类也会继承到一些方法。
public class Test{public static void main(String[] args){//获取枚举A类的,枚举项A a1 = A.X;A a2 = A.Y;A a3 = A.Z;}
}

通过反编译的形式来验证(需要用到反编译的命令,这里不能直接将字节码拖进idea反编译)

枚举类A是用class定义的,说明枚举确实是一个类,而且X,Y,Z都是A类的对象;而且每一个枚举项都是被public static final修饰,所以可以类名调用,而且不能更改。

枚举类的应用场景

枚举一般表示一组信息,然后作为参数进行传输。  

我们来看一个案例。比如我们现在有这么一个应用,用户进入应用时,需要让用户选择是女生、还是男生,然后系统会根据用户选择的是男生,还是女生推荐不同的信息给用户观看。

 

public class Dome01 {public static void main(String[] args) {get(GENDER.BOY);get(GENDER.GIRL);}public static void get(GENDER gender){if (gender == GENDER.BOY){System.out.println("男生观看");}else {System.out.println("女生观看");}}}
enum GENDER{BOY,GIRL
}

最终再总结一下枚举的应用场景:枚举一般表示几个固定的值,然后作为参数进行传输

枚举设计单例设计模式

单例设计模型也可以使用枚举进行设计,

public class dome01 {public static void main(String[] args) {Singleton instance1 = Singleton.INSTANCE;Singleton instance2 = Singleton.INSTANCE;System.out.println(instance2 == instance1);//判断两个对象的地址值,确定只能创建一个对象}
}
enum Singleton{INSTANCE;public void method(){System.out.println("我是一个单例");}}

泛型

认识泛型

所谓泛型就是在定义类、接口、方法的时候同时声明一个或者多个类型变量<E>,称为泛型类,泛型接口,泛型方法。

  • 泛型的好处:在编译阶段可以避免出现一些非法的数据。

  • 泛型的本质:把具体的数据类型传递给类型变量。

自定义泛型

//这里的<T,W>其实指的就是类型变量,可以是一个,也可以是多个。
public class 类名<T,W>{}

 ArrayList的底层实现

//定义一个泛型类,用来表示一个容器
//容器中存储的数据,它的类型用<E>先代替用着,等调用者来确认<E>的具体类型。
public class MyArrayList<E>{private Object[] array = new Object[10];//定一个索引,方便对数组进行操作private int index;//添加元素public void add(E e){array[index]=e;index++;}//获取元素public E get(int index){return (E)array[index];}
}

测试类,来测试自定义的泛型类MyArrayList是否能够正常使用

public class Test{public static void main(String[] args){//1.确定MyArrayList集合中,元素类型为String类型MyArrayList<String> list = new MyArrayList<>();//此时添加元素时,只能添加String类型list.add("张三");list.add("李四");//2.确定MyArrayList集合中,元素类型为Integer类型MyArrayList<Integer> list1 = new MyArrayList<>();//此时添加元素时,只能添加String类型list.add(100);list.add(200);}
}

相关文章:

Java面向对象(内部类)(枚举)(泛型)

内部类 内部类是五大成员之一&#xff08;成员变量、方法、构造方法、代码块、内部类&#xff09;&#xff1b; 一个类定义在另一个类的内部&#xff0c;就叫做内部类&#xff1b; 当一个类的内部&#xff0c;包含一个完整的事物&#xff0c;且这个事务不必单独设计&#xf…...

macOS - 安装 GNU make、cmake

文章目录 关于 cmake使用 brew 安装 关于 GNU make方式一&#xff1a;brew方式二&#xff1a;下载源码 关于 cmake 官网&#xff1a;https://cmake.org/ 使用 brew 安装 brew 安装 cmake: https://formulae.brew.sh/formula/cmake安装使用 brew : https://blog.csdn.net/lovec…...

vue中style scoped属性的作用

一、为什么要给style 节点加 scoped 属性&#xff08;vue&#xff09; 1、作用&#xff1a;当style标签里面有scoped属性时&#xff0c;它的css只作用于当前组建的元素。在单页面项目中可以使组件之间互不污染&#xff0c;实现模块化&#xff08;实现组件的私有化&#xff0c;不…...

【ARM 嵌入式 编译系列 10.2 -- 符号表与可执行程序分离详细讲解】

文章目录 符号表与可执行程序分离方法一 使用eu-strip方法二 使用 objcopy上篇文章:ARM 嵌入式 编译系列 10.1 – GCC 编译缩减可执行文件 elf 文件大小 下篇文章:ARM 嵌入式 编译系列 10.3 – GNU elfutils 工具小结 符号表与可执行程序分离 接着上篇文章 ARM 嵌入式 编译…...

Gin各种参数接收

Gin参数接收 文章目录 Gin参数接收1.各个参数的接收方法Gin中发送JSON数据Gin接收querystring数据Gin接收Form的参数Gin接收URI参数 2.参数绑定方式接收(更加方便)推荐一款软件 1.各个参数的接收方法 声明: 这里的c都是c *gin.Context中的c Gin中发送JSON数据 在传输或接受JS…...

【Python】进阶之 MySQL入门教程

文章目录 数据库概述Mysql概述Mysql安装与使用Navicat安装和使用Mysql终端指令操作Mysql和python交互订单管理案例实现 数据库概述 数据库的由来 发展历程说明人工管理阶段用纸带等进行数据的存储文件系统阶段数据存储在文件中数据库阶段解决了文件系统问题高级数据库阶段分布式…...

Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法

Word 2019打开.doc文档后图片和公式不显示&#xff08;呈现为白框&#xff09;的解决办法 目录 Word 2019打开.doc文档后图片和公式不显示&#xff08;呈现为白框&#xff09;的解决办法一、问题描述二、解决方法1.打开 WORD 2019&#xff0c;点击菜单中的“文件”&#xff1b;…...

三个整数排序

描述 给定三个整数&#xff0c;请将它们按从小到大的顺序输出。 输入 输入为一行&#xff0c;包含三个整数&#xff0c;用空格分隔。 输出 输出为一行&#xff0c;包含三个整数&#xff0c;用空格分隔&#xff0c;表示排序后的结果。 输入样例 1 9 3 7 输出样例 1 3 …...

Nginx反向代理出现错误 502 bad gateway 案例解析

场景描述 Nginx uwsgi flask Flask框架写的程序&#xff0c;使用uwsgi启动&#xff0c;Nginx作为反向代理调用Flask应用。 Flask应用有些操作时间比较长&#xff0c;会超过1分钟&#xff0c;在网页端访问会出现错误: 502 bad gateway。 Nginx的错误日志中会出现错误&#xf…...

截止到目前全量主体总数有多少?

企业主体类型 企业主体类型有很多种&#xff0c;一般我们会分为公司&#xff08;有限责任&#xff09;、合伙企业、个人独资企业、个体经营户这些类别。 今天我们按照企业&#xff0c;个体&#xff0c;组织的分类方式来看各个主体的总数。 企业&#xff1a;统一社会信用代码…...

HTTP--Request详解

请求消息数据格式 请求行 请求方式 请求url 请求协议/版本 GET /login.html HTTP/1.1 请求头 客户端浏览器告诉服务器一些信息 请求头名称: 请求头值 常见的请求头&#xff1a; User-Agent&#xff1a;浏览器告诉服务器&#xff0c;我访问你使用的浏览器版本信息 可…...

Linux C++ 网络编程基础(2) : TCP多线程一个server对应多个client

目录 一、linux posix线程相关函数介绍二、tcp server基础版本三、tpc服务端多线程版本四、tpc客户端代码tcp编程时, 一个server可以对应多个client, server端用多线程可以实现. linux下多线程可以使用POSIX的线程函数, 下面给出服务端和客户端的代码. 一、linux posix线程相关…...

如何构建一个 NodeJS 影院微服务并使用 Docker 部署

文章目录 前言什么是微服务&#xff1f;构建电影目录微服务构建微服务从 NodeJS 连接到 MongoDB 数据库总结 前言 如何构建一个 NodeJS 影院微服务并使用 Docker 部署。在这个系列中&#xff0c;将构建一个 NodeJS 微服务&#xff0c;并使用 Docker Swarm 集群进行部署。 以下…...

BEVFusion(ICRA-2023)--01

说明&#xff1a;论文 BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation 原代码运行记录 原始环境&#xff1a;python 3.9 torch 1.12 &#xff08;失败&#xff09; 报错&#xff1a; python setup.py develop/mmdet3d/ops/ball_qu…...

Java——Iterator迭代器

在程序开发中&#xff0c;经常需要遍历集合中的所有元素。针对这种需求&#xff0c;JDK专门提供了一个接口java.util.Iterator。Iterator接口也是Java集合中的一员&#xff0c;但它与Collection、Map接口有所不同&#xff0c;Collection接口与Map接口主要用于存储元素&#xff…...

GCC编译过程:预处理->编译->汇编->链接

目录 引言 概括介绍 一、预处理 二、编译 三、汇编 四、链接 总结 引言 当使用集成开发环境&#xff08;IDE&#xff09;进行C语言编程时&#xff0c;点击"编译"按钮后&#xff0c;整个C程序从源代码到可执行文件的生成过程会自动完成。IDE会在后台为我们执行C…...

JVM笔记 —— 出现内存溢出错误时时如何排查

一、出现内存溢出的几种情况 内存溢出错误分为StackOverflowError和OutOfMemoryError&#xff0c;前者是栈中出现溢出&#xff0c;后者一般是堆或方法区出现溢出&#xff0c;简称OOM 1. 栈溢出 StackOverflowError 栈溢出一般都是因为没有正确的结束递归导致的&#xff0c;无…...

多级嵌套引入组件导致Vue提示子组件未注册问题

发生此问题的时候是页面解析的时报错的&#xff0c; 所以可以放在beforeCreate中执行注册组件这个时候是在页面运行时执行的&#xff0c;运行时编译就结束了 第一种&#xff1a;可以在父组件中动态注册组件 export default{beforeCreate(){//require是commonJS,commonJS导入ES…...

vue3+element-plus组件下拉列表,数组数据转成树形数据

引入组件 可以直接在项目中引入element-plus表格组件&#xff0c;如果需要变成下拉列表样式需要添加以下属性&#xff1a; row-key 必填 最好给数字或唯一属性 &#xff0c; 给每个节点设置id 不填的话 没有办法实现展开效果 load 这个是动态添加数据的 前提&#xff08;开启…...

【kubernetes】调度约束

目录 调度约束 Pod 启动典型创建过程如下 调度过程 指定调度节点 查看详细事件&#xff08;发现未经过 scheduler 调度分配&#xff09; 获取标签帮助 需要获取 node 上的 NAME 名称 给对应的 node 设置标签分别为 ggls 和 gglm 查看标签 修改成 nodeSelector 调度方…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...