第二章 包装类和泛型

server/2024/12/14 19:10:55/

一  包装类

1.产生的原因:

Java的发明者既想要保存原有基本类型不变,但同时很多功能机制又需要为引用类型/类才可以使用(可以将其与Object类统一为统一体系),所以将基本类型包装了一下,为包装类型

2.写法:

int->Integer          char->Character

其它都是改变第一个字母为大写

3.装箱和拆箱

装箱:内置类型转换为包装类

方法:

(1)使用Integer.valueOf方法

(2)new对象时顺便转换

new Integer(数字)

拆箱:将包装类转换为内置类型

注:现在idea已经可以其对进行自动装箱和拆箱功能了

4.使用:

对于包装类,由于其可以自动装箱,可以当作内置类型去使用,比如进行算术运算等

但是对于某些功能,必须要将内置类型转换为包装类才能进行使用

5.特殊情况:

JVM对于Integer做了优化,其对于常用的Integer对象提前进行创建(范围为-128-127),存放于常量池中,所以当其对其赋值在该范围内,其引用都是指向同一提前创建好的对象

二  泛型

1.作用:当类型发生改变,其依旧可以适用,即同一份代码,支持不同数据类型,实现代码重用,起到将类型参数化的效果

2.相似的实现方式:所有Object类型

问题:(1)所有的类型都能存放于一个Object数组,会导致混乱

区别于泛型:其进行类型指定后就相当于确定了该变量和该数组只能存放对应类型的变量,对其进行了约束(相当于一个容器,指定了该容器只能存放什么类型的值,并且编译器后续会对其做更严格的检查)

           (2)需要进行强转

3.特性:

(1)其类型为参数的变量不可以实例化

(2)并且类型为参数的变量不可带static,因为static是在类加载的时候就已经确定类型了,而其就类型需要等运行起来才能确定

(3)其可以拥有多个参数类型

(4)其参数类型必须为类,如果是内置类型必须使用其包装类

4.类型推导:一开始前面的类型写全其指定的类型,后面new可不写类型,根据类型推导猜出其是什么类型

5.裸类型:不指定具体参数类型,直接创建对象,系统会自动默认为Object

注:不建议这样写,之后可能会被删除这样的规则

6.类型擦除:编译器在编译的时候会将代表类型的形参擦去,在代码中出现的地方全都替换为Object,并且后续会做一系列检查,在实例化阶段,根据其指定的类型编译器会做更严格的检查

7.泛型上界和泛型下界

(1)泛型上界:

(i)定义:指定参数类型必须为某个类的子类或就为此类本身

(ii)写法:<T extends 父类>

(iii)适用:可修饰参数类型(即类的定义处),以及引用的类型(定义变量处)

(2)泛型下界

(i)定义:指定参数类型必须为某个类的父类或就为此类本身

(ii)写法:<T super 子类>

(iii)仅适用于修饰引用的类型

例如

Test< ?super 子类>  test=new Test<>();

则test其之后要指向的引用类型必须为子类的父类

8.通配符

(1)使用:利用?作为通配符,表示此处可为任意类型,用于定义变量,使该变量可以作为多个类型的引用

例如Test<?> test =new Test<>();

此时即可以作为指定String类型的Test类引用,又可以作为Integer类型的Test类引用

(2)注:次数后面new新对象时就需要显性定义

9.泛型方法:

(1)使用时写法:类型.<类型>方法名

(2)注:此时不允许使用类型推导,后面要明确写出其对应类型


http://www.ppmy.cn/server/150164.html

相关文章

RabbitMQ中点对点(Point-to-Point)通讯方式的Java实现

RabbitMQ是一个广泛使用的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。RabbitMQ支持多种消息传递模式&#xff0c;其中最基本的是点对点&#xff08;Point-to-Point&#xff09;通讯方式。在这种模式下&#xff0c;消息生产者将消息发…

java配置环境变量 jdk配置环境变量 linux环境

一. 使用yum安装jdk centos系统中可以使用yum来安装jdk, 执行以下命令 查询yum仓库信息 yum list java* java-1.8.0-openjdk.x86_64 1:1.8.0.422.b05-1.1.al7 updates java-1.8.0-openjdk-devel.x86_64 …

使用Vue.js的步骤

使用Vue.js开发一个应用的详细流程和代码示例如下&#xff1a; 1. 环境准备和项目初始化 使用Vue CLI创建项目 Vue CLI是一个全局命令行工具&#xff0c;用于快速搭建Vue项目。首先&#xff0c;你需要安装Vue CLI&#xff1a; bash npm install -g vue/cli # 或者 yarn glo…

【解决】k8s使用flannel网络插件的问题整理

问题1: 拉取镜像失败ImagePullBackOff 问题排查 1、查看所有pod的状态 kubectl get pods --all-namespaceskube-flannel的两个pod状态为ImagePullBackOff&#xff0c;由于镜像拉取异常导致 2、查看pod启动日志&#xff0c;获取更详细的信息 kubectl logs -n 命名空间namesp…

以ATTCK为例构建网络安全知识图

ATT&CK&#xff08;Adversarial Tactics, Techniques, and Common Knowledge &#xff09;是一个攻击行为知识库和模型&#xff0c;主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。本文简单介绍ATT&CK相关的背景概念&#xff0c;并探讨通过ATT&a…

Qt之截图存为图片或PDF打印(七)

Qt开发 系列文章 - Screenshot-To-PicOrPDF&#xff08;七&#xff09; 目录 前言 一、截图 二、功能实现 1.创建项目 2.新建类 3.编写类 1.定义头文件 2.相关功能函数 3.使用类 总结 前言 本文利用Qt平台&#xff0c;实现屏幕截图功能&#xff0c;并将截图复制、保…

Ubuntu中iptables默认是开启的吗

不&#xff0c;Ubuntu 中 iptables 默认不是开启的。 虽然 Ubuntu 系统默认安装了 iptables 软件包&#xff08;你可以通过 dpkg -l iptables 或 which iptables 命令来验证&#xff09;&#xff0c;但这并不意味着 iptables 规则已经生效。实际上&#xff0c;iptables 的规则…

《从零开始:轻松入门数据结构的世界》

一、为什么数据结构如此重要&#xff1f; 数据结构就像是程序的骨架&#xff0c;它决定了数据在内存中的存储方式&#xff0c;以及我们如何对这些数据进行操作。一个好的数据结构可以大大提高程序的运行效率&#xff0c;减少内存消耗。我们将通过一个简单的比喻来理解这一点&a…