在java语言中,“数据”被称“字面量”
数据类型
各种数据类型的数值范围
用来声明变量,程序在运行过程中根据不同的数据类型分配不同大小的空间。
分基本数据类型和引用数据类型
类型 | 所占字节 | 默认值 | |
整数型 | byte | 1字节(-128~127) | 0 |
short | 2字节(-32768~32767) | 0 | |
int | 4字节(-2147483648~2147483647) | 0 | |
long | 8字节 | 0L | |
浮点型 | float | 4字节 | 0.0F |
double | 8字节 | 0.0D | |
字符型 | char | 2字节(0~65535) | '\u0000' |
布尔型 | boolean | 视编译环境而定 | false |
引用数据类型 | String | null |
java中boolean类型的值只有两个值:true和false,不像 c 或 c++,非零 和 0 也可以表示布尔类型
例子
1 package second;
2
3 public class Test {
4 int a;
5 double b;
6 boolean c;
7 char d;
8 float f;
9 byte e;
10 long h;
11 short j;
12 public static void main(String args[]){
13 Test a=new Test();
14 System.out.println("整型的默认值是:"+a.a);
15 System.out.println("双精度浮点型的默认值是:"+a.b);
16 System.out.println("布尔型的默认值是:"+a.c);
17 System.out.println("字符型的默认值是:"+a.d);
18 System.out.println("byte的默认值是:"+a.e);
19 System.out.println("单精度浮点型的默认值是:"+a.f);
20 System.out.println("短整型的默认值是:"+a.j);
21 System.out.println("长整型的默认值是:"+a.h);
22 }
23 }
24
char类型
Java中的字符编码
char类型对应的是文字,每个国家文字不一样,文字不能直接通过自然算法转换成二进制,所以字符编码诞生,字符编码是人为定义的一套转换表,本质上是一本字典,描述了文字与二进制之间的对照关系(某个计算机协会规定的),编码和解码的时候必须采用同一套字符编码方式,不然会乱码,英文对应的字符编码方式是:ASCII码(以1个byte进行储存)。JAVA中,char占2字节,16位,可存放汉字
‘a’=97
'A'=65
'0'=48
'a'-->采用ASCII码进行编码-->01100001 01100001-->采用ASCII码进行解码-->‘a’
java为了国际化,为了支持所有国家的语言,所以java采用的编码方式为Unicode编码(包括:UTF-8,UTF-16,UTF-32等)。例如’中’对应的Unicode码是’\u4e2d’。在实际开发中几乎所有的团队都会使用Unicode编码方式,因为这种方式更通用,兼容性更好。
char赋值
char a='a'; //任意单个字符,加单引号。
char a='中';//任意单个中文字,加单引号。
char a=111;//整数 0~65535 十进制、八进制、十六进制均可,输出字符编码表中对应的字符
//注:只能放单个字符
char运算
char类型是可以运算的因为char在ASCII等字符编码表中有对应的数值。在JAVA中,对char类型字符运行时,直接当做ASCII表对应的整数来对待。
例1
public class Test {
public static void main(String[] args) {
int a='中'+'国';//20013+22269=42282
System.out.println(a);
FileInputStream fis=null;
try {
fis = new FileInputStream("Test02.txt");
System.out.println("流中还没有被读到的字节数量为:"+fis.available());
//'中'和'国'都占用了三个字节,采用UTF-8编码,下面三个结果是UTF-8编码后的结果
System.out.println(fis.read());//228
System.out.println(fis.read());//184
System.out.println(fis.read());//174
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
例2
char m='a'; //-->a
char m='a'+'b'; // -->97+98=195=? char类型相加,提升为int类型,输出对应的字符
int m='a'+'b'; //-->195 195没有超出int范围,直接输出195
char m=197; //-->? 输出字符编码表中对应的字符
char m='197'; //-->报错 因为有单引号,表示是字符,只允许放单个字符
char m='a'+1; //-->b 提升为int,计算结果98对应的字符是b
char m='中'+'国'; // -->20013+22269=42282=ꔪ
char m='中'+'国'+'国'+'国'; // -->报错 int转char有损失。因为结果已经超出char类型的范围。
int m='中'+'国'+'国'+'国'; //-->86820
char m='中'+1; //-->丮 1是int,结果提升为int,输出对应的字符
char m='中'+"国"; // -->报错 String无法转换为char
System.out.println('中'+"国"); /*-->中国 没有变量附值的过程,String与任何字符用+相连,转换为String*/
char a = 97; //-->为char类型变量 a 赋值常量值 97
char b = 'a'+3; //-->d 97+3=100,ASCII对应的字符为 d
char c = a+3; //报错,混合运算时a自动转化为3的数据类型int,合起来为int,JVM判断为类型不兼容
数据类型转换
字面量的默认类型
Java和C一样,也是遵循下列的默认规则:
- 任何一个整数型的字面量/数据默认被当作 int 类型处理,如果想转换成long类型来处理,需要在字面量后面加 L/l
- 任何一个浮点型字面量/数据默认被当作 double 来处理,如果想转换成float类型,需要在字面量后面加 F/f
long a=1000L; //不加L也行,触发自动类型转换机制
float b=3.14F; //不加F不行,需进行强制类型转换(double)
自动类型转换
- 八种数据类型中,除boolean类型不能转换,剩下七种类型之间都可以进行转换
- 小容量向大容量转换称为 自动类型转换,容量从小到大的排序为:byte < short(char)< int < long < float < double
byte byte01=1;
short short01=2;
char char01=3;
int int01=4;
long long01=5;
float float01=3.14F;
double double01=3.14;
short01=byte01;
char01=short01;//错误
int01=char01;
long01=int01;
float01=long01;
double01 = float01;
强制类型转换
- 如果整数型字面量没有超出 byte、short、char 的取值范围,可以直接将其赋值给byte、short、char类型的变量
- 大容量转换为小容量,称为 强制类型转换,编写时必须添加“强制类型转换符”,但运行时可能出现精度损失,谨慎使用
- byte、short、char 类型混合运算时,先各自转换成int类型在做运算
- 多种数据类型混合运算时,各自先转换成表达式中容量最大的那一种再做运算
//没超出范围
byte a=127;
short b=32767;
char c=65535;
int d=2147483647;
//变量当操作数
short e=a+1; //报错:java: 不兼容的类型: 从int转换到short可能会有损失
//编译器不知道a+1结果值为128(在short范围内),值运行阶段才知道
short e=(short)a+1; //正确
//超出范围
long f=2147483648; //报错: 过大的整数: 2147483648(超出int的范围)
byte k=(byte)150; //结果为:-106
//强制类型转换
int g=(int)100L; //long强制转换为int
float h=(double)3.14; //double强制转换为float
//多种类型参与运算
int j=10.0/5; //java: 不兼容的类型: 从double转换到int可能会有损失
//原理:先将5转换成double类型后再做运算,结果是double