JAVA数据类型分基本数据类型和引用数据类型。
1 基本数据类型
Java里面包含8个基本数据类型,分别是:
boolean、byte、char、short、int、float、douboe、long
1.1 byte 字节
byte是JAVA中最小的数据类型,它在内存中占8位(8个bit),取值范围从-128到127
赋值:byte I = 127
1.2 short 短整型
short类型在内存中占2个字节,取值范围从 -32768到32767
赋值:short i = 32767;
1.3 char 字符型
char类型在内存中占2个字节。表示一个字符,也可以使用ASCII码范围内的值来给char型的变量赋值。由于字符在内存中的取值不存在负数范围,所有取值范围从0 到 65535
赋值:char i = ‘a’; 或者 char i = 97;
1.4 int 整型
int型在内存中占4个字节。取值范围从 -2147483648 到 2147483647
赋值:int i = 10;
1.5 float 单精度浮点型
float型在内存中占4个字节。取值范围从 -3.4E38 到 3.4E38
赋值:float i = 1.0f;
1.6 long 长整型
long型在内存中占8个字节。取值范围从 -9223372036854775808 到 9223372036854775807
1.7 double 双精度浮点型
double 型在内存中占8个字节。取值范围从 -1.7E308 到 1.7E308
1.8 boolean 布尔型
boolean类型只有两个值:true和false。
2 基本数据类型的相互转换
2.1 转型规则
1、JAVA中所有的数字变量都是有符号(正负)的。
2、JAVA不允许类型的随意转换。只有数字变量可以进行转换,但是不能随意。
3、带有小数点的数字变量默认都为double型。定义float型必须进行强制类型转换。
4、所占字节数小的数字型变量赋值给所占字节数比它大的类型时不用强制类型转换,此时是自动转型。
5、int型变量赋值给char型变量时,JVM会以int型变量值到ASCII码表中查找出所对应的字符,再赋值给char型变量。反之也是。但是遵循第4条规则。
6、初始化简单数据类型时要注意赋值的范围,超出则会产生编译错误。
/**
* 基本数据类型互转实例
*/
public class DataTypeDemo {
public static void main(String[] args) {
// 按所占位数从小到大建立8个基本数据类型
boolean a = true;
byte b = 127;
char c = 'c';
short d = 3;
int e = 4;
float f = 5.5f; //带小数点的数字默认都为double型,所以强制转型
double g = 5.5;
long h = 666;
c = (char) e; //占字节数多的赋值给占字节数少的变量要强制转型
e = c; //自动转型
}
}
2.2 基本数据类型默认初值
类型 | 初始值 |
boolean | false |
byte | 0 |
char | 0 |
short | 0 |
int | 0 |
float | 0.0 |
double | 0.0 |
long | 0 |
数据类型不赋初值,并且要使用它的时候会产生编译错误。在定义简单数据类型的数组时,JAVA会自动将这些初值赋给数组中的每个元素。
3 引用数据类型
JAVA中,非简单数据类型的类型都是引用数据类型。
看如下代码:
/**
* 引用数据类型例子
*/
publicclass DataTypeDemo {
public DataTypeDemo(){
}
//覆盖了父类toString方法
public String toString() {
returnsuper.toString();
}
publicstaticvoid main(String[] args) {
1: DataTypeDemo dtd; //声明了一个引用数据类型的变量
2: dtd = new DataTypeDemo(); //实例化了这个引用数据类型
}
}
分析这个例子,看红色横线代码。
第1行,我们声明了一个引用数据类型的变量,但是这个时候,只在内存中开辟了一个空间存放这个变量。而这个变量此时没有任何指向。
第2行,我们实例化了一个对象,这个时候在内存中开辟了一片空间存放这个对象,并让之前声明的引用数据类型变量指向了这个内存空间的首地址。
所以,我们可以说,引用数据类型就是指向一片内存空间地址的变量类型。
任何引用数据类型的初始化都需要先用new关键字来开辟一片内存空间,然后让引用数据类型变量指向这个空间的地址。
注:
String被Sun公司的工程师写成了一个不可更改的类(immutable class),在所有String类中的函数都不能更改自身的值。下面给出很简单的一个例子:
package clone;
public class StrTest { public static void main(String[] args) {
String str1 = "This is a test for immutable";
String str2 = str1.substring(0,8);
System.out.println("print str1 : " + str1);
System.out.println("print str2 : " + str2); } } /* RUN RESULT print str1 : This is a test for immutable print str2 : This is */
例子中,虽然str1调用了substring()方法,但str1的值并没有改变。类似的,String类中的其它方法也是如此。
应该知道的是在Java中所有的基本数据类型都有一个相对应的类,象Integer类对应int类型,Double类对应double类型等等,这些类也与String类相同,都是不可以改变的类。也就是说,这些的类中的所有方法都是不能改变其自身的值的。这也让我们在编clone类的时候有了一个更多的选择。同时我们也可以把自己的类编成不可更改的类。