Java 从入门到进阶之路(十九)

简介: Java 从入门到进阶之路(十九)

在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类。

在 Java 中有八个基本类型:byte,short,int,long,float,double,char,boolean,是以值的形式存在的,所以他们并没有面向对象的特征,自然也不继承自 Object,所以不能使用多台,用 Object 的角度去接受基本类型。

假设现在我们有一个计算 1+1 的值,代码如下:

 public class Main {
      public static void main(String[] args) {
          int i = 1 + 1;
          System.out.println(i); // 2
 
          Integer integer1 = new Integer(1);
          Integer integer2 = new Integer(1);
          int integer = integer1.intValue() + integer2.intValue();
          System.out.println(integer); // 2


     }
 }

 class Integer {
     private int i;

     public Integer(int i) {
         this.i = i;
     }

     public int intValue() {
         return i;
     }
 }

在上面的代码中,如果我们想要计算出 1+1 的值,按照之前所学的我们直接利用 int 类型数据 1+1 即可获取,但是我们在上面说了基本类型并不具备面向对象特征,那我们在某些情况下又需要怎么办呢,这就是上面代码中我们自己所写的 integer 类,但是如果我们仅仅是为了计算一个 1+1 ,每次都需要实例化一些 Integer 又太小题大做了。

所以 Java 就很贴心的为八个基本类型封装了一下,并且内置在了 lang 包内,即包装类,所以我们的代码如下也是可以正常运行的:

 public class Main {
      public static void main(String[] args) {
          int i = 1 + 1;
          System.out.println(i); // 2
 
          Integer integer1 = new Integer(1);
          Integer integer2 = new Integer(1);
         int integer = integer1.intValue() + integer2.intValue();
          System.out.println(integer); // 2
     }
 }

包装类是不可变类,在构造了包装类对象后,不允许更改包装在其中的值,包装类是 final 的,不能定义他们的子类。

在上面的图片中,我们可以看出,数字类型的包装类继承自 Number,char 和 boolean 类型的包装类继承自 Object,接下来我们就举例看一下,如下代码:

 /**
   * 数字类型的包装类继承自 Number
   * 其提供了入:intValue,doubleValue 这样的方法,
   * 其作用是将当前包装类表示的数字以其他数字类型的形式返回
   * */
  public class Main {
      public static void main(String[] args) {
          /**
           * 将基本类型转换成包装类有两种方法:
          * 1、调用构造方法
          * 2、调用静态方法 valueOf(推荐)
          * */
         Integer integer1 = new Integer(1);
         Integer integer2 = new Integer(1);
         System.out.println(integer1 == integer2); // false
         System.out.println(integer1.equals(integer2)); // true

         Integer integer3 = Integer.valueOf(1);
         Integer integer4 = Integer.valueOf(1);
         System.out.println(integer3 == integer4); // true
         System.out.println(integer3.equals(integer4)); // true

         Integer integer5 = Integer.valueOf(128);
         Integer integer6 = Integer.valueOf(128);
        System.out.println(integer5 == integer6); // false
         System.out.println(integer5.equals(integer6)); // true
     }
 }

在上面的代码中,我们先使用实例化的方法,结果跟之前文章所讲的 equals 方法时所得的结果一样,当我们使用 valueOf() 方法时,发现 == 也变为了 true,这是因为 valueOf 会重用对象,并不会重新分配地址,但是仅限于 -128 -- 127 之间的整数。一旦超过会去 new 一个新对象。相比较而言,在 -128 -- 127 之间时,valueOf 会帮我们节省一部分内存空间,所以推荐使用 valueOf。

当然包装类也为我们提供了转为基本类型的方法,如下:

 public class Main {
      public static void main(String[] args) {
          Integer integer = Integer.valueOf(128);
 
          int int1 = integer.intValue();
          System.out.println(int1); // 128
 
          float float1 = integer.floatValue();
          System.out.println(float1); // 128.0

         // byte 类型为 -128 -- 127,超出会重新计算
         byte byte1 = integer.byteValue();
         System.out.println(byte1); // -128
     }
 }

那我们怎么知道各个基本类型的最大值和最小值呢?包装类其实已经很贴心的为我们提供了方法,如下:

 /**
   * 数字类型包装类都支持两个常量
   * MAX_VALUE , MIN_VALUE
   * 分别保存了对应基本类型的最大值和最小值
   * */
  public class Main {
      public static void main(String[] args) {
          int intMax = Integer.MAX_VALUE;
          int intMin = Integer.MIN_VALUE;
         System.out.println(intMax); // 2147483647
         System.out.println(intMin); // -2147483648

         byte byteMax = Byte.MAX_VALUE;
         byte byteMin = Byte.MIN_VALUE;
         System.out.println(byteMax); // 127
         System.out.println(byteMin); // -128
     }
 }

通过上面的代码我们了解了包装类的一些基本特征和使用方法,那我们使用包装类的常用方法时什么呢?如下:

 /**
   * 包装类提供了一个静态方法 parseXXX(String str)
   * 可以将给定的字符串转换为对应的基本类型
   * 前提是该字符串必须正确的描述基本类型可以保存的值
   */
  public class Main {
      public static void main(String[] args) {
          String str = "123";
          int i = Integer.parseInt(str);
         System.out.println(i); // 123

         double d = Double.parseDouble(str);
         System.out.println(d); // 123.0

         float f = Float.parseFloat(str);
         System.out.println(f); // 123.0

         String str1 = "123.123";
         int i1 = Integer.parseInt(str1);
         System.out.println(i1); // 编译错误,Integer 并不能识别小数位

         double d1 = Double.parseDouble(str1);
         System.out.println(d1); // 123.123
    }
 }

