正所谓温故而知新,可以为师矣,虽然已经学过一遍javase,但是回头复习仍然能找到很多初学的时候遗忘的点,所以我们在学习的途中还是要保持空杯心态,这样才能走的更远,切忌眼高手低.
1.变量
说到变量大家都经常去使用,那么什么是变量呢?下面给出变量的定义
变量指的是程序运行时可变的量 . 相当于开辟一块内存空间来保存一些数据 .类型则是对变量的种类进行了划分 , 不同的类型的变量具有不同的特性 .我们所讨论的 " 变量 " 主要和我们的 " 内存 " 这样的硬件设备密切相关
2.基本数据类型 (8个)
int 4 //注:int在java中与系统无关,都是4个字节 byte 1 float 4 double 8 long 8 char 2 boolean //java本身没有规定大小 short 2
2.1 int类型
int类型是4个字节 大小范围也就是 -2^31 - 2^31-1
System.out.println(Integer.MAX_VALUE); // int 的最大值 System.out.println(Integer.MIN_VALUE)// int的最小值
注:这里的Integer我们可以暂且认为是int的包装类,可以先不去管他.
如果超出int的取值范围,也会发生溢出的情况,下面我们就可以使用更大的数据类型long(长整型)
2.2 long 长整型
语法
long num = 10L; // 定义一个长整型变量, 初始值写作 10l 也可以(小写的 L, 不是数字1). System.out.println(num)
2.3 double 浮点型
注:java中int除以int仍然是int ,比如1/2 答案是0
double num = 1.1; System.out.println(num * num) // 执行结果 1.2100000000000002
这里小数的存储仍然是IEEE 754标准,所以仍然会有精度误差.
2.4 float数据类型
float num = 1.0f; // 写作 1.0F 也可以 System.out.println(num);
这里加一个f的原因就是和double区分,但是精度不高,工程上用得不多.一般用double代替.
2.5 char 类型
char ch = 'A'; char a = '牛';
注:这里java中的char使用的是unicode编码而不是ascii编码,所以甚至支持中文,占用2个字节而不是c语言中的1个字节.
2.6 byte类型
这也是c语言没有的类型.
byte a = 10;
注:byte类型和char类型没关系.
2.7 短整型变量
short a = 10; //不建议使用,因为范围较小
2.8 布尔类型变量
boolean flag = false;
注:java中的boolean类型中只有true和false,不存在0为假其他为真的情况,java中没有规定boolean的大小.
3.引用数据类型
3.1字符串类型
字符串拼接操作
String s = "Hello"; String s1 = "World"; String s3 =s + s1; //Hello World
注:
1. Java 使用 双引号 + 若干字符 的方式表示字符串字面值 .2. 和上面的类型不同 , String 不是基本类型 , 而是 引用类型 ( 后面重点解释 ).3. 字符串中的一些特定的不太方便直接表示的字符需要进行转义3.2 常见转义字符
转义字符 解释 \n 换行 \t 水平制表符 \' 单引号 \" 双引号 \\ 反斜杠
3.3 字符串+整数结果是字符串
String str = "result = "; int a = 10; int b = 20; String result = str + a + b; System.out.println(result); // 执行结果 result = 1020
4.类型转换
Java 作为一个强类型编程语言 , 当不同类型之间的变量相互赋值的时候 , 会有教严格的校验举例:int a = 10; long b = 20; a = b; // 编译出错, 提示可能会损失精度. b = a; // 编译通过. int a = 10; double b = 1.0; a = b; // 编译出错, 提示可能会损失精度. b = a; //通过
大的类型不能赋值给小的类型,小的类型可以赋值给大的类型.
boolean类型不能和int相互转换.
4.1 强制类型转换
int a = 0; double b = 10.5; a = (int)b; int a = 10; boolean b = false; b = (boolean)a; //报错
结论:
1. 强制类型转换可能会导致精度丢失. 如刚才的例子中, 赋值之后, 10.5 就变成 10 了, 小数点后面的部分被忽略.
2. 强制类型转换不是一定能成功, 互不相干的类型之间无法强转
4.2 数值提升
4.2.1 int 和 long 做运算
int a = 10; long b = 20; int c = a + b; // 编译出错, 提示将 long 转成 int 会丢失精度 long d = a + b; // 编译通过.
结论: 当 int 和 long 混合运算的时候, int 会提升成 long, 得到的结果仍然是 long 类型, 需要使用 long 类型的变量来接收结果. 如果非要用 int 来接收结果, 就需要使用强制类型转换
4.2.2 byte自运算
byte a = 10; byte b = 20; byte c = a + b; System.out.println(c); // 编译报错 Test.java:5: 错误: 不兼容的类型: 从int转换到byte可能会有损失 byte c = a + b;
原因:虽然a和b都是byte,但是加起来的时候会转化为int再相加,将int赋给byte是行不通的
正确写法:(强转)
byte a = 10; byte b = 20; byte c = (byte)(a + b); System.out.println(c);
总结:
1. 不同类型的数据混合运算, 范围小的会提升成范围大的.
2. 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算.4.2.3 int 和String直接的转换
int ->Stringint num = 10; // 方法1 String str1 = num + ""; // 方法2 String str2 = String.valueOf(num);
String ->int
String str = "100"; int num = Integer.parseInt(str);