Java里的数据类型如下所示,我们知道在初始化类的成员变量或类变量时,如果没有给这个变量赋值,那么jvm会给这些变量一个默认值,这些默认值到底等于多少呢?我自己写了一段代码测试了一下。
public class BasicTypeTest {
public static int i;//i = 0
public static byte b;//b = 0
public static short s;//s = 0
public static long l;//l = 0
public static float f;//f = 0.0
public static double d;//d = 0.0
public static boolean flag;//flag = false
public static char c;//c = ' '
public static String str;//str = null
public static void main(String[] args){
System.out.println(i);
System.out.println(b);
System.out.println(s);
System.out.println(l);
System.out.println(f);
System.out.println(d);
System.out.println(flag);
System.out.println(c+"..");
System.out.println(str);
}
}
//运行结果:
//0
//0
//0
//0
//0.0
//0.0
//false
// ..
//null
大多数常用的类型没有什么好说的,但是一些不常用的得好好琢磨一下了,比如说char型和byte型,平时用的可能比较少,但是也很重要。
short型
short型占两个字节,范围为-32768到32767
int型
int型占四个字节,范围为-2147483648到2147483647,共十位。
long型
使用long型时要注意:声明long型常量需要在后面加’l’或’L’,一般是加’L’,因为’l’容易误认为是i的大写。更确切地说,如果long型变量的值没有超过2147483647(int的范围是-2147483648到2147483647),加不加L都没问题,但是如果超过了这个数,必须加L。
long long1 = 2147483647;//合法,这里是long类型,不是int
//long long2 = 2147483648;不合法
long long2 = 2147483648L;//合法
float型与double型
小数字面量默认是double类型,如果要声明一个float类型的常量,必须在数字后面加’f’或’F’,否则无法通过编译。
boolean型
Java里boolean类型的值只有true和false两个值,不可以为0或非0的整数代替false或true,这点和C语言不同,我老弄混。
byte型
byte型占一个字节,范围是-128到127,直接使用就行:byte b = 125;注意范围就行。
char型
和C语言里char型占一个字节不同,Java里char型占两个字节,这点我也容易混淆。C语言里,字符常量的值就是该字符的ASCII码值,因此一个字符常量实际上也是一个字节的整型常量,可以参与各种运算,此时,如果是中文的话,就不能用char型了,只能用字符数组或指针,注意:C语言里没有相应的字符串变量。
Java里一个char型占两个字节,而且char型的值是Unicode,不过8为的ASCII码是包含在Unicode中的,所以很方便。这里,Java里的char类型也可以参与各种加减运算和比较运算。
为什么重点提这个char类型呢?因为字符串是不能直接比较的,所以我们有时候需要把字符串转换成字符数组来比较,一般只需要把英文字母转换成对应的ASCII码值就可以了,那么怎么把一个字符转换成Unicode值呢?直接强转就行了,实际上,int和char类型是可以互相转换的,下面的代码给出了方法。
public static void main(String[] args){
char d = 'a';
System.out.println((int)d);
char c = '中';
System.out.println((int)c);
char n = '2';
System.out.println((int)n);
}
//运行结果:
//97
//20013
//50
注意到字符’2’的Unicode码值不是2,而是50,所以有时候如果我们希望获取’2’的字面值,就需要使用Character包装类的静态方法getNumericValue(char)方法,这样的话可以得到字面量对应的值,另外这个方法还有一个重载版本getNumericValue(int),这个方法返回int值(即Unicode码值)对应的字符,但是这两个方法里的参数对应的字符都必须要含有数字,否则返回-1。
public static void main(String[] args){
int i = '\u216C';//罗马数字50:L
System.out.println((Object)i instanceof Integer);
char ci = '\u216C';
System.out.println((Object)ci instanceof Character);
System.out.println(i == ci);
System.out.println(i);
System.out.println(ci);
char n = '2';
System.out.println((int)n);
System.out.println(Character.getNumericValue(n));
System.out.println(Character.getNumericValue(50));
}
//运行结果:
//true
//true
//true
//8556
//?
//50
//2
//2
注意,判断基本数据类型变量的类型,最好通过我上面的代码给的方式判断,这也是Java没有typeof的弊端吧