在上面的代码中,我们分别定义了 "123" 和 "123.123" 两个字符串,从上面的输出结果可以看出,只有字符串能正确额描述基本类型可以保存的值才能运行成功。

接下来我们再来看一个包装类的自动拆装箱

 /**
   * JDK1.5 以后推出的新特性
   * 自动拆装箱
   */
  public class Main {
      public static void main(String[] args) {
          /**
           * 自动拆装箱是编译器认可,而不是虚拟机认可
           * 编译器在将源程序编译时自动补充代码来完成基本类型与包装类的转换
          * */
         int i = new Integer(1); // 编译器会默认在后面加 .intValue()
         Integer ii = 123; // 编译器会默认变为 Integer.valueOf(123)
     }
 }

在上面的代码中,我们可以看到 int 类型可以直接接受一个是实例化的包装类,包装类也可以直接接受一个基本类型的值,这就是自动拆装箱,避免了我们在编写程序时的转换,减少了代码量。

相关文章
|
4天前
|
Java 程序员 UED
Java中的异常处理:从入门到精通
【9月更文挑战第23天】在Java编程的世界中,异常是程序执行过程中不可避免的事件,它们可能会中断正常的流程并导致程序崩溃。本文将通过浅显易懂的方式,引导你理解Java异常处理的基本概念和高级技巧,帮助你编写更健壮、更可靠的代码。我们将一起探索如何捕获和处理异常,以及如何使用自定义异常来增强程序的逻辑和用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的见解和实用的技巧。
21 4
|
1月前
|
设计模式 前端开发 Java
【前端学java】SpringBootWeb极速入门-分层解耦(03)
【8月更文挑战第13天】SpringBootWeb极速入门-分层解耦(03)
17 2
【前端学java】SpringBootWeb极速入门-分层解耦(03)
|
1月前
|
开发框架 前端开发 Java
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
【8月更文挑战第12天】SpringBootWeb极速入门-实现一个简单的web页面01
52 3
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
|
1月前
|
JSON 前端开发 Java
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
【8月更文挑战第12天】SpringBootWeb极速入门-请求参数解析(02)
16 1
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
|
28天前
|
算法 Java 开发者
Java 编程入门:从零到一的旅程
本文将带领读者开启Java编程之旅,从最基础的语法入手,逐步深入到面向对象的核心概念。通过实例代码演示,我们将一起探索如何定义类和对象、实现继承与多态,并解决常见的编程挑战。无论你是编程新手还是希望巩固基础的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
29天前
|
存储 Java 程序员
Java中的集合框架:从入门到精通
【8月更文挑战第30天】在Java的世界里,集合框架是一块基石,它不仅承载着数据的存储和操作,还体现了面向对象编程的精髓。本篇文章将带你遨游Java集合框架的海洋,从基础概念到高级应用,一步步揭示它的奥秘。你将学会如何选择合适的集合类型,掌握集合的遍历技巧,以及理解集合框架背后的设计哲学。让我们一起探索这个强大工具,解锁数据结构的新视角。
|
1月前
|
Java 程序员 UED
Java中的异常处理:从入门到精通
【8月更文挑战第28天】在Java编程的世界里,异常处理是一块基石,它确保了程序的健壮性和可靠性。本文将通过深入浅出的方式,带你了解Java异常处理的基本概念、分类、以及如何有效地捕获和处理异常。我们将一起探索try-catch-finally结构的奥秘,并学习如何使用throws关键字声明方法可能会抛出的异常。此外,我们还会讨论自定义异常类的创建和使用,以及最佳实践。无论你是Java新手还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识,帮助你编写出更加稳定和可靠的代码。
|
1月前
|
编解码 网络协议 Oracle
java网络编程入门以及项目实战
这篇文章是Java网络编程的入门教程,涵盖了网络编程的基础知识、IP地址、端口、通讯协议(TCP和UDP)的概念与区别,并提供了基于TCP和UDP的网络编程实例,包括远程聊天和文件传输程序的代码实现。
java网络编程入门以及项目实战
|
16天前
|
Java 程序员
Java中的异常处理:从入门到精通
在Java编程的世界中,异常处理是保持程序稳定性和可靠性的关键。本文将通过一个独特的视角—把异常处理比作一场“捉迷藏”游戏—来探讨如何在Java中有效管理异常。我们将一起学习如何识别、捕捉以及处理可能出现的异常,确保你的程序即使在面对不可预见的错误时也能优雅地运行。准备好了吗?让我们开始这场寻找并解决Java异常的冒险吧!
|
1月前
|
前端开发 IDE Java
"揭秘前端转Java的秘径:SpringBoot Web极速入门,掌握分层解耦艺术,让你的后端代码飞起来,你敢来挑战吗?"
【8月更文挑战第19天】面向前端开发者介绍Spring Boot后端开发,通过简化Spring应用搭建,快速实现Web应用。本文以创建“Hello World”应用为例,展示项目基本结构与运行方式。进而深入探讨三层架构(Controller、Service、DAO)下的分层解耦概念,通过员工信息管理示例,演示各层如何协作及依赖注入的使用,以此提升代码灵活性与可维护性。
37 2