首页 > 编程语言 >[Java基础]拆箱装箱

[Java基础]拆箱装箱

时间:2024-09-26 22:23:56浏览次数:1  
标签:拆箱 Java 代码 valueOf 类型 Integer 装箱

在介绍本期文章内容之前,让我们先来看一小段代码:

int a = 10;
Integer b = 10;
if(b == a){
	System.out.println("相等");
}

执行结果应该大家是毋庸置疑的,10等于10,自然会输出相等。但是有一个问题,a明明是int类型,而b则是Integer类型。两个明显是不同类型的对象,为什么能够相等呢?这就涉及到我们这次要介绍的内容:拆箱、装箱
简介
首先,简单介绍下装箱、拆箱的含义:

装箱,指基础类型(int、double等)转换成包装类型(Integer、Double等)的过程
拆箱,顾名思义同装箱相反,是从包装类型转换到基础类型的过程。

在JDK1.5以前,还不存在装箱、拆箱的概念。因此,对于基本类型同包装类型的转换,基本只能通过代码手写实现。
ini 代码解读复制代码     Boolean a = Boolean.valueOf(true);
     Integer b = Integer.valueOf(10);

然而,懒惰是推动人类社会进步的动力。时间一长了,大家就发现:
“明明这两个类型都是表达相似含义的东西,有没有什么办法把这两个的转换隐藏起来呢?这样我就不用写着么多代码了呀”
实现原理
结合上述对于拆箱装箱的介绍,我们不难分析出来,要实现拆箱和装箱,至少需要考虑两点:

什么时候做拆箱装箱?
怎么做拆箱装箱?

啥时候拆箱装箱
首先明确一点,装箱和拆箱是指发生在基本类型与包装类型之间的。如果一个类根本都不存在包装类型 or 基本类型,那么肯定是不会发生拆箱装箱的。在Java中,同时存在基本类型和包装类型的有如下几个:

基本类型包装类型booleanBooleanbyteByteintIntegershortShortcharCharacterlongLongfloatFloatdoubleDouble
那么在知道了有哪些类型存在包装类和基本类后。我们还需要知道装箱和拆箱触发的时机。简单来说主要分为以下几个:
1、赋值
2、调用方法
3、数值计算
设值,这个主要就是讲的将基本类型的数值赋值给包装类型,如下代码所示:
ini 代码解读复制代码     Integer b = 10;

调用方法,主要指的是方法的入参为包装类型,传入的实际上是基本类型的情况,以Integer类型为例子,调用方法产生装箱拆箱的情况如下所示:

public static void main(String[] args) {
         //产生装箱、拆箱
         transform(1);
     }

     public static void transform(Integer b){
             System.out.println(b);
     }

最后一种情况,主要指的是基本类型同包装类型做计算的时候会发生拆箱。具体例子如下所示:
ini 代码解读复制代码     public static void main(String[] args) {
         Integer b = 10;
         int ab = 20;
         int i = b + ab; // b调用拆箱的方法
    }

怎么做拆箱装箱
装箱
在明确了拆箱装箱的时机以后,就是考虑如何实现转化了。实际上,在由编译.java的过程中,编译器会将特定的包装类型调用对应的转化方法,下面以具体的代码为例子:
ini 代码解读复制代码     Boolean a = true;
     Integer b = 10;

通过将上述代码的.class文件进行反编译(调用代码javap -c xxx.class),可以得到如下的反编译代码:
yaml 代码解读复制代码 public class com.example.demo.DemoApplication {
   public com.example.demo.DemoApplication();
     Code:
        0: aload_0
        1: invokespecial #1                  // Method java/lang/Object.""

标签:拆箱,Java,代码,valueOf,类型,Integer,装箱
From: https://www.cnblogs.com/DCFV/p/18434582

相关文章

  • 【JAVA-数据结构】包装类&简单认识泛型(1)
        这篇包含包装类和泛型相关知识,会用两篇文章进行讲解。1包装类        在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。1.1基本数据类型和对应的包装类除了Integer和Character......
  • Java面试八股文及答案整理( 2024年 最新版,持续更新)
    一、Java基础1.JDK和JRE有什么区别?JDK:JavaDevelopmentKit的简称,java开发工具包,提供了java的开发环境和运行环境。JRE:JavaRuntimeEnvironment的简称,java运行环境,为java的运行提供了所需环境。具体来说JDK其实包含了JRE,同时还包含了编译java源码的编......
  • 选择数字 - HakerRank 解决方案 - Javascript
    给定一个整数数组,找到任意两个元素之间的绝对差小于或等于的最长子数组例子_a=[1,1,2,2,4,4,5,5,5]_有两个满足条件的子数组:[1,1,2,2]和[4,4,5,5,5]。最大长度子数组有5个元素。功能说明在下面的编辑器中完成pickingnumbers函数。pickingnumbers有以下参数:int......
  • 基于Node.js+vue基于java的校园疫情管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景近年来,全球范围内频繁爆发的疫情事件对教育领域产生了深远影响,特别是在校园环境中,如何有效防控疫情、保障师生健康安全成为了亟待解决的问题。传统的校园管......
  • 解锁 JavaScript 中“navigator”对象的强大功能:综合指南
    javascript中的导航器对象是一个功能强大的工具,它允许web开发人员以远远超出简单网页交互的方式与用户的浏览器和设备进行交互。从访问地理位置数据到管理设备存储,导航器对象是一个功能宝库,可以增强web应用程序的功能。在本博客中,我们将探索导航器对象的一些最有用的功能,并提......
  • 解锁 JavaScript 的超能力:变量的魔力
    从今天开始,我们将探索编程的世界。?你拥有超能力的世界。是的,你没看错,超能力。如果不是超能力,那又是什么?使用javascript,您可以让物体飞、移动、消失、改变颜色,并在数英里之外看到您的朋友,而这只是可能的一小部分。是的,一切都在你的屏幕上,但仍然非常令人兴奋。像任何超级英雄一样,......
  • Java中面向对象将引用数据类型作为参数类型
    当参数类型为类名,抽象类名,接口名的时候1.当一个类名作为参数类型在一个方法的时候classStudent{publicvoidfun1(){System.out.println("我是父亲");}}classStudentDemo1{publicvoidfun2(Studentstudent){//当调用到这个方法时相当于:Student......
  • 理解 JavaScript 中的对象
    您是否遇到过需要在javascript代码中存储一组复杂信息的情况?例如,您需要将用户的数据存储在数据库中,例如姓名、年龄和地址。您将使用什么javascript框架来完成此任务?在本文中,我们将了解对象如何在此类任务中发挥作用,并了解javascript中这一重要数据集合的含义。跟我来吧!......
  • 理解 JavaScript 数组迭代方法
    我最近遇到一个面试问题,要求使用不同的方法来迭代javascript数组对象。提示最初看起来很简单,因为我应该提供一些示例代码片段。然而,这个问题引起了我的兴趣,所以我决定更深入地研究每种方法,不仅探索如何使用它们,而且探索何时以及为何选择一种方法而不是另一种方法。在本文中,我将......
  • 每个开发人员都应该掌握的 JavaScript 数组方法(第 1 部分)
    “能力越大,责任越大。”—本叔叔,蜘蛛侠(2002)就像蜘蛛侠必须掌握他新发现的能力一样,开发人员需要掌握javascript强大的数组方法才能高效、负责任地进行编码。让我们深入研究一些必须知道的数组方法!1.查找find()方法返回满足所提供的测试函数的第一个数组元素的值。ar......