Java数据类型基础知识
Java有两种数据类型:基本数据类型和引用类型。
引用类型是一组基本类型的组合,如数组、类和接口。
数组类型本身不存值,存的是指向实际数据的内存地址。
null类型,没有名字,也不能声明null类型的变量。
Java有8个基本类型:6个是数值类型(4个整数类型和2个浮点数类型),1个字符类型(char)用来表示Unicode编码字符,1个布尔类型(boolean)表示逻辑真true和逻辑假false。
- Java的8个基本数据类型
- 1、整数类型
整数类型的表现方式有八进制、十进制、十六进制。八进制常数通常用来进行位操作。
八进制数如0467、0324等。
十进制数如45、769、1236等。
十六进制数如0x23f、0x45a、0x45、0xff41等。
八进制数值前加0,十进制和一般写法一样,十六进制数值前面加0x或0X.。
- 2、浮点类型
浮点类型用来表示一个带小数的十进制数。组成部分:十进制整数、小数点、十进制小数、指数和正负符号。
浮点数可用标准形式表示,可用科学计数法形式表示。如:3.14159,1.1,6.22436,3.766E8等。
用科学计数法的形式表示浮点数时,指数必须是整数形式。
Java有两种浮点数形式:即单精度浮点数和双精度浮点数。
单精度浮点数的存储空间为32位,也就是4个字节;双精度浮点数的存储空间为64位。
Java通过在浮点数后面加描述符的方法来指明这两种浮点数。
如:单精度浮点数:1.5或1.5f或1.5F。双精度浮点数:1.5d或1.5D。
后面没有特别指明后缀,则为双精度浮点数。
3、布尔类型
布尔类型只有两种值:真和假,通常用关键字true和false来表示。
Java的布尔类型只能是真或假,不能代表整数(0或1)。
改变不二变量可以直接赋值,可以利用其他变量间接赋值,还可以使用等式赋值,如:myBoolean = 2>1。
4、字符类型
字符型数据是由一对单引号括起来的单个字符,如:'a'。
Java使用的是16位的Unicode字符集。
还有一类字符有特殊的意义,被成为“转义字符”(escape characters),引用方法为“\”加上特定的字符序列。
转义序列 | 含义 | 转义序列 | 含义 |
\n | 回车 | \' | 单引号 |
\t | 水平制表符 | \" | 双引号 |
\b | 空格 | \\ | 反斜杠 |
\r | 换行 | \ddd | ddd为3位八进制数,值在0000~0377之间 |
\f | 换页 | \dddd | dddd为4位十六进制数 |
字符串是用一对双引号括起来的字符序列,是由String关键字所定义的。
char类型可以进行类似于整数的运算操作,如可以将两个字符相加,或对一个字符变量值进行增量操作。
public class test1 {
public static void main(String[] args) {
char ch1;
ch1 = 'X';
System.out.println(ch1);
ch1 = (char) (ch1+1);
System.out.println(ch1);
}
}
5、各类型数据间的相互转换:
整型、实型、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,再进行运算。
按优先关系,转换分为两种:自动类型转换和强制类型转换。
①自动类型转换
按照优先关系,低级数据要转换成高级数据时,进行自动类型转换。
操作数1类型 | 操作数2类型 | 转换后的类型 |
byte或short | int | int |
byte或short或int | long | long |
byte或short或int或long | float | float |
byte或short或int或long或float | double | double |
char | int | int |
上表操作数1类型和操作数2类型代表参加运算的两个操作数的类型,转换后的类型代表其中一个操作数自动转换后与另一个操作数达成一致的类型。
public class test {
public static void main(String[] args) {
char c ='h';
byte b = 5;
int i = 65;
long a = 465L;
float f = 5.65f;
double d = 3.234;
int ii = c + i; //char类型的变量c自动转换为与i一致的int类型参加运算
long aa = a - ii; //int类型的变量ii自动转换与a一致的long类型参加运算
float ff = b * f; //byte类型的变量b自动转换为与f一致的float类型参加运算
double dd = ff/ii + d;
System.out.println("ii = " + ii);
//int类型的变量ii自动转换为与ff一致的float类型
//ff/ii计算结果为float类型,然后再转换为与d一致的double类型
System.out.println("aa = " + aa);
System.out.println("ff = " + ff);
System.out.println("dd = " + dd);
}
}
②不兼容强制转换
当进行类型转换时要注意使目标类型能够容纳原类型的所有信息,允许的转换包括:
byte→short→int→long→float→double,以及char→int
把位于左边的一种类型的变量赋给位于右边的类型的变量不会丢失信息。当执行一个这里并未列出的类型转换时可能并不总会丢失信息,但进行一个理论上并不安全的转换总是很危险的。
强制类型转换是一种显示的类型变换,通用格式为:
(target_type) value
target_type指的是要转换成什么类型,如:
int a;
byte b;
b = (byte) a; //把int型变量a强制转换为byte型
上面为int型强制转成byte型,如果int型变量的值超出了byte型变量的取值范围(-128~127),它的值将会因为对byte型值域(byte值域为256)取模(整数除以byte得到的余数)而减少。
把浮点值赋值给整型类型时,它的小数部分会被舍去。
public class test2 {
public static void main(String[] args) {
byte b;
int i = 257;
double d = 323.142;
b = (byte) i;
System.out.println("i:" +i + ",b:" + b);
i = (int) d;
System.out.println("d:" + d + ",i:" + i);
b = (byte) d;
System.out.println("d:" + d + ",b:" + b);
}
}
运行结果:
i:257,b:1
d:323.142,i:323
d:323.142,b:67
上面整型的值257被强制转换为byte变量时,结果257除以256(256是byte类型的变化范围)的余数1。变量d转成int型,小数部分被舍弃了。变量d转换为byte型,小数部分被舍弃,值减少为256的模,即67.
附一张ASCII表,方便参考