Java 包装类是什么

 java中的数据类型int,double等不是对象,无法通过向上转型获取到Object提供的方法,而像String却可以,只因为String是一个对象而不是一个类型。基本数据类型由于这样的特性,导致无法参与转型,泛型,反射等过程。为了弥补这个缺陷,java提供了包装类。

 包装类顾名思义就是将基本的数据类型以及一些辅助方法包装到类中,例如自己实现一个int的包装类:

class IntDemo {
    private int num;
    public IntDemo(int num) {
        this.num = num;
    }
    public int intValue() {
        return this.num;
    }
}

1. Java提供的包装类

 虽然上面的IntDemo类能实现一些辅助功能,而且可以支持泛型反射等功能,但是如果如果每次使用都自己封装这么一个类的话,就太繁琐了。所以,java为我们提供了基本数据类型的包装类,这些包装类分为两类,一种是对象型包装类,不继承任何其他类(Object的直接子类),另一种是数值型包装类,继承于Number类。

 对象型(Object 的直接子类)包装类:

// boolean的包装类
public final class Boolean implements java.io.Serializable,
                                      Comparable<Boolean>

// char的包装类
public final
class Character implements java.io.Serializable, Comparable<Character>

 数值型(继承了Number类)包装类:

// byte的包装类
public final class Byte extends Number implements Comparable<Byte>

// short的包装类
public final class Short extends Number implements Comparable<Short> 

// int的包装类
public final class Integer extends Number implements Comparable<Integer>

// long的包装类
public final class Long extends Number implements Comparable<Long> 

// float的包装类
public final class Float extends Number implements Comparable<Float> 

// double的包装类
public final class Double extends Number implements Comparable<Double> 

 Boolean和Character两个类就是正常的属性方法封装,但是数值型的包装类继承了一个Number类。

public abstract class Number implements java.io.Serializable

其中定义的方法如下:

Number类的方法

 其实Number中定义的方法就是用于拆箱装箱的。

2. 拆箱与装箱

 装箱:

  将基本数据类型封装为包装类对象,利用每一个包装类提供的构造方法实现装箱操作。

 拆箱:

  将包装类中包装的基本数据类型数据取出。

// 装箱
Integer integer1 = new Integer(1);
// 拆箱
int integer2 = integer1.intValue(); 

 JDK1.5之后提供自动拆装箱。

// 自动装箱
Integer integer1 = 1;
// 自动拆箱
int integer2 = integer1; 

3. 自动装箱的内存复用

 自动装箱时,对于Integer var = ?,如果var指向的对象在-128 至 127 范围内的赋值时,生成的Integer实例化对象是由 IntegerCache.cache() 方法产生,它会复用已有对象。和String的共享池操作是一个道理,cache()方法会将位于-128~127范围内产生的Integer对象入池,下次使用的时候,从池中拿去,就不会在创建了。

 所以,在这个数值区间内的 Integer对象的栈指向(属性名) 可以直接使用==进行判断,因为值相同,指向的就是同一片区域。但是这个区间之外的所有数据,自动装箱都会在堆上产生实例化,并不再复用已有对象,这是一个大坑,为了避免这个问题,推荐使用 equals 方法进行Integer的判断。

 对于所有数值型的包装类来说,都会涉及到上面这种问题,一定要多加注意。

 而对于手动装箱,即采用new进行包装类创建时,不会发生内存复用,因为new关键字每次使用,都会开辟新的空间,这和String采用构造方法创建字符串不入池相对应。

4. 包装类编码规约

 所有的相同类型的包装类对象之间值的比较,全部使用equals()方法。

 所有的POJO(简单Java类,只包含基本属性,有参构造,get/set)类属性必须使用包装类数据类型,类属性即static属性。

 RPC(远程方法调用)方法返回值和参数必须使用包装数据类型。

 推荐所有的局部变量使用基本数据类型。

5. 包装类对字符串与基本数据类型转换的支持

 实际工程中,各种数据的接收是通常是通过字符串完成的,所以要掌握包装类对字符串转换的方法。

// String->int
public static int parselnt(String s)throws NumberFormatException;

// String->double 
public static double parseDouble(String)throws NumberFormatException;

