java基础学习笔记(三)—— 数据类型
It comes down to a simple choice: Keep busy living or get busy dying.
| @Author:TTODS
目录
基本数据类型
整数类型
整数类型 | 宽度 | 取值范围 |
---|---|---|
byte | 1个字节(8位) | -128~127 |
short | 2个字节(16位) | -215~215-1 |
int | 4个字节 (32位) | -231~231-1 |
long | 8个字节(64位) | -263~263-1 |
public class TypeOfData{
public static void main(String[] args) {
System.out.println("默认的整数类型是int类型:"+16);
byte byteNum = 16;
short shortNum = 16;
int intNum = 16;
long longNum = 16L; //此处可为小写的l但是一般写大写的L,因为大写的L更容易与数字1区分
System.out.println("byteNum="+byteNum);
System.out.println("shortNum="+shortNum);
System.out.println("intNum="+intNum);
System.out.println("longNum="+longNum);
}
}
输出:
默认的整数类型是int类型:16
byteNum=16
shortNum=16
intNum=16
longNum=16
浮点类型
浮点类型 | 宽度 |
---|---|
float | 4个字节(32位) |
double | 8字节(64位) |
public class TypeOfData{
public static void main(String[] args) {
System.out.println("java 默认的浮点类型的数据是double类型:"+0.0);
float floatNum = 0.0f;
double doubleNum = 0.0d;
System.out.println("floatNum="+floatNum);
System.out.println("doubleNum="+doubleNum);
}
}
输出:
java 默认的浮点类型的数据是double类型:0.0
floatNum=0.0
doubleNum=0.0
数字类型的表示方法
除了上面的表示方法,常用来表示数字的方法还有进制表示法,和指数表示法
public class TypeOfData{
public static void main(String[] args) {
System.out.println("---数字的不同进制表示---");
int decimalInt = 255;
int binaryInt = 0b11111111;//0B11111111
int octalInt = 0377;
int hexdecimalInt = 0xFF; //0XFF
System.out.println("decimalInt="+decimalInt);
System.out.println("binaryInt="+binaryInt);
System.out.println("octalInt="+octalInt);
System.out.println("hexdeximalInt="+hexdecimalInt);
System.out.println("---数字的指数表示法---");
double num1 = 2.0e4;//2.0E4
double num2 = 9.93e-2;//9.93E-2
System.out.println("num1="+num1);
System.out.println("num2="+num2);
}
}
输出:
---数字的不同进制表示---
decimalInt=255
binaryInt=255
octalInt=255
hexdeximalInt=255
---数字的指数表示法---
num1=20000.0
num2=0.0993
字符类型
字符类型 | 宽度 |
---|---|
char | 2个字节(16位) |
字符类型表示单个字符,java中用char声明字符类型,声明方法如下:
char ch = 'A';//注意只能使用英文的单引号
因为java采用双字节的Unicode编码,所以char类型占两个字节。
public class TypeOfData{
public static void main(String[] args) {
char ch ='T';
char ch1 = '\u0054'; //Unicode编码
char ch2 = '龙'; //Unicode编码可支持亚洲文字(中、日、韩文等)
System.out.println("ch="+ch);
System.out.println("ch1="+ch1);
System.out.println("ch2="+ch2);
}
}
字符类型也属于字符类型,可于其他的字符类型进行计算,用于计算的值就是Unicode编码的值,取值范围是0X0000~0XFFFF(0~216-1);
public class TypeOfData{
public static void main(String[] args) {
char ch ='T'; //'T'的Unicode编码位\u0054,0X0054=84
int num = 'T'*2;
System.out.println("num="+num);
}
}
输出:
num=168
转义字符
字符表示 | Unicode编码 | 说明 |
---|---|---|
\t | \u0009 | 水平制表符tab |
\n | \u000a | 换行 |
\r | \u000d | 回车 |
" | \u0022 | 双引号 |
’ | \u0027 | 单引号 |
\ | \u005c | 反斜线 |
布尔类型
在Java中声明布尔类型的关键字是boolean,它只有两个值 :true和false;
在C语言中布尔类型是数值类型,取值为0和1;而java中boolean类型不是数值类型不能用1和0表示,也不能于其他数值类型进行运算。
数值类型的相互转换
自动类型转换
自动类型转换不仅发生在赋值过程中,在进行数学计算时也会发生自动类型转换,在运算中往往是先将数据类型转换为同一类型,然后再进行运算,规则如下:
操作数1 类型 | 操作数2 类型 | 转换后类型 |
---|---|---|
byte、short、char | int | int |
byte、short、char、int | long | long |
byte、short、char、int、long | float | float |
byte、short、char、int、long、float | double | double |
强制类型转换
有时除了自动类型转换,我们还需要用到强制类型转换,强制类型转换是在变量或常量之前加上"(目标类型)"实现。
例如:
byte byteNum = 100;
byte sum = byteNum +1;
这段代码是无法运行的,原因是java的默认整数类型是int类型,就是说第二句代码中的1为int类型,计算时,byteNum被自动转换为了int类型,所以它们的和为int类型,而代码中的sum为byte类型,java无法从int类型自动转换为byte类型所以报错。这是就要用强制类型转换。解决方法如下:
byte byteNum = 2;
byte sum =(byte)(byteNum + 1);
System.out.println(sum);
输出
3
值得注意的是当大宽度数值转换为小宽度数值时,大宽度数值的高位被截掉,这样会导致数据的精度丢失(如下例)。除非大宽度数值的高位没有数据,就是这个数比较小的情况(上面代码就是这种情况)。
byte byteNum = 127;
byte byteSum = (byte)(byteNum+1);
System.out.println(byteSum);
输出
-128;
解释如下:
上面计算的二进制形式如下(int类型)
00000000 00000000 00000000 01111111
+ 00000000 00000000 00000000 00000001
-------------------------------------------
00000000 00000000 00000000 10000000
得到的结果是0b00000000000000000000000010000000,int类型,转化为10进制是128;
然后进行强制类型转换,截取int类型的最后8位,为0b10000000,但是又因为java中所
有的数值类型都是有符号类型,byte的第一位为符号位,因此得出的值为-128,计算机
内的二进制存取和运算不是一两句话能说清的。
引用数据类型(待完善)
在java中除了8中基本数据类型外,其他数据类型都是引用(reference)数据类型,引用数据类型用来表示复杂数据类型,即包含类、接口和数组声明的数据类型。java中的引用数据类型相当于C等语言的指针(pointer)类型,引用事实上就是指针,是指向一个对象的内存地址。
问题:
问题一:
为什么long 类型,float和double的数据要分别在后面加上字母"L",“f"和"d”?
L:由于java的默认整数类型是int,如果不加L说明该数为int类型,因为int类型可以自动转换为long类型,所以当该值不超过int类型的范围时可以不写L;当该数值超过int类型的范围时,必须写L;
long num1 = 300000000; //不会报错
long num2 = 3000000000;//报错 3000000000超出了int范围
long num3 = 3000000000L;//不会报错
f/F:由于java的默认浮点类型是double类型,而从double类型无法自动转换为double类型,所以当float的值为小数时,类型数据声明时一定要加上f/F.
特殊情况:当float的值为整数时,可以不加f/F,原因是int类型可以自动转换成float类型。
float num2 = 1; //不报错 int 类型可以自动转换成float类型
float num1 = 1.1; //报错 double 类型不能自动转换成float类型
float num3 = 2.2f;
float num4 = 2.2F;
d/D:由于java默认的浮点类型是double类型,所以d/D可加可不加
double num = 0.0;
double num1 = 0.0d;
double num2 = 0.0D;
问题二:
为什么数值的指数表示法是double类型?