7.4 整数能否直接赋值给char

  1. - 当一个整数赋值给char类型变量的时候,会自动转换成char字符型,最终的结果是一个字符。
  2. - 当一个整数没有超出byteshortchar的取值范围的时候,这个整数可以直接赋值给byte short char类型的变量。
  1. public class CharTest03{
  2. public static void main(String[] args){
  3. // 这里会做类型转换吗?
  4. // 97是int类型(这是java中规定,默认当做int处理)
  5. // c2是char类型
  6. //char c2 = (char)97; // 不需要这样做。
  7. char c2 = 97;
  8. System.out.println(c2); // 'a'
  9. // char类型取值范围:[0~65535]
  10. char c3 = 65535; // 实际上最终是一个“看不懂”的字符。
  11. System.out.println(c3);
  12. //错误: 不兼容的类型: 从int转换到char可能会有损失
  13. //char c4 = 65536;
  14. // 怎么解决以上问题?
  15. char c4 = (char)65536;
  16. byte x = 1;
  17. short s = 1;
  18. char c = 1;
  19. }
  20. }

7.5 原码 反码 补码

  1. - 对于一个正数来说:二进制原码、反码、补码是同一个,完全相同。
  2. int i = 1;<br /> 对应的二进制原码:00000000 00000000 00000000 00000001<br /> 对应的二进制反码:00000000 00000000 00000000 00000001<br /> 对应的二进制补码:00000000 00000000 00000000 00000001
  3. - 对于一个负数来说:二进制原码、反码、补码是什么关系呢?
  4. byte i = -1;<br /> 对应的二进制原码:10000001<br /> 对应的二进制反码(符号位不变,其它位取反):11111110<br /> 对应的二进制补码(反码+1):11111111<br /> 我们以:byte b = (byte)150; 这条语句为例<br /> 这个b是多少?<br /> int类型的4个字节的150的二进制码是什么?<br /> 00000000 00000000 00000000 10010110<br /> 将以上的int类型强制类型转为1个字节的byte,最终在计算机中的二进制码是:10010110<br /> 千万要注意:计算机永远存储的都是二进制补码形式。也就是说上面<br /> 10010110 这个是一个二进制补码形式,你可以采用逆推导的方式推算出<br /> 这个二进制补码对应的原码是啥!!!!!!<br /> 10010110 ---> 二进制补码形式<br /> 10010101 ---> 二进制反码形式<br /> 11101010 ---> 二进制原码形式

这里我们需要注意一下,可能会有疑问的是,150不是正数吗。为啥还要这样,这是因为150做了一一强制转换,我们可以看成他的补码其实是10010110,第一位是符号位,是1,则为负数。

  1. public class IntTest05{
  2. public static void main(String[] args){
  3. // 编译报错:因为150已经超出了byte取值范围,不能直接赋值,需要强转
  4. //byte b = 150;
  5. byte b = (byte)150;
  6. // 这个结果会输出多少呢?
  7. System.out.println(b); // -106
  8. }
  9. }

7.6 byte、char、short做混合运算

  1. - bytecharshort做混合运算的时候,各自先转换成int再做运算。
  1. public class IntTest06{
  2. public static void main(String[] args){
  3. char c1 = 'a';
  4. byte b = 1;
  5. // 注意:这里的"+"是负责求和的
  6. System.out.println(c1 + b); // 98
  7. // 错误: 不兼容的类型: 从int转换到short可能会有损失
  8. //short s = c1 + b; // 编译器不知道这个加法最后的结果是多少。只知道是int类型。
  9. // 修改
  10. short s = (short)(c1 + b);
  11. int a = 1;
  12. short x = 1; 可以
  13. short x = a; // 不可以,编译器只知道a是int类型,不知道a中存储的是哪个值。
  14. System.out.println(x);
  15. char cc = 'a';
  16. // cc 会先自动转换成int类型,再做运算
  17. int o = cc + 100;//cc==97
  18. System.out.println(o); // 197
  19. }
  20. }

