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

相关文章
|
16天前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
156 3
|
3月前
|
IDE Java 数据挖掘
Java 基础类从入门到精通实操指南
这份指南专注于**Java 17+**的新特性和基础类库的现代化用法,涵盖开发环境配置、数据类型增强(如文本块)、字符串与集合处理进阶、异常改进(如密封类)、IO操作及实战案例。通过具体代码示例,如CSV数据分析工具,帮助开发者掌握高效编程技巧。同时提供性能优化建议和常用第三方库推荐,适合从入门到精通的Java学习者。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
173 36
|
3月前
|
Java API 微服务
2025 年 Java 从入门到精通学习笔记全新版
《Java学习笔记:从入门到精通(2025更新版)》是一本全面覆盖Java开发核心技能的指南,适合零基础到高级开发者。内容包括Java基础(如开发环境配置、核心语法增强)、面向对象编程(密封类、接口增强)、进阶技术(虚拟线程、结构化并发、向量API)、实用类库与框架(HTTP客户端、Spring Boot)、微服务与云原生(容器化、Kubernetes)、响应式编程(Reactor、WebFlux)、函数式编程(Stream API)、测试技术(JUnit 5、Mockito)、数据持久化(JPA、R2DBC)以及实战项目(Todo应用)。
198 5
|
3月前
|
监控 Java 测试技术
2025 年 Java 核心技术从入门到精通实战指南
《2025年Java核心技术实战指南》全面覆盖Java开发的最新趋势与最佳实践。内容包括Java新特性(如模式匹配、文本块、记录类)、微服务架构(Spring Boot 3.0+、Spring Cloud)、响应式编程(Reactor、WebFlux)、容器化与云原生(Docker、Kubernetes)、数据访问技术(JPA、R2DBC)、函数式编程、单元测试与集成测试(JUnit 5、Mockito)、性能优化与监控等。通过实战案例,帮助开发者掌握构建高性能、高可用系统的技能。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
195 7
|
3月前
|
消息中间件 Java 微服务
2025 版 Java 学习路线实战指南从入门到精通
《Java学习路线实战指南(2025版)》是一份全面的Java开发学习手册,涵盖基础环境搭建、核心语法与新特性、数据结构与算法、微服务架构、云原生技术栈、AI融合及项目实战。内容包括JDK安装配置、IntelliJ IDEA设置、Records类与模式匹配增强、LeetCode题解、Spring Cloud微服务开发、Kubernetes部署、OpenAI API调用等。结合在线商城系统案例,采用Vue 3、Spring Boot 3.5、MySQL、Elasticsearch等技术,提供从理论到实践的完整路径,助力开发者掌握2025年最新趋势与最佳实践。
306 4
|
25天前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
141 1
|
19天前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
63 0
|
2月前
|
存储 缓存 NoSQL
java 集合入门基础理论的核心概念与实用长尾知识
本文介绍了Java集合框架的基础理论知识,包括单列集合(List、Set、Queue)和双列集合(Map)的特点及常用实现类(如ArrayList、HashSet、HashMap等)。详细讲解了集合的遍历方式(迭代器、增强for循环、Lambda表达式)和典型应用场景(如数据去重、键值存储等)。通过具体代码示例,帮助初学者理解集合框架的核心概念和实际应用,为Java编程中的数据存储与管理提供基础指导。
71 0
|
2月前
|
缓存 NoSQL Java
Java Web 从入门到精通之苍穹外卖项目实战技巧
本项目为JavaWeb综合实战案例——苍穹外卖系统,涵盖Spring Boot 3、Spring Cloud Alibaba、Vue 3等主流技术栈,涉及用户认证、订单处理、Redis缓存、分布式事务、系统监控及Docker部署等核心功能,助你掌握企业级项目开发全流程。
246 0
|
2月前
|
存储 安全 Java
Java 学习路线 35 掌握 List 集合从入门到精通的 List 集合核心知识
本文详细解析Java中List集合的原理、常用实现类(如ArrayList、LinkedList)、核心方法及遍历方式,并结合数据去重、排序等实际应用场景,帮助开发者掌握List在不同业务场景下的高效使用,提升Java编程能力。
275 0

热门文章

最新文章