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 类型可以直接接受一个是实例化的包装类,包装类也可以直接接受一个基本类型的值,这就是自动拆装箱,避免了我们在编写程序时的转换,减少了代码量。

相关文章
|
2月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
313 0
|
3月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
417 0
|
4月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
638 3
|
6月前
|
Java API 微服务
2025 年 Java 从入门到精通学习笔记全新版
《Java学习笔记:从入门到精通(2025更新版)》是一本全面覆盖Java开发核心技能的指南,适合零基础到高级开发者。内容包括Java基础(如开发环境配置、核心语法增强)、面向对象编程(密封类、接口增强)、进阶技术(虚拟线程、结构化并发、向量API)、实用类库与框架(HTTP客户端、Spring Boot)、微服务与云原生(容器化、Kubernetes)、响应式编程(Reactor、WebFlux)、函数式编程(Stream API)、测试技术(JUnit 5、Mockito)、数据持久化(JPA、R2DBC)以及实战项目(Todo应用)。
385 5
|
3月前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
561 3
|
4月前
|
NoSQL Java 关系型数据库
Java 从入门到进阶完整学习路线图规划与实战开发最佳实践指南
本文为Java开发者提供从入门到进阶的完整学习路线图,涵盖基础语法、面向对象、数据结构与算法、并发编程、JVM调优、主流框架(如Spring Boot)、数据库操作(MySQL、Redis)、微服务架构及云原生开发等内容,并结合实战案例与最佳实践,助力高效掌握Java核心技术。
423 1
|
4月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
4月前
|
Java 编译器 API
Java Lambda表达式与函数式编程入门
Lambda表达式是Java 8引入的重要特性,简化了函数式编程的实现方式。它通过简洁的语法替代传统的匿名内部类,使代码更清晰、易读。本文深入讲解Lambda表达式的基本语法、函数式接口、方法引用等核心概念,并结合集合操作、线程处理、事件回调等实战案例,帮助开发者掌握现代Java编程技巧。同时,还解析了面试中高频出现的相关问题,助你深入理解其原理与应用场景。
|
3月前
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
720 0
|
4月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
345 1