目录
下期博文 JDK源码系列 & JAVA语言数据类型Short
类的继承结构图
主要看继承
- 可以看到Byte类继承自Number类。从英文看,知道代表了数字的意思,所以猜测Byte在Java中也是数字的一种展现形式,也可以和其它数字类型进行转换。
类的Diagram图
看继承和实现
- Comparable接口:说明支持Byte类型对象直接的比较。
- Serializable接口:说明支持序列化和反序列化。
类 & 类的注释
- Byte被final修饰,意味着不能被继承。
源码分析
全局变量
//序列化id
private static final long serialVersionUID = -7183698231559129828L;
//能表达的最小值
public static final byte MIN_VALUE = -128;
//能表达的最大值
public static final byte MAX_VALUE = 127;
//Byte对应的初始类型是byte
//Byte.class和byte.class不相等,但Byte.TYPE和byte.class相等
@SuppressWarnings("unchecked")
public static final Class<Byte> TYPE = (Class<Byte>) Class.getPrimitiveClass("byte");
//一个字节二进制表示的位数
public static final int SIZE = 8;
//Byte占用的字节数 1B = 8b
public static final int BYTES = SIZE / Byte.SIZE;
//保存Byte的数据
private final byte value;
-
Byte是byte的包装类,表示一个字节以内的整型数值。范围为-128到127。
-
也就是1Byte = 8b
-
静态内部类
private static class ByteCache {
//私有构造器,不能被实例化
private ByteCache(){}
//创建长度为256的Byte数组
static final Byte cache[] = new Byte[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
//数组0位置数值为-128,255位置数值为127
cache[i] = new Byte((byte)(i - 128));
}
}
- 该类用于Byte型数值的缓存,提供了一个大小为256的Byte数组,该数组索引从0到255,对应Byte表示的数值范围:-128到127。
构造方法
/**
* 构造一个新的字节对象
*/
public Byte(byte value) {
this.value = value;
}
/**
* 通过传入字符串参数构造一个新的字节对象
*
*/
public Byte(String s) throws NumberFormatException {
//参数字符串作为十进制解析成byte数组 parseByte()方法后续进行讲解
this.value = parseByte(s, 10);
}
静态方法 —— parseByte()
/**
* 将带有+、-号的字符串按十进制解析成byte型数值
*/
public static byte parseByte(String s) throws NumberFormatException {
//调用重载方法
return parseByte(s, 10);
}
/**
* 第一个参数为字符串、第二个参数为指定的进制
* 将第一个参数字符串按指定的进制进行转化为Byte字节
*
* 第一个参数必须是数字 抛出异常。
* 如果参数字符串为null或者长度为0 抛出异常。
* 第二个参数 radix < 2 || radix > 36 抛出异常。
*/
public static byte parseByte(String s, int radix)
throws NumberFormatException {
//调用Integer的parseInt方法,解析成int型
int i = Integer.parseInt(s, radix);
//判断解析出的数值,是否满足byte型数值的范围
if (i < MIN_VALUE || i > MAX_VALUE)
throw new NumberFormatException(
"Value out of range. Value:\"" + s + "\" Radix:" + radix);
//若满足,则进行类型转换,并返回
return (byte)i;
}
静态方法 —— valueOf()
/**
* 返回一个Byte包装类
* 如果不需要每次都创建一个新的Byte实例,那么可以考虑使用valueOf方法而不是构造方法
* 利用缓存,这个方法会有更好的性能和空间
*/
public static Byte valueOf(byte b) {
final int offset = 128;
return ByteCache.cache[(int)b + offset];
}
/**
* 指定进制对String对象进行转换。
*/
public static Byte valueOf(String s, int radix)
throws NumberFormatException {
//调用parseByte进行转化为byte类型,然后调用重载方法
return valueOf(parseByte(s, radix));
}
/**
* 将String类型的对象转换为Byte型。
*/
public static Byte valueOf(String s) throws NumberFormatException {
//调用重载方法
return valueOf(s, 10);
}
静态方法 —— toString()
/**
* 将Byte按十进制返回为字符串对象
*/
public static String toString(byte b) {
//调用Integer的toString方法
return Integer.toString((int)b, 10);
}
/**
* 将Byte的value数值进行字符串转换
*/
@Override
public String toString() {
return Integer.toString((int)value);
}
静态方法 —— hashCode()
/**
* 调用重载方法
*/
@Override
public int hashCode() {
return Byte.hashCode(value);
}
/**
* Byte型对象的哈希值就是它本身的值
*/
public static int hashCode(byte value) {
return (int)value;
}
静态方法 —— decode()
/**
* 解码字符串为字节
*/
public static Byte decode(String nm) throws NumberFormatException {
//调用Integer的decode方法,解析成int
int i = Integer.decode(nm);
if (i < MIN_VALUE || i > MAX_VALUE)
throw new NumberFormatException(
"Value " + i + " out of range from input " + nm);
//现进行类型转换,再调用valueOf方法,从缓存中获取数值
return valueOf((byte)i);
}
静态方法 —— toUnsignedInt()
/**
* 将当前byte型的数值转换为无符号int型数值.
*/
public static int toUnsignedInt(byte x) {
//进行类型转换
//oxff为16进制 转为 2进制为 11111111
//走 & 运算
return ((int) x) & 0xff;
}
静态方法 —— toUnsignedLong()
/**
* 将当前byte型的数值转换为无符号long型数值
*/
public static long toUnsignedLong(byte x) {
return ((long) x) & 0xffL;
}
静态方法 —— compare()
/**
* 比较两个byte的大小
* 与此方法返回一致 Byte.valueOf(x).compareTo(Byte.valueOf(y))
*
* x == y 返回 0 的数
* x < y 返回 <0 的差值
* x > y 返回 >0 的差值
*/
public static int compare(byte x, byte y) {
return x - y;
}
普通方法 —— equals()
/**
* 比较两个对象是否相等
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof Byte) {
//如果是Byte的对象,进行比较里面的数据
return value == ((Byte)obj).byteValue();
}
//否则返回false
return false;
}
普通方法 —— compareTo()
/**
* 比较两个Byte对象是否相等.
* 若相等则返回0,若不相等则返回两个数之差。
*/
@Override
public int compareTo(Byte anotherByte) {
//调用重载方法
return compare(this.value, anotherByte.value);
}
类型转换方法 —— xxxValue()
/**
* 获取当前byte类型的数值
*/
@Override
public byte byteValue() {
return value;
}
/**
* 将当前byte型的数值转换为short类型的数值。
*/
@Override
public short shortValue() {
return (short)value;
}
/**
* 将当前byte型的数值转换为int类型的数值。
*/
@Override
public int intValue() {
return (int)value;
}
/**
* 将当前byte型的数值转换为long类型的数值。
*/
@Override
public long longValue() {
return (long)value;
}
/**
* 将当前byte型的数值转换为float类型的数值。
*/
@Override
public float floatValue() {
return (float)value;
}
/**
* 将当前byte型的数值转换为double类型的数值。
*/
@Override
public double doubleValue() {
return (double)value;
}