包装类、自动装箱与自动拆箱

Java为什么要设计包装类,或者是涉及包装类的目的是什么?自动装箱与自动拆箱是指什么?

Java是面向对象的语言,设计理念就是“一切皆是对象”。但是8种基本数据类型却不属于对象,为了解决这个问题,JDK1.5中为每个基本数据类型都定义了一个对应的引用类型,叫做包装类。

自动装箱:可以把一个基本类型的数据直接赋值给对应的包装类型;
自动拆箱:可以把一个包装类型的数据直接赋值给对应额基本类型;

可能Sun 公司大牛们们,想解放开发人员吧,去掉繁文缛节。使得代码更加简洁,因为程序员不需要手动进行基本数据类型和包装类之间的转换
自动装箱和自动拆箱是Java语言中的两个特性。自动装箱是指将基本数据类型自动转换为对应的包装类对象,而自动拆箱则是指将包装类对象自动转换为对应的基本数据类型。这些特性使得代码更加简洁,因为程序员不需要手动进行基本数据类型和包装类之间的转换。例如:

int i = 10;
Integer j = i; // 自动装箱
int k = j; // 自动拆箱

这样的代码可以自动完成类型转换,不需要在代码中显式地进行类型转换。

Java中的基本数据类型(如int、double等)是不具备对象特性的,不能直接参与面向对象的操作,例如存储在集合中、作为方法的参数或返回值等。为了解决这个问题,Java提供了对应的包装类(如Integer、Double等),将基本数据类型包装成了对象,从而可以进行面向对象的操作。

包装类的主要目的是提供了一种将基本数据类型转换为对象的方式,使得基本数据类型具有了对象的特性,可以进行更多的操作。例如,可以使用包装类的方法进行数值的比较、转换、格式化等操作。

自动装箱与自动拆箱是Java 5引入的特性,它们使得基本数据类型和对应的包装类之间的转换更加方便。自动装箱指的是将基本数据类型自动转换为对应的包装类对象,而自动拆箱则是将包装类对象自动转换为对应的基本数据类型。这样,我们就可以在代码中直接使用基本数据类型,而不需要手动进行装箱和拆箱的操作。例如:

// 自动装箱
Integer i = 10;

// 自动拆箱
int j = i;

自动装箱和自动拆箱可以使代码更加简洁、易读,但需要注意的是,频繁的装箱和拆箱操作可能会影响程序的性能。

可以看这个了解下《为什么需要Java包装类,包装类使用操作》

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7483535
  • 你也可以参考下这篇文章:使用java面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。
  • 同时,你还可以查看手册:java-学习Java语言 - 描述Java编程语言的基本概念和特点的课程。-泛型是Java编程语言的一个强大功能。它们提高了代码的类型安全性,使更多的错误可以在编译时发现。-野生动物 中的内容
  • 除此之外, 这篇博客: 【数据结构】Java实现数据结构的前置知识,时间复杂度空间复杂度,泛型类的讲解中的 包装类、装箱与拆箱 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在Java中我们说一切皆对象,难道基本数据类型也是对象嘛?虽然他们不是对象,但Java中为每个基本数据类型提供了包装类。

    基本数据类型包装类
    byteByte
    shortShort
    intInteger
    longLong
    floatFloat
    doubleDouble
    charCharacter
    booleanBoolean
       public static void main(String[] args) {
            int num = 1;
            Integer i = Integer.valueOf(num);
            Integer i2 = new Integer(num);
    
            int num2 = i.intValue();
    
            System.out.println(i + " " + i2+ " " + num2);
        }
    

    上图就是装箱和拆箱的操作,我们发现很复杂,为了简便我们代码的编写Java为我们提供了自动装箱和自动拆箱的操作。

       public static void main(String[] args) {
            Integer i = 10;
            int num = i;
        }
    
    

    这样也可以实现装箱和拆箱的操作。了解完装箱和拆箱我们来看一道面试题:

        public static void main(String[] args) {
            Integer a = 127;
            Integer b = 127;
    
            Integer c = 128;
            Integer d = 128;
    
            System.out.println(a == b);
            System.out.println(c == d);
        }
    

    上面这行代码的输出的结果什么呢?兄弟们可能会觉得包装类是引用数据类型,所以==比较的是引用指向对象的地址,所以abcd都不相同,输出两个false结果真的是这样嘛?
    在这里插入图片描述
    结果和我们所推测的并不相同,这是为什么呢?在自动装箱时同样会调用Integer类的valueOf()方法,所以我们去看看源码的逻辑是怎样的
    在这里插入图片描述
    当我们的形参在这个IntegerCache.low IntegerCache.high之间就不会new一个新对象,而超过这个范围的数据就需要重新new一个对象。所以 Integer a = 127; Integer b = 127;并没有重新创建对象,所以a == b输出的true
    在这里插入图片描述

  • 您还可以看一下 汪翠老师的java项目实战之欢乐斗地主游戏开发教程 毕业项目课程设计带源码课程中的 给扑克牌绑定鼠标事件实现单击可以选择出牌列表小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    Java中的包装类是针对基本数据类型所设计的。包装类的设计是为了提供一些常用的功能以及解决一些实际问题。比如,包装类提供了方法将基本数据类型转成字符串,也提供了方法将字符串转化成基本数据类型等。此外,包装类还能够允许在基本数据类型和对象之间自动装箱和拆箱。自动装箱(Autoboxing)是指在需要使用到基本数据类型作为对象时,自动将基本数据类型转换为对应的包装类对象。例如:Integer i = 3; 自动拆箱(Unboxing)是指在将包装类类型的对象转换为其对应的基本数据类型时,自动将包装类对象转换为对应的基本数据类型。例如:int i = new Integer(3);

    在Java中实现多态主要需要三个条件:继承、重写和向上转型。首先,子类和父类之间必须存在继承关系,子类才能够继承父类并重写其中某些方法。其次,子类必须对父类中的某些方法进行重写,才能实现多态的效果。最后,必须使用向上转型的方法,即将子类的对象赋给父类的引用变量,才能够在程序运行期间决定引用变量指向哪个类的实例对象,并且发出相应的方法调用。

    在Java中参数的传递根据参数的数据类型而确定。对于基本数据类型,方法传递的是实际参数的拷贝,对形参进行修改不会影响到实际参数的值,因此属于值传递。对于引用数据类型,方法传递的是地址,形参与实参共用同一块地址空间,因此对形参的任何修改都直接修改了实参的值,因此属于地址传递。

    代码演示

    public class SumOfFractions {
        public static void main(String[] args) {
            int n = 20;
            int x = 2, y = 1;
            double sum = 0.0;
            for (int i = 1; i <= n; i++) {
                sum += (double) x / y;
                int temp = y;
                y = x;
                x += temp;
            }
            System.out.println("前" + n + "项相加之和为:" + sum);
        }
    }
    

    如上所示,可以使用for循环和临时变量完成数列求和。

    最后提醒一句,参考资料中的一些内容与本问题的回答并无关联,因此需要谨慎参考。