Java的数据类型与类型转换
1.基本数据
基本数据类型(字节)
byte(1) float(4) int(4) long(8) double(8) boolean(1) char(2)
说明:八进制0(零)开头,十六机制0x(零x)开头,float 后续应加f,否者默认认为为double,对一个基本数据默认为int,假如想要为其他的数据(byte可以强转,float可以加f,double可以加d);基本类型的数据存放在栈中,具有可见性(见浅析Java的jvm上的内存位置的分配),java对字符char采用的 Unicode(UCS-2(2个字节)),unicode具有两种编码2个字节的UCS-2(java对字符char的采用)和4个字节UCS-4,对于特殊字符需要相应的转译(例如’,”等,对于常用的转译字符有如下 , , ,\,’,”)
例如:
System.out.println(0f+1d+(byte)2);
int i1=01257;
int i2=0xff00;
int i3=10;
2.基本数据的类型转换
整型 byte int long 字节长度小的到大的为隐式转换(大容器装小东西),反过来需要显示转换(小容器装大东西就需要丢掉一些东西)
浮点型 float double 同上
字符型 char(特殊的存在),char可以用无符号整型(0~65535)表示,底层实际上是通过相应的整型数据去寻找相应的字符,所有char是能赋值为0~65535之间的整型数字,反过来既然字符型是用整型数字表示的,那么可以相应的自动转换为int,int能自动转换为double,那么相应的能自动转换为double。
浮点型到整型的转换:浮点型的精度大于整型,在相同容器大小的时候所以整型不能转换浮点型,但是整型的精度小于浮点型,所以可以相应的转换(大于或者等于容器大小的前提下)
说明:基本数据的类型采用了享元模式(见后续设计模式),且在各种运算时会相应的向上自动转换成一致的数据类型(在可能的情形下),直接数(直接赋值的数(直接数包括基本类型数据以及字符串))
例如:
System.out.println(5/2);//2
System.out.println(2.5+2);//4.5
System.out.println('a'+20.5);//117.5
System.out.println('a'==97); //true
3.包装类
除了char 对应Character和int 对应Integer之外,其他的采用基本类型首字母大写的形式来表示相应的包装类(Byte—byte , Float—float , Doule—double ,Boolean --boolean),添加包装类的原因是为了解决基本类型不是面对对象的问题。
4.包装类与基本类型的转换
在jdk1.5之后引入了自动拆装箱(包装类与基本类型的转换自动完成),对于包装类(不论有没有new)与基本类型数据的==及各种运算,java会自动进行拆箱操作转换为相应的基本类型数据,指向相应的栈中,包装类(不论有没有new)与包装类(不论有没有new)的各种运算也会相应的转换为基本类型数据后进行相应的运算(==除外),对于Byte及小于-128~127之间的Integer以及Character的包装类以及String在没有new的前提下是直接指向常量池的同一个地址,new过之后会相应的进入堆中,对于其他的包装类,会相应的进入到堆中,常量池的字面量和栈中的基本类型数据有区别,栈中的基本类型数据会相应的自动转换,常量池中的字面量不会自动转换,例如Double d1=123456d;后续要加d,不加d就会编译错误等
例如:
System.out.println(new Integer(1234)==new Integer(100)+new Integer(1134));//true
Character c1=' ';
Character c2=' ';
System.out.println(c1==c2);//true
Double d1=123d;
Double d2=123d;
System.out.println(d1==d2);//false
Integer in=-128;
Integer in1=-128;
System.out.println(in==in1);//true;
Integer in3=-1288;
Integer in4=-1288;
System.out.println(in3==in4);//false
System.out.println(new Integer(1288)==1288f);//true
5.类的转换:
向上转换可以是隐式转换,例如继承了父类的子类和实现了接口的伪子类的多态的实现是隐式转换,向上会进行相应的编译javac检查。
向下转换需要显示转换:例如接口的实现类可能存在很多,但是到底转换成哪一个需要指定,不然不知道转换成哪一个,所以可能会出现两边的结果不一致的问题,类型转换失败(也会相应的向上编译类型检查,假如向上编译检查通过,那么他们必然满足多态的前提条件,在满足这个条件下,为了保证程序的健壮性在转换前添加相应的instanceof进行类型检查,instanceof检查的是class)。
例如:
Integer i= (Integer)(Object)"sdf";//编译通过
Integer i= (Integer)"sdf";//编译不通过
Uncle uncle = new Brother();
System.out.println(uncle instanceof Brother);//true
System.out.println(uncle instanceof Son);//false,Son实现了Uncle接口。
System.out.println(uncle instanceof String);//编译不通,进行了相应的编译检查
6.例题:
1)字符串转换为数字
public static void main(String[] args) {
int parseInt1 = Integer.parseInt("1234");
int parseInt2 = Integer.parseInt("1234", 8);//字符串按8进制转换为10进制数
System.out.println(parseInt1);//1234
System.out.println(parseInt2);//668 1*8*8*8+2*8*8+3*8+4
}
2)10进制数字转换成二进制数,八进制,十六进制等。
public static void main(String[] args) {
String str1 = Integer.toHexString(10);//10的16进制数
System.out.println(str1);//a
String str2 = Integer.toOctalString(10);//10的8进制数
System.out.println(str2);//12
String str3 = Integer.toBinaryString(10);//10的二进制数
System.out.println(str3);//1010
String str4 = Integer.toHexString(10);
//以及左移,右移,反码,补码等//其他包装类的方法也基本类似
}