如果你查看基础(数值)类型(byte, short, int, long, float, double)对应的wrapper类的话,你会发现它们的类声明非常的相似:
public final class Double extends Number implements Comparable<Double> {
public final class Integer extends Number implements Comparable<Integer> {
而且从wrapper类型的声明中我们可以发现:
- wrapper类拥有final修饰符,说明它们是不能被继承的。
- wrapper类继承了一个抽象类Number。
- wrapper类实现了Comparable接口(实现两个同种wrapper类的大小比较)。
Comparable接口的功能就是为了给wrapper类提供compareTo方法,这个没什么好说的。但是这个抽象类Number到底是个什么东西,又为wrapper类提供了什么功能呢?这就是本篇博客的重点。
首先,我们来了解一下Number类是什么?
jdk1.8 api中是这么说明的:抽象类Number是数值类的父类,定义了让数值类的数值转换为基础类型(int,double等等)的方法。
这边的数值类指的是:
- 用来表示一个数值。
- 表示的这个数值能够转换成基础类型byte, double, float, int, long, short。
举个例子:
public class MyInteger { private int value; }
这就是一个简单的数值类,满足上面说的两个条件。
简单了解了Number类的定义之后,我们来看看Number类为它了子类提供了什么功能。
Number类为它的子类提供了什么功能?
- 提供数值类转换对应基本类型的能力(Integer -> int)。
- 提供数值类转换成其他基本类型的能力(Integer -> double),存在精度损失,信息损失的情况(类似基础类型中的向下转换narrowing primitive conversion和向上转换widening primitive conversion)。
接下来我们来看看Number类具体有哪些方法?
public abstract class Number implements java.io.Serializable { public abstract int intValue(); public abstract long longValue(); public abstract float floatValue(); public abstract double doubleValue(); public byte byteValue() { return (byte)intValue(); } public short shortValue() { return (short)intValue(); } private static final long serialVersionUID = -8742448824652078965L; }
抽象方法:
方法声明 | 作用 | 返回值 |
intValue | 获取数值类对应的int数值 | 返回对应的int数值 |
longValue | 获取数值类对应的long数值 | 返回对应的long数值 |
floatValue | 获取数值类对应的float数值 | 返回对应的float数值 |
doubleValue | 获取数值类对应的double数值 | 返回对应的double数值 |
实现方法:
方法声明 | 作用 | 返回值 |
byteValue | 获取数值类对应的byte数值 | 返回对应的byte数值,对方法intValue的返回值进行byte类型转换 |
shortValue | 获取数值类对应的short数值 | 返回对应的short数值,对方法intValue的返回值进行short类型转换 |
最后我们做个测试,输出一个继承Number类型的所有的基础类型转型:
测试代码:
package Primitive; import org.junit.Test; public class IntegerTest { @Test public void printConversion() { Integer num = new Integer(12); System.out.println("intValue(): " + num.intValue()); System.out.println("longValue(): " + num.longValue()); System.out.println("floatValue(): " + num.floatValue()); System.out.println("doubleValue(): " + num.doubleValue()); System.out.println("byteValue(): " + num.byteValue()); System.out.println("shortValue(): " + num.shortValue()); } }
返回结果:
intValue(): 12 longValue(): 12 floatValue(): 12.0 doubleValue(): 12.0 byteValue(): 12 shortValue(): 12 Process finished with exit code 0