/**
* 基本数据类型 包装类型
* ----------------------------------------------
* byte java.lang.Byte (父类是java.lang.Number)
* short java.lang.Short (父类是java.lang.Number)
* int java.lang.Integer (父类是java.lang.Number)
* long java.lang.Long (父类是java.lang.Number)
* float java.lang.Float (父类是java.lang.Number)
* double java.lang.Double (父类是java.lang.Number)
* boolean java.lang.Boolean (父类是java.lang.Object)
* char java.lang.Character (父类是java.lang.Object)
*
* 八种基本数据类型,分别对应一个包装类,下面以Integer来学习,JDK5以后能够进行自动装箱和自动拆箱
* 自动装箱:基本数据类型自动转换为包装类
* 自动拆箱:包装类自动转换为基本数据类型
*
* 自动装箱和自动拆箱的好处是:方便编程
*/
public class IntegerText {
public static void main(String[] args) {
Integer x = 123;//123是基本数据类型,x是包装类型 这里发生的是基本数据类型自动转换为包装类型(自动装箱)
int y = x;//这里的x是包装类型,y是基本数据类型,发生的是包装类型自动转换为基本数据类型(自动拆箱)
Integer z = 456;// 该代码等同于Integer z = new Integer(456);
// 注意这里的z是一个引用,也是一个变量,z中保存的是对象的内存地址
System.out.println(z + 1);//457,这里的z先发生了自动拆箱变成了基本数据类型,然后进行了加法运算
Integer a = 128;
Integer b = 128;
System.out.println(a == b);//false
Integer k = 127;
Integer m = 127;
System.out.println(k == m);//true
/*
为什么会出现上面不一样的情况呢?原因在于java为了提高程序运行效率,再Integer类加载时将[-128,127]区间所有256个整数
型包装对象提前创建好,放到了方法区的“整数型常量池”当中,目的是只要用这个区间的包装类型对象不需要再new了,直接就可以从
“整数型常量池”当中取出来。为此无论创建多少个对象它们的引用所指向的内存地址都相同,但是只要超出了这256个的区间就不一样了。
其内存图见下图:Integer方法区整数型常量池。
*/
/*
总结一下之前所学的经典异常有:
空指针异常:NullPointerException
类型转换异常:ClassCastException
数组下标越界异常:ArrayIndexOutOfBoundsException
数字格式化异常:NumberFormatException
*/
Integer w = new Integer("12");//本行代码没有问题
// 下行代码是将非数字型字符串转换成Integer包装类型对象就会出现异常(该异常编译期可以通过编译,但运行期报错)
// Integer q = new Integer("oneTwo");//java.lang.NumberFormatException 数字格式化异常(运行期异常)
// (重点) 将字符串转换成int,使用静态方法: static int parseInt(String s);
// 静态方法,传入参数String,返回int,网页上文本框中输入的是100,实际上是字符串"100",后台数据库中需要的是数字100,
// 这时java程序就需要使用该方法把字符串"100"转换成数字100
int retValue = Integer.parseInt("123");//如果将"123"换成文字就会出现java.lang.NumberFormatException 数字格式化异常
System.out.println(retValue + 100);//223
// 照葫芦画瓢学习其他包装类的方法
// 将字符串转换成double,使用静态方法:static double parseDouble(String s);
double retValue1 = Double.parseDouble("3.14");
System.out.println(retValue1 + 1);//4.140000000000001这个问题是double的精度问题不要纠结
// 将字符串转换成float,使用静态方法:static float parseFloat(String s);
float retValue2 =Float.parseFloat("10.0");
System.out.println(retValue2 + 1);//11.0
/**
* String、int、Integer之间相互转换
*/
// String---->int
int i1 = Integer.parseInt("100");//i1是int类型数字100;
System.out.println(i1 + 1);//101,数字100和1相加
// int ------>String
String s1 = i1 + "";//这里进行的是字符串拼接
System.out.println(s1 + 1);//1001,这里进行的是字符串拼接
// 也可以使用String.valueOf(int)
String s2 = String.valueOf(456);
System.out.println(s2 + 1);//4561,这里进行的是字符串拼接
// int ------>Integer
Integer h = 1000;//自动装箱
// Integer---->int
int i2 = h;//自动拆箱
// String----->Integer
Integer d = Integer.valueOf("789");
// Integer---->String
String s3 = String.valueOf(d);
}
}
Integer方法区整数型常量池