java为8种基本类型又对应准备了8种包装类型,8种包装类型属于引用类型,父类是object类
8种基本数据类型对应的包装类型名是什么?
* 8种基本数据类型对应的包装类型名是什么?
* 基本数据类型 包装类型
* ---------------------------------
* byte java.lang.Byte
* short java.lang.short
* int java.lang.Integer
* long java.lang.Long
* float java.lang.Long
* double java.lang.Double
* boolean java.lang.Boolean
* char java.lang.Character
8种包装类型都是引用类型,重点以java.lang.Integer为代表进行学习,其它的照葫芦画瓢就完事了!8种包装类型中其中6个都是数字对应的包装类,他们的父类都是Number,可以先研究Number中的公共方法:
* Number是一个抽象类,无法实例化对象.
* Number类中有这些方法,这些方法是负责拆箱的:
* byte byteValue()返回指定号码作为值 byte ,这可能涉及舍入或截断。
* abstract double doubleValue()
* 返回指定数字的值为 double ,可能涉及四舍五入。
* abstract float floatValue()
* 返回指定数字的值为 float ,可能涉及四舍五入。
* abstract int intValue()
* 返回指定号码作为值 int ,这可能涉及舍入或截断。
* abstract long longValue()
* 返回指定数字的值为 long ,可能涉及四舍五入或截断。
* short shortValue()
* 返回指定号码作为值 short ,这可能涉及舍入或截断。
* * eg: Integer的构造方法,有两个:
* Integer(int)
* Integer(String)
* 其它引用类型的构造方法类似
这种需求: 调用doSome()方法的时候需要传一个数字进去,但是数字属于基本数据类型,而doSome()方法的参数类型是Object类型
怎么办?传一个数字对应的包装类进去:
代码:
public static void main(String[] args) {
// 有没有这种需求: 调用doSome()方法的时候需要传一个数字进去。
// 但是数字属于基本数据类型,而doSome()方法的参数的类型是Object
// 可见doSome()方法无法接收基本数据类型的数字。那怎么办? 可以传一个数字对应的包装类进去.
MyInt myInt = new MyInt(100);
doSome(myInt);
//======================================================================
// 123这个基本数据类型,进行和构造的包装达到了: 基本数据类型向引用数据类型的转换
// 基本数据类型 --> 转换成引用数据类型 (装箱)
Integer integer = new Integer(123);
// 将引用数据类型转换为 基本数据类型 (拆箱)
float f = integer.floatValue();
System.out.println(f);
// 将引用数据类型转换为 基本数据类型
int retValue = integer.intValue();
System.out.println(retValue);
}
public static void doSome(Object obj){
System.out.println(obj);
}
}
运行结果:
MyInt{value=100}
123.0
123
自动装箱和自动拆箱(JDK5之后引入)
自动装箱:基本数据类型自动转换成包装类型
自动拆箱:包装类型自动转换成基本数据类型
有了自动拆箱以后,Number类中的方法就不用看了,好处:方便编程!
example:
// 900是基本数据类型 x是包装类型 基本数据类型(自动转换)--> 包装类型 (自动装箱)
Integer i = 900;
System.out.println(i);
// x是包装类型 j是基本数据类型 包装类型 --(自动转换)--> 基本数据类型 (自动拆箱)
int j = i;
System.out.println(j);
// z是一个引用,z是一个变量,z还是保存了一个对象的内存地址.
Integer z = 1000; // 等同于: Integer z = new Integer(1000)
// 为什么这个没有报错? 自动将z(包装类)转换为基本数据类型 自动拆箱
System.out.println(z + 1);
Integer a = 1000;
Integer b = 1000;
// == 比较的是对象的内存地址,a和b两个引用中保存的对象内存地址不同
// == 这个运算符不会触发自动拆箱机制,只有+ - * / 等运算的时候才会
System.out.println(a==b); // false
900
900
1001
false
判断下面代码的执行结果:
代码:
Integer a = 128;
Integer b = 128;
System.out.println(a==b); // false
Integer x = 127;
Integer y = 127;
System.out.println(x==y);// true
运行结果:
false
true
上述例子是Integer非常重要的面试题.java中为了提高程序的执行效率,将-128到127之间的所有包装类型提前创建好,放到一个方法区的"整型常量池"当中了。目的是只要用这个区间的数据就不需要new了,直接从整型常量池中取出来。
重点方法:parse方法可以把字符串转换成基本的类
方法:static int parseInt(String s)
该方法常用且是重点方法的原因是在网页文本框中输入的100实际上是"100"字符串,而后台数据库中要求存储100数字,此时java程序需要将"100"字符串转换成100数字.
example:
int retValue = Integer.parseInt("123");
System.out.println(retValue+100);
// 照葫芦画瓢
double s = Double.parseDouble("3.14");
System.out.println(s);
运行结果:
223
3.14
如果是下面代码呢?
int retValue = Integer.parseInt("中文");
编译的时候没问题,一切符合java语法。运行时会出现问题,报:
java.lang.NumberFormatException
会出现数字格式化异常!