7.7 多种数据类型做混合运算

  1. - 多种数据类型做混合运算的时候,最终的结果类型是“最大容量”对应的类型。char+short+byte 这个除外(char + short + byte混合运算的时候,会各自先转换成int再做运算)。
  1. public class IntTest07{
  2. public static void main(String[] args){
  3. long a = 10L;
  4. char c = 'a';
  5. short s = 100;
  6. int i = 30;
  7. // 求和
  8. System.out.println(a + c + s + i); //237
  9. // 错误: 不兼容的类型: 从long转换到int可能会有损失
  10. // 计算结果是long类型
  11. //int x = a + c + s + i;
  12. //修改
  13. int x = (int)(a + c + s + i);
  14. System.out.println(x);
  15. }
  16. }

8. 浮点型

  • 浮点型包括float(单精度)占4字节,double(双精度)占8字节;
  • 需要注意的是,如果用在银行方面或者说使用在财务方面,double也是远远不够的,在java中提供了一种精度更高的类型,这种类型专门使用在财务软件方面:java.math.BigDecimal (不是基本数据类型,属于引用数据类型。)
  • float和double存储数据的时候都是存储的近似值。
  • 任意一个浮点型都比整数型空间大。虽然long类型占用8个字节,float类型占用4个字节,但是float容量 > long容量,我们也可以认为浮点型的精度更高,整型与浮点型比较的是精度,而不是所占字节大小。
  • java中规定,任何一个浮点型数据默认被当做double来处理。如果想让这个浮点型字面量被当做float类型来处理,那么请在字面量后面添加F/f。

    1. public class FloatTest01{
    2. public static void main(String[] args){
    3. // 分析这个程序,可以编译通过吗?
    4. // 错误: 不兼容的类型: 从double转换到int可能会有损失
    5. // 原理:先将5转换成double类型,然后再做运算,结果是double
    6. // 大容量无法直接赋值给小容量,需要强转。
    7. //int i = 10.0 / 5;
    8. // 怎么修改
    9. int i = (int)10.0 / 5;
    10. System.out.println(i); // 2
    11. // 可以这样修改吗?强转的时候只留下整数位。
    12. int x = (int)(10.0 / 5);
    13. System.out.println(x); // 2
    14. }
    15. }

9. 布尔类型

  • 在java语言中boolean类型只有两个值,true和false;不像C或者C++,C语言中1和0也可以表示布尔类型。
  • 布尔类型不可以和其它基本数据类型发生转换

第五章 运算符

1. 运算符概述

1.1 算术运算符

  1. - 算术运算符有:+、-、*、/、%、++、--
  2. - 我们主要说明一下自增自减,以自增为例(自减和自增差不多,可参考自增)

可以出现在变量前,也可以出现在变量后,不管出现在变量前还是后,总之++执行结束之后,变量的值一定会自加1。

  1. public class OperatorTest01{
  2. public static void main(String[] rags){
  3. int a = 10;
  4. int b = 3;
  5. System.out.println(a + b); // 13
  6. System.out.println(a - b); // 7
  7. System.out.println(a * b); // 30
  8. System.out.println(a / b); // 3
  9. System.out.println(a % b); // 1
  10. // 重点掌握 ++ 和 --
  11. // 这里重点讲解 ++,至于-- 大家可以照葫芦画瓢。
  12. // ++ 自加1(++可以出现在变量前,也可以出现在变量后。)
  13. int i = 10;
  14. // i变量自加1
  15. i++;
  16. System.out.println(i); //11
  17. int k = 10;
  18. // k变量自加1
  19. ++k;
  20. System.out.println(k); //11
  21. // 研究:++出现在变量前和变量后有什么区别?
  22. // 先看++出现在变量后。
  23. // 语法:当++出现在变量后,会先做赋值运算,再自加1
  24. int m = 20;
  25. int n = m++;
  26. System.out.println(n); // 20
  27. System.out.println(m); // 21
  28. // ++出现在变量前呢?
  29. // 语法规则:当++出现在变量前的时候,会先进行自加1的运算,然后再赋值。
  30. int x = 100;
  31. int y = ++x;
  32. System.out.println(x); // 101
  33. System.out.println(y); // 101
  34. // 题目
  35. int c = 90;
  36. System.out.println(c++); // 传,这个“传”在这里有一个隐形的赋值运算。90
  37. // 把上面代码拆解开
  38. //int temp = c++;
  39. //System.out.println(temp);
  40. System.out.println(c); // 91
  41. int d = 80;
  42. System.out.println(++d); //81
  43. // 拆解
  44. //int temp2 = ++d;
  45. //System.out.println(temp2);
  46. System.out.println(d); // 81
  47. /*
  48. int e = 1;
  49. int f = e; // e赋值给f,表示将e“传”给了f
  50. */
  51. }
  52. }

