本节让我们来进行java数据类型的总结。首先java数据类型分为两大类:基本数据类型与引用类型。具体如下图:
一、基本数据类型
基本数据类型,或者叫做内置类型,是JAVA中不同于类的特殊类型,它们是我们编程中使用最频繁的类型。java中的基本数据类型分别是:boolean,byte,char,short,int,long,float,double,具体如下:
- boolean(布尔类型):数据值只有true或false两种结果,适用于逻辑运算,不能进行数据类型的转换。
- byte型(字节型):数据在内存中占用1个字节,表示的存储数据范围为:-128~127。
- char型(字符型):数据在内存中占用2个字节。char型数据用来表示通常意义上的字符,用单引号赋值。
- short型(短整型):数据在内存中占用2个字节,数据范围是-32768~32767之间。
- int型(整型):数据在内存中占用4个字节,数据范围是负的2的31次方到正的2的31次方减1
- long型(长整型):数据在内存中占用8个字节,数据范围为负的2的63次方到正的2的63次方减1。
- float型(单精度浮点型):数据在内存中占用4个字节。数据范围在3.4e-45到1.4e38,直接赋值时必须在数字后加上f或F。
- double型(双精度浮点型):数据在内存中占用8个字节,数据范围在4.9e-324到1.8e308,赋值时可以加d或D也可以不加。
另外这8种基本类型也对应了8种封装类型,它们分别是:Boolea,Byte,Character,Short,Integer ,Long ,Float,Double 。JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。如:基本类型byte 二进制位数:Byte.SIZE,最小值:Byte.MIN_VALUE,最大值:Byte.MAX_VALUE。
二、引用数据类型
1、基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上;
2、引用数据类型在被创架时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。
例如:我有一个类MyDate,其中有属性day,mouth,year等,有构造方法(带参数);
现在为其创建一个对象MyDate d1 = new MyDate(8,8,2008);在内存中的具体创建过程是:
1)首先在栈内存中位其d1分配一块空间;
2)然后在堆内存中为MyDate对象分配一块空间,并为其三个属性设初值0,0,0;
3)根据类MyDate中对属性的定义,为该对象的三个属性进行赋值操作;
4)调用构造方法,为三个属性赋值为8,8,2008;(注意这个时候d1与MyDate对象之间还没有建立联系)
5)将MyDate对象在堆内存中的地址,赋值给栈中的d1;通过句柄d1可以找到堆中对象的具体信息。
三、数据类型的转换
在java中数据类型的转换分为以下几种情况:
- 低级到高级的自动类型转换;
- 高级到低级的强制类型转换(会导致溢出或丢失精度);
- 基本类型向类类型转换;
- 基本类型向字符串的转换;
- 类类型向字符串转换
1、基本数据类型之间的转换规则
只要两个操作数中有一个是float类型的,另一个将会被转换成float类型,并且结果也是float类型;
两个操作数(包括byte、short、int、char)都将会被转换成int类型,并且结果也是int类型。
(2)、如果低级类型为char型,向高级类型(整型)转换时,会转换为对应ASCII码值,再做自动转换。
(3)、对于byte,short,char三种类型而言,他们是平级的,因此不能相互自动转换,可以使用下述的强制类型转换。
System.out.println("output:"+c);
(5)、不同级别数据类型间的强制转换,可能会导致溢出或精度的下降。
(6)、当字节类型变量参与运算,java作自动数据运算类型的提升,将其转换为int类型。 例如:
b=(byte)(b*3);//必须声明byte。
2、包装数据类型与基本数据类型之间的转换
而在各个包装类中,总有形为××Value()的方法,来得到其对应的简单类型数据,利用这种方法,也可以实现不同数值型变量间的转换。例如,对于一个双精度实型类,intValue()可以得到其对应的整型变量,而doubleValue()可以得到其对应的双精度实型变量。
3、字符串与其它类型间的转换
- 调用类的串转换方法:X.toString();
- 自动转换:X+“”;
- 使用String的方法:String.volueOf(X);
- 先转换成相应的封装器实例,再调用对应的方法转换成其它类型。例如:字符中“32.1”转换double型的值的格式为:new Float(“32.1”).doubleValue(),也可以用:Double.valueOf(“32.1”).doubleValue()。
- 静态parseXXX方法,例如:
byte b = Byte.parseByte( s );
short t = Short.parseShort( s );
int i = Integer.parseInt( s );
long l = Long.parseLong( s );
Float f = Float.parseFloat( s );
Double d = Double.parseDouble( s );
- Character的getNumericValue(char ch)方法具体可查阅api。
4、转换实例
正向转换:通过类包装器来new出一个新的类类型的变量 Integer a= new Integer(2);
eg1:int i=Integer.parseInt(“123”)说明:此方法只能适用于字符串转化成整型变量。eg2: float f=Float.valueOf(“123”).floatValue()说明:上例是将一个字符串转化成一个Float对象,然后再调用这个对象的floatValue()方法返回其对应的float数值。eg3: boolean b=Boolean.valueOf(“123”).booleanValue()说明:上例是将一个字符串转化成一个Boolean对象,然后再调用这个对象的booleanValue()方法返回其对应的boolean数值。eg4:double d=Double.valueOf(“123”).doubleValue()说明:上例是将一个字符串转化成一个Double对象,然后再调用这个对象的doubleValue()方法返回其对应的double数值。eg5: long l=Long.valueOf(“123”).longValue()说明:上例是将一个字符串转化成一个Long对象,然后再调用这个对象的longValue()方法返回其对应的long数值。eg6: char=Character.valueOf(“123”).charValue()说明:上例是将一个字符串转化成一个Character对象,然后再调用这个对象的charValue()方法返回其对应的char数值。
System.out.println(""+2+3);// “""”把2转成字符串操作;System.out.println(2+3); // 不存在转换。System.out.println(2+3+"");// 前两个数值相加后,被“""”转成字符串。System.out.println(2+""+3);// 同第一个。 输出显示为:23,5,5,23 3)类类型向字符串转换
正向转换:因为每个类都是object类的子类,而所有的object类都有一个toString()函数,所以通过toString()函数来转换即可反向转换:通过类包装器new出一个新的类类型的变量eg1: int i=Integer.valueOf(“123”).intValue()
说明:上例是将一个字符串转化成一个Integer对象,然后再调用这个对象的intValue()方法返回其对应的int数值。eg2: float f=Float.valueOf(“123”).floatValue()说明:上例是将一个字符串转化成一个Float对象,然后再调用这个对象的floatValue()方法返回其对应的float数值。eg3: boolean b=Boolean.valueOf(“123”).booleanValue()说明:上例是将一个字符串转化成一个Boolean对象,然后再调用这个对象的booleanValue()方法返回其对应的boolean数值。eg4:double d=Double.valueOf(“123”).doubleValue()说明:上例是将一个字符串转化成一个Double对象,然后再调用这个对象的doubleValue()方法返回其对应的double数值。eg5: long l=Long.valueOf(“123”).longValue()说明:上例是将一个字符串转化成一个Long对象,然后再调用这个对象的longValue()方法返回其对应的long数值。eg6: char=Character.valueOf(“123”).charValue()说明:上例是将一个字符串转化成一个Character对象,然后再调用这个对象的charValue()方法返回其对应的char数值