// String->Boolean 
public static boolean parseBoolean(String s)

 字符串转数值类型时字符串只能包含数字,否则会抛出 NumberFormatException 异常,这是一个非受查异常。

 但是字符串转Boolean是个特例,parseBoolean()方法会将”true”转为true,而将非”true”的字符串转为false。

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 54
    点赞
  • 147
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: double类是Java中的一个包装类,用于封装基本数据类型double。它提供了一些方法,可以对double类型的数据进行操作和转换。例如,可以使用double类的parseDouble方法将字符串转换为double类型的数据,也可以使用doubleValue方法将Double对象转换为double类型的数据。此外,double类还提供了一些常量,如MAX_VALUE和MIN_VALUE,分别表示double类型的最大值和最小值。在Java中,double类型的数据通常用于表示浮点数,如小数或科学计数法表示的数值。 ### 回答2: Java的double类是基本数据类型中的一种,它是一个浮点数类型,可以用来表示小数或者整数。在Java中,如果需要使用双精度浮点数,我们可以直接使用double类型,而不需要使用其它类库或者自定义数据类型。 Java的double类提供了很多方法来处理双精度浮点数。比如,我们可以使用doubleValue()方法将一个Double对象转换成double类型的值;使用compareTo()方法比较两个double类型的值的大小;使用isNaN()方法判断一个double类型的值是否为非数值。 同时,Java的double类还提供了一些常量,如MAX_VALUE、MIN_VALUE、POSITIVE_INFINITY、NEGATIVE_INFINITY和NaN。其中,MAX_VALUE表示double类型的最大值,MIN_VALUE表示double类型的最小值,POSITIVE_INFINITY表示正无穷大,NEGATIVE_INFINITY表示负无穷大,NaN表示非数值。 除了基本的方法和常量,Java的double类还可以拆箱和装箱。拆箱指将Double类型的值转换成double类型的值,而装箱则是将double类型的值封装成一个Double对象。 在实际开发中,我们常常使用double类型来表示货币、收入、体重、距离等数值。使用double类型可以方便地进行数值计算,并且Java的标准库中提供了许多API来对double类型的值进行操作和处理,这大大提高了开发效率。使用double类型时需要注意其精度问题,因为在进行除法等计算时,可能会出现精度丢失的情况。此时,我们可以使用BigDecimal类来解决这个问题。 综上所述,Java的double类是一个非常重要的基本数据类型,我们在日常开发中经常使用,需要熟练掌握其使用方法和注意事项。 ### 回答3: 练习Java包装类之Double类是学习Java语言基础的必备内容,Double类是Java中常用的包装类之一,它用于将基本数据类型double封装成一个对象。Double类提供了很多有用的方法,能够方便地进行数字转换、计算和比较等操作。 Double类中最常用的方法是parseDouble(),它可以将一个字符串转换为double类型的数据。例如,可以使用Double.parseDouble("3.14")来获得一个double类型的值3.14。同时,Double还提供了很多其他的方法,如doubleValue()方法用于将Double对象转换为double类型,intValue()方法用于将Double对象转换为int类型,toString()方法用于将Double对象转换为字符串类型等。 此外,在使用Double类时还需要注意几个重要的特性。一是Double类是不可变的,即一旦创建了一个Double对象,它的值就不能再改变了。这意味着如果需要在程序中对double类型的数据进行频繁的修改,就应该使用基本数据类型double,而不是Double对象。 二是由于Double类是对象,所以在比较两个Double对象时,应该使用equals()方法而不是==操作符。因为==操作符只比较两个对象的内存地址,而不是它们的值,而equals()方法则比较两个对象的值是否相等。 最后,需要了解的是Double类中一些重要的常量。例如,Double.MAX_VALUE表示可表示的最大双精度浮点数,Double.MIN_VALUE表示可表示的最小双精度浮点数,NaN表示非数字(Not a Number),Infinity表示正无穷或负无穷。 练习Java包装类之Double类能够帮助我们更好地理解Java语言的基础知识和语法规则,同时提高我们对数字的处理能力和代码编写的效率。建议在学习Java语言时,重点掌握和实践常用的包装类,以更好地应用Java语言进行开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xucc_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值