1.2 关系运算符

  1. - 关系运算符有:>、>、= 、< 、<= 、==、 !=
  2. - 所有的关系运算符的运算结果都是布尔类型
  3. - 关系运算符中如果有两个符号的话,两个符号之间不能有空格。>= 这是对的, > = 这是不对的。

1.3 逻辑运算符

  1. - 逻辑运算符有:&、 | 、! 、&&、 ||
  2. - 逻辑运算符两边要求都是布尔类型,并且最终的运算结果也是布尔类型。
  3. - 关于短路与 &&,短路或 ||,其中重点学习短路与,短路或照葫芦画瓢。首先这两个运算符的运算结果没有任何区别,完全相同;只不过“短路与&&”会发生短路现象。
  1. public class OperatorTest03{
  2. public static void main(String[] args){
  3. // 接下来需要理解一下什么是短路现象,什么时候会发生“短路”。
  4. int x = 10;
  5. int y = 11;
  6. // 逻辑与&什么时候结果为true(两边都是true,结果才是true)
  7. // 左边的 x>y 表达式结果已经是false了,其实整个表达式的结
  8. // 果已经确定是false了,按道理来说右边的表达式不应该执行。
  9. System.out.println(x > y & x > y++);
  10. // 通过这个测试得出:x > y++ 这个表达式执行了。
  11. System.out.println(y); // 12
  12. //测试短路与&&
  13. int m = 10;
  14. int n = 11;
  15. // 使用短路与&&的时候,当左边的表达式为false的时候,右边的表达式不执行
  16. // 这种现象被称为短路。
  17. System.out.println(m > n && m > n++);
  18. System.out.println(n); // 11
  19. }
  20. }
  1. - 什么时候使用&&,什么时候使用& ?从效率方面来说,&&比&的效率高一些。大部分情况下都建议使用短路与&&,只有当既需要左边表达式执行,又需要右边表达式执行的时候,才会选择逻辑与&。

1.4 赋值运算符

  1. - 赋值运算符包括“基本赋值运算符”和“扩展赋值运算符”:基本的 =;扩展的:+=、 -= 、*=、 /= 、%=
  2. - 注意:扩展赋值运算符在编写的时候,两个符号之间不能有空格。
  3. - 使用扩展赋值运算符的时候,永远都不会改变运算结果类型。
  1. public class OperatorTest04{
  2. public static void main(String[] args){
  3. /*
  4. 以 += 运算符作为代表,学习扩展赋值运算符。
  5. 其它的运算符,例如:-= *= /= %= 和 += 原理相似。
  6. */
  7. int m = 10;
  8. // += 运算符类似于下面的表达式
  9. m = m + 20;
  10. System.out.println(m); // 30
  11. // 研究:
  12. // i += 10 和 i = i + 10 真的是完全一样吗?
  13. // 答案:不一样,只能说相似,其实本质上并不是完全相同。
  14. byte x = 100; // 100没有超出byte类型取值范围,可以直接赋值
  15. System.out.println(x); // 100
  16. // 分析:这个代码是否能够编译通过?
  17. // 错误: 不兼容的类型: 从int转换到byte可能会有损失
  18. //x = x + 1; // 编译器检测到x + 1是int类型,int类型可以直接赋值给byte类型的变量x吗?
  19. // 使用扩展赋值运算符可以吗?
  20. // 可以的,所以得出结论:x += 1 和 x = x + 1不一样。
  21. // 其实 x += 1 等同于:x = (byte)(x + 1);
  22. x += 1;
  23. System.out.println(x); // 101
  24. // 早就超出byte的取值范围了。
  25. x += 199; // x = (byte)(x + 199);
  26. System.out.println(x); // 44 (当然会自动损失精度了。)
  27. int y = 100;
  28. y += 100;
  29. System.out.println(y); // 200
  30. y -= 100; // x = x - 100;
  31. System.out.println(y); // 100
  32. y *= 10; // x = x * 10;
  33. System.out.println(y); // 1000
  34. y /= 30; // x = x / 30;
  35. System.out.println(y); // 33
  36. y %= 10; // x = x % 10;
  37. System.out.println(y); // 3
  38. }
  39. }

1.5 三目运算符

  1. - 布尔表达式 ? 表达式1 : 表达式2
  1. public class Test{
  2. public static void main(String[] args){
  3. // 这里会编译出错吗?
  4. // 错误: 不是语句
  5. // 100;
  6. // 错误: 不是语句
  7. //'男';
  8. boolean sex = true;
  9. // 分析以下代码是否存在语法错误?
  10. // 错误: 不是语句
  11. //sex ? '男' : '女';
  12. // 前面的变量的c的类型不能随意编写。
  13. // 最终的计算结果是字符型,所以变量也需要使用char类型。
  14. char c = sex ? '男' : '女';
  15. System.out.println(c);
  16. }
  17. }

1.6 字符串连接运算符

  1. - + 运算符在java语言中有两个作用:求和、字符串拼接
  2. - + 运算符两边都是数字类型的时候,求和。
  3. - + 运算符两边的“任意一边”是字符串类型,那么这个+会进行字符串拼接操作,字符串拼接完之后的结果还是一个字符串。

测验:

关于 i = i++

  1. public class Homework01{
  2. public static void main(String[] args){
  3. int i = 10;
  4. i = i++;
  5. // 大部分同学都会认为这个i一定是11
  6. // 这个i变量最终的结果是10(惊讶)
  7. // 在C++中运行结果确实是11.
  8. // java中运行结果是10
  9. // c++中运行结果是11
  10. // 为什么?因为java和c++的编译器是不同的人开发的。原理不同。
  11. System.out.println(i);
  12. // 在java语言中i++,这种表达式在执行的时候,会提前先将i变量找一个临时
  13. // 变量存储一下。(C++中并没有这样做。)
  14. /*
  15. int k = 10;
  16. k = k++;
  17. */
  18. int k = 10;
  19. // k = k++;对应的是下面三行代码
  20. int temp = k;
  21. k++;
  22. k = temp;
  23. System.out.println(k);
  24. }
  25. }

接收键盘输入

  1. public class KeyInput{
  2. public static void main(String[] args){
  3. // 创建一个键盘扫描器对象
  4. // s 变量名,可以修改。其它不能改。
  5. java.util.Scanner s = new java.util.Scanner(System.in); //还可以通过import方式,这里暂不介绍
  6. // 接收用户的输入,从键盘上接收一个int类型的数据
  7. // 解释这行代码,尽量让大家明白:代码执行到这里的时候,会暂停下来
  8. // 等待用户的输入,用户可以从键盘上输入一个整数,然后回车,回车之后
  9. // i变量就有值了。并且i变量中保存的这个值是用户输入的数字。
  10. // i变量就是接收键盘数据的。
  11. int i = s.nextInt(); // i是变量名,s是上面的变量名
  12. System.out.println("您输入的数字是:" + i);
  13. // 代码执行到此处又会停下来,等待用户的输入。
  14. // 敲完回车,s.nextInt();代码执行结束。
  15. int j = s.nextInt();
  16. System.out.println("您输入的数字是:" + j);
  17. // 如果输入的不是数字,那么会出异常:InputMismatchException
  18. int m = s.nextInt();
  19. System.out.println("您输入的数字是:" + m);
  20. // 我怎么从键盘上接收一个字符串呢?
  21. // 程序执行到此处会停下来,等待用户的输入,用户可以输入字符串。
  22. String str = s.next();
  23. System.out.println("您输入了:" + str);
  24. }
  25. }