第一章 数据类型转换

java程序中要求参与计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换

1.1自动转换

自动转换:将取值范围小的类型自动提升为取值范围大的类型

转换原理图解

2.0数据类型转换、运算符、方法入门 - 图1

转换规则

  1. /*
  2. 当数据类型不一样时,将会发生数据类型转换
  3. 自动类型转换 (隐式)
  4. 1,特点:代码不需要进行特殊处理,自动完成
  5. 2,规则数据范围从小到大
  6. 强制类型转换 (显式)
  7. */
  8. public class Demo01DataType {
  9. public static void main(String[] args) {
  10. System.out.println(1024); // 这是一个整数,默认为int类型
  11. System.out.println(3.14); // 这是一个浮点数,默认为double类型
  12. // 左边为long类型,右边为默认int类型,左右不一样
  13. // 一个等号代表赋值,将右侧的int常量,交给左侧的long变量进行存储
  14. // int --> long,符合数据范围从小到大的要求
  15. // 这一行代码发生了自动类型转换
  16. long num1 = 100;
  17. System.out.println(num1); // 100
  18. // 左边是double类型,右边是float类型,左右不一样
  19. // float --> double, 符合从小到大的规则
  20. // 发生了自动类型转换
  21. double num2 = 2.5F;
  22. System.out.println(num2); // 2.5
  23. // 左边是float类型,右边是long类型,左右不一样
  24. // long --> float , 范围是float更大一些,符合从小到大的规则
  25. // 发生了自动类型转换
  26. float num3 = 30L;
  27. System.out.println(num3); // 30.0
  28. }
  29. }

1.2强制转换

转换原理图解

2.0数据类型转换、运算符、方法入门 - 图2

转换规则

  1. /*
  2. 强制类型转换
  3. 1,特点:代码需要进行特殊的格式处理,不能自动完成
  4. 2,格式:范围小的类型 范围小的变量名 = (范围大的类型) 原本范围打的数据;
  5. */
  6. public class Demo02DataType {
  7. public static void main(String[] args) {
  8. // 左边是int类型,右边是long类型,不一样
  9. // long --> int,不是从小到大
  10. // 不能发生自动类型转换!
  11. // 格式:范围小的类型 范围小的变量名 = (范围大的类型) 原本范围打的数据;
  12. int num1 = (int) 100L;
  13. System.out.println(num1);
  14. // 左边是int类型,右边是float类型,不一样
  15. // float --> int,不是从小到大
  16. // 不能发生自动类型转换!
  17. // 格式:范围小的类型 范围小的变量名 = (范围大的类型) 原本范围打的数据;
  18. int num2 = (int) 3.9999999F;
  19. System.out.println(num2); // 结果为4
  20. int num3 = (int) 3.9999998F;
  21. System.out.println(num3); // 结果为3
  22. }
  23. }

强烈注意

  1. /*
  2. 强制类型转换
  3. 1,特点:代码需要进行特殊的格式处理,不能自动完成
  4. 2,格式:范围小的类型 范围小的变量名 = (范围大的类型) 原本范围打的数据;
  5. 注意事项:
  6. 1,强制类型转换一般不推荐使用,因为有可能发生精度损失,数据溢出。
  7. 2,byte/short/char这三种类型都可以发生数学运算,例如加法“+”
  8. 3,byte/short/char这三种类型在运算的时候,都会被首先提升为int类型,然后计算
  9. 4,boolean类型不能发生数据类型转换
  10. */
  11. public class Demo021DataType {
  12. public static void main(String[] args) {
  13. // 左边是int类型,右边是long类型,不一样
  14. // long --> int,不是从小到大
  15. // 不能发生自动类型转换!
  16. // 格式:范围小的类型 范围小的变量名 = (范围大的类型) 原本范围打的数据;
  17. int num1 = (int) 100L;
  18. System.out.println(num1);
  19. // long强制转换为int类型,会发生数据溢出
  20. int num2 = (int)6000000000L;
  21. System.out.println(num2); //1705032704
  22. // double --> int ,强制类型转换,会发生精度损失
  23. int num3 = (int)3.99;
  24. System.out.println(num3); //3,这里不是四舍五入,所有的小数位都会被舍弃掉
  25. char zifu1 = 'A'; //这是一个字符变量,里面是大写的字母A
  26. System.out.println(zifu1 + 1); // 66,也就是大写字母A被当作65进行处理
  27. // 计算机底部会用一个数字(二进制)来代表字符A,就是65
  28. // 一旦char类型进行了数学计算,那么字符就会按照一定的规则翻译成为一个数字
  29. byte num4 = 40; // 注意右侧的数值大小不能超过左侧的类型范围
  30. byte num5 = 50;
  31. // 错误,由于byte类型运算会先转换为int,
  32. // byte + byte --> int + int --> int -->byte(可能会出现数据溢出)
  33. // byte result1 = num4 + num5;
  34. // byte + byte --> int + int --> int
  35. int result1 = num4 + num5;
  36. System.out.println(result1); //90
  37. short num6 = 60;
  38. //byte + short --> int +int --> int
  39. // int强制转换为short:注意必须保证逻辑上真实大小本来就没有超过short范围,否则会发生数据溢出
  40. short result2 = (short)(num4 + num6);
  41. System.out.println(result2); //100
  42. }
  43. }

数据溢出

2.0数据类型转换、运算符、方法入门 - 图3

1.3 ASCII编码表

ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符
0 NUT 32 (space) 64 @ 96
1 SOH 33 ! 65 A 97 a
2 STX 34 66 B 98 b
3 ETX 35 # 67 C 99 c
4 EOT 36 $ 68 D 100 d
5 ENQ 37 % 69 E 101 e
6 ACK 38 & 70 F 102 f
7 BEL 39 , 71 G 103 g
8 BS 40 ( 72 H 104 h
9 HT 41 ) 73 I 105 i
10 LF 42 * 74 J 106 j
11 VT 43 + 75 K 107 k
12 FF 44 , 76 L 108 l
13 CR 45 - 77 M 109 m
14 SO 46 . 78 N 110 n
15 SI 47 / 79 O 111 o
16 DLE 48 0 80 P 112 p
17 DCI 49 1 81 Q 113 q
18 DC2 50 2 82 R 114 r
19 DC3 51 3 83 S 115 s
20 DC4 52 4 84 T 116 t
21 NAK 53 5 85 U 117 u
22 SYN 54 6 86 V 118 v
23 TB 55 7 87 W 119 w
24 CAN 56 8 88 X 120 x
25 EM 57 9 89 Y 121 y
26 SUB 58 : 90 Z 122 z
27 ESC 59 ; 91 [ 123 {
28 FS 60 < 92 / 124 |
29 GS 61 = 93 ] 125 }
30 RS 62 > 94 ^ 126 `
31 US 63 ? 95 _ 127 DEL
  1. /*
  2. 数字和字符的对照关系表(编码表):
  3. ASCII码表:American Standard Code for Information Interchange 美国信息交换标准代码
  4. Unicode码表:万国码。也是数字和符号的对照关系,开头0 - 127部分和ASCII完全一样,但是从128开始包含有更多字符
  5. 48 - '0'
  6. 65 - 'A'
  7. 97 - 'a'
  8. */
  9. public class Demo03DataTypeChar{
  10. public static void main(String[] args) {
  11. char zifu1 = '1';
  12. System.out.println(zifu1 + 0); // 49
  13. char zifu2 = 'A'; // 其实底层保存的数字是65
  14. char zifu3 = 'c';
  15. // 左侧是int类型,右侧是char类型,
  16. // char --> int ,确实是从小到大
  17. // 发生了自动类型转换
  18. int num = zifu3;
  19. System.out.println(num); //99
  20. char zifu4 = '中';
  21. System.out.println(zifu4 + 0); // 20013
  22. }
  23. }

第二章运算符

2.1算数运算符

加减乘除取模

  1. /*
  2. 运算符:进行特定操作的符号。例如:+
  3. 表达式:用运算符连起来的式子叫做表达式。例如:20 + 5。又例如:a + b
  4. 四则运算
  5. 加: +
  6. 减: -
  7. 乘: *
  8. 除: /
  9. 取模(取余数):%
  10. 首先计算得到表达式的结果,然后再打印输出这个结果
  11. 复习一下小学一年级的除法公式:
  12. 被除数 / 除数 = 商 …… 余数
  13. 对于一个整数的表达式来说,除法用的式整除,整数除以整数,结果还是整数。只看商,不看余数
  14. 之对于除法来说,取模运算符才有意义
  15. 注意事项:
  16. 1. 一旦运算中有不同类型的数据,那么结果将会是数据类型范围大的那种。
  17. */
  18. public class Demo04peralor{
  19. public static void main(String[] args){
  20. // 两个常量之间可以进行数学运算
  21. System.out.println(7 + 5);
  22. // 两个变量之间可以也进行数学运算
  23. int a = 10, b = 20;
  24. System.out.println(a - b);
  25. // 常量与变量之间可以混合运算
  26. System.out.println(a * 5);
  27. System.out.println(7 / 5); // 1
  28. System.out.println(5 / 7); // 0
  29. System.out.println(7 % 5); // 2
  30. System.out.println(5 % 7); // 5
  31. System.out.println(7.0 / 5.0); // 1.4
  32. System.out.println(5.0 / 7.0); // 0.7142857142857143
  33. System.out.println(7.0 % 5.0); // 2.0 余数由整型变为浮点型
  34. System.out.println(5.0 % 7.0); // 5.0 余数由整型变为浮点型
  35. // int + double --> double + double --> double
  36. System.out.println(7 + 5.0);
  37. double result1 = a + 2.5;
  38. System.out.println(result1);
  39. // b = a + 1.2; //当运算中含有多种数据类型时,需注意结果变量的数据
  40. // System.out.println(b);
  41. }
  42. }

加法多种用法

  1. /*
  2. 四则运算当中的“+”有常见的三种用法:
  3. 1,对于数值来说,是加法
  4. 2,对于字符char来说,在计算之前,char会被提升成为int,然后计算
  5. char类型字符,和int类型字符,之间的对照关系表:ASSCII,Unicode
  6. 3,对于字符串String(首字母大写,并不是关键字)来说,加号代表字符串连接操作
  7. 任何数据类型和字符串进行连接的时候,结果都会变成字符串
  8. */
  9. public class Demo05Plus {
  10. public static void main(String[] args){
  11. // 字符串类型的变量的基本使用
  12. // 数据类型 变量名称 = 数据值
  13. String String = "Hello";
  14. System.out.println(String); // String 不是关键字
  15. String str1 = "Hello";
  16. System.out.println(str1); // Hello
  17. String str2 = "java";
  18. // String + int --> String
  19. System.out.println(str2 + 20); // java20
  20. // 优先级问题
  21. // String + int + int
  22. // String + int
  23. // String
  24. System.out.println(str2 + 20 + 30); // java2030
  25. System.out.println(str2 + (20 + 30)); // java50
  26. }
  27. }

自增自减

  1. /*
  2. 自增运算符:++
  3. 自减运算符:--
  4. 基本含义:让一个变量涨一个数值1,或者让一个变量降一个数值1
  5. 使用格式:写在变量名称之前,或者之后。例如:++num,也可以num++
  6. 使用方式:
  7. 1,单独使用:不与其他任何操作混搭,自己独立成为一个步骤
  8. 2,混合使用:和其他操作混搭,例如与赋值混搭,或者与打印操作混搭,等
  9. 使用区别:
  10. 1,在单独使用时,前++与后++没有任何区别。也就是:++num;和num++;是完全一样的
  11. 2,在混合使用时,有【重大区别】
  12. A,如果是【前++】,那么【立刻马上+1】,然后拿着结果进行使用。 【先加后用】
  13. B,如果是【后++】,那么首先使用变量本来的值,【然后再让变量+1】 【先用后加】
  14. 注意事项:
  15. 只有变量才能使用自增,自减运算符,常量不可发生改变,所以不能用
  16. */
  17. public class Demo06perator{
  18. public static void main(String[] args) {
  19. // 单独使用
  20. int num1 = 10;
  21. System.out.println(num1);
  22. System.out.println(num1); // 10
  23. ++num1; // 单独使用 前++
  24. System.out.println(num1); // 11
  25. num1++; // 单独使用 后++
  26. System.out.println(num1); // 12
  27. System.out.println("================");
  28. // 与打印操作混合使用时
  29. int num2 = 20;
  30. // 混合使用,前++,变量立刻马上变成21,然后打印结果21
  31. System.out.println(++num2); // 21
  32. System.out.println(num2); // 21
  33. System.out.println("================");
  34. int num3 = 30;
  35. // 混合使用,后++,首先使用变量原本的30,然后再让变量+1得到31
  36. System.out.println(num3++); // 30
  37. System.out.println(num3); // 31
  38. System.out.println("=================");
  39. // 和赋值操作混合
  40. int num4 = 40;
  41. // 混合使用,前--,变量立刻马上-1变成39,然后将结果39交给result1变量
  42. int result1 = --num4;
  43. System.out.println(result1);
  44. System.out.println(num4);
  45. System.out.println("==================");
  46. int num5 = 50;
  47. // 混合使用,后--,首先把本来的数字50交给result2,然后自己再-1变成49
  48. int result2 = num5--;
  49. System.out.println(result2);
  50. System.out.println(num5);
  51. System.out.println("=================");
  52. int x = 10;
  53. int y = 20;
  54. // 11 * 20 + 11 - 18
  55. int result3 = ++x * y-- + x++ - --y; //213
  56. System.out.println(result3);
  57. System.out.println(x); // 12
  58. System.out.println(y); // 18
  59. // 60++; // 语法错误!常量不可以使用++或--
  60. }
  61. }

2.2赋值运算符

  1. /*
  2. 赋值运算符分为:
  3. 基本运算符:就是等号 ”=“,代表将右侧的数据交给左侧的变量
  4. int a = 10;
  5. 复合赋值运算符:
  6. += a += 5 相当于 a = a + 5
  7. -= b -= 6 相当于 b = b - 6
  8. *= c *= 7 相当于 c = c * 7
  9. /= d /= 8 相当于 d = d / 8
  10. %= e %= 9 相当于 e = e % 9
  11. 注意事项:
  12. 1,只有变量才能使用赋值运算符,常量不能进行赋值
  13. 2,复合赋值运算其中隐含了一个强制类型转换
  14. */
  15. public class Demo07perator{
  16. public static void main(String[] args){
  17. int a = 10;
  18. // 按照公式进行翻译:a = a + 5
  19. // a = 10 + 5
  20. // a = 15
  21. // a本来是10,现在重新赋值得到15
  22. a += 5;
  23. System.out.println(a); // 15
  24. int b = 10;
  25. // // 按照公式进行翻译:b = b + 5
  26. // b = 10 % 3
  27. // b = 1
  28. // a本来是10,现在重新赋值得到1
  29. b %= 3;
  30. System.out.println(b);
  31. // 50 = 30 // 常量不能进行赋值
  32. byte c = 100;
  33. // c = c + 5
  34. // c = byte + int
  35. // c = int + int
  36. // c = int
  37. // c = (byte) int
  38. c += 30;
  39. System.out.println(c); // -126 出错了,因为发生了强制类型转换
  40. }
  41. }

2.3比较运算符

  1. /*
  2. 比较运算符
  3. 大于: >
  4. 小于: <
  5. 大于等于: >=
  6. 小于等于: <=
  7. 相等: == 【两个等号连写,才是相等,一个等号是赋值】
  8. 不相等: !=
  9. 注意事项:
  10. 1,比较运算符的结果一定是一个boolean值,成立就是true,不成立就是false
  11. 2,如果进行多次判断不能连着写
  12. 数学中的写法:例如:1 < x < 3
  13. Java程序中【不允许】这种写法
  14. */
  15. public class Demo08perator{
  16. public static void main(String[] args){
  17. System.out.println(10 > 5); // true
  18. int num1 = 10;
  19. int num2 = 20;
  20. System.out.println(num1 > num2); // flase
  21. System.out.println(num1 >= 5); // true
  22. System.out.println(num2 <= 11); // flase
  23. System.out.println(num1 >= 20); // true
  24. System.out.println("====================");
  25. System.out.println(10 == 10); // true
  26. System.out.println(10 != 5); // true
  27. System.out.println(10 != 10); // flase
  28. int x = 2;
  29. // System.out.println(1 < x < 3); // 错误写法,编译报错,不能连着写
  30. }
  31. }

2.4逻辑运算符

  1. /*
  2. 逻辑运算符:
  3. 与 (并且) && 全真则真,有假则假
  4. 或 (或者) || 有真则真,全假则假
  5. 非 (取反) ! 是真则假,是假则真
  6. 与"&&", 或"||",具有短路效果,如果根据左边已经可以判断得到最终结果,那么右边的代码将不会执行,从而节省一定的性能
  7. 注意事项:
  8. 1,逻辑运算符只能用于boolean值
  9. 2,与、或需要左右各自有一个boolean值,但是取反只要有唯一的一个boolean值即可
  10. 3,与、或两种运算符,如果有多个条件,可以连续写
  11. 两个条件:条件A && 条件B
  12. 多个条件:条件A && 条件B && 条件C
  13. TIPS:
  14. 对于1 < x < 3的情况应该拆成两个部分,然后使用与运算符连接起来
  15. int x = 2
  16. 1 < x && x < 3
  17. */
  18. public class Demo09Logio{
  19. public static void main(String[] args){
  20. System.out.println(true && true); // true
  21. System.out.println(true && false); // false
  22. System.out.println(false && false); // false
  23. System.out.println("=========================");
  24. System.out.println(true || true); // true
  25. System.out.println(true || false); // true
  26. System.out.println(false || false); // false
  27. System.out.println("=========================");
  28. System.out.println(true); // true
  29. System.out.println(!true); // false
  30. System.out.println("=========================");
  31. int a = 10;
  32. // false && ...
  33. System.out.println(3 > 4 && a++ < 100); // false
  34. System.out.println(a); // 10,触发短路,a++没有执行
  35. System.out.println("=========================");
  36. int b = 20;
  37. // true || ...
  38. System.out.println(5 > 3 || b++ < 100); // true
  39. System.out.println(b); // 20,触发短路,b++没有执行
  40. }
  41. }

2.5三元运算符

  1. /*
  2. 一元运算符:只需要一个数据就可以进行操作的运算符。例如;取反!、自增++、自减--
  3. 二元运算符:需要两个数据才可以进行操作的运算。例如:加法+、减法-、赋值=
  4. 三元运算符:需要三个数据才可以进行运算的运算符
  5. 格式:
  6. 数据类型 变量名称 = 条件判断 ? 表达式A : 表达式B;
  7. 流程:
  8. 首先判读条件是否成立:
  9. 如果成立 为true,那么将表达式A的值赋给左侧的变量
  10. 如果不成立 weifalse,那么将表达式B的值赋给左侧的变量
  11. 二者选其一
  12. 注意事项:
  13. 1,必须同时保证表达式A和表达式B都符合左侧的变量的数据类型的要求
  14. 2,三元运算符的结果必须被使用
  15. */
  16. public class Demo10Operato{
  17. public static void main(String[] args){
  18. int a = 10, b = 20;
  19. // 数据类型 变量名称 = 条件判断 ? 表达式A : 表达式B;
  20. // 判断a > b是否成立,如果成立将a的值赋给max;如果不成立将bde值赋给max。二者选其一
  21. int max = a > b ? a : b; // 最大值 max
  22. System.out.println("最大值:" + max); //20
  23. // int result = 3 > 4 ? 2.5 : 11; //错误写法!
  24. System.out.println(a > b ? a : b); // 正确写法!
  25. // a > b ? a : b; // 错误写法!
  26. System.out.println("===========");
  27. int x = 10;
  28. // 100 > 1 成立,将表达式A 100 赋给y,表达式B没有执行,x的值不变
  29. int y = 100 > 1 ? 100 : ++x;
  30. System.out.println(x); // 100
  31. System.out.println(y); // 10
  32. }
  33. }

第三章方法入门

3.1概述

方法:

  1. 就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。 当我们需要这个功能的时候,就可以去调用。这样即实现了代码的复用性,也解决了代码冗余的现象。

3.2方法的定义

2.0数据类型转换、运算符、方法入门 - 图4

3.3方法的调用

2.0数据类型转换、运算符、方法入门 - 图5

3.4调用练习

3.5注意事项

  • 方法定义注意事项:
    • 方法必须定义在一类中方法外
    • 方法不能定义在另一个方法的里面
  1. /*
  2. 定义一个方法的格式:
  3. public static void 方法名称() {
  4. 方法体;
  5. }
  6. 方法的命名规则采用小驼峰式
  7. 方法体:也就是大括号中包含的任意条语句
  8. 注意事项:
  9. 1,方法定义的先后顺序无所谓
  10. 2,方法的定义不能产生嵌套包含关系
  11. 3,方法在定义后,不会执行,如果想要执行,一定要进行方法的【调用】。
  12. 如何调用方法,格式:
  13. 方法名称();
  14. */
  15. public class Demo11Method{
  16. public static void main(String[] args){
  17. farmer(); // 调用农民的方法
  18. seller(); // 调用小商贩的方法
  19. cook(); // 调用厨师的方法
  20. me(); // 调用我自己的方法
  21. }
  22. // 厨师
  23. public static void cook() {
  24. System.out.println("洗菜");
  25. System.out.println("切菜");
  26. System.out.println("炒菜");
  27. System.out.println("装盘");
  28. /*public static void me() {
  29. System.out.println("吃");
  30. } 错误写法,方法的定义不能嵌套*/
  31. }
  32. // 我
  33. public static void me() {
  34. System.out.println("吃");
  35. }
  36. // 小商贩
  37. public static void seller() {
  38. System.out.println("运输到农贸市场");
  39. System.out.println("抬高价格");
  40. System.out.println("吆喝");
  41. System.out.println("卖给厨师");
  42. }
  43. // 农民
  44. public static void farmer() {
  45. System.out.println("播种");
  46. System.out.println("浇水");
  47. System.out.println("施肥");
  48. System.out.println("除虫");
  49. System.out.println("收割");
  50. System.out.println("卖给小商贩");
  51. }
  52. }

第四章JShell脚本工具

JShell脚本工具是JDK9的新特性

第五章扩展知识点

5.1+=符号的扩展

5.2常量和变量的运算

  1. /*
  2. 在给变量赋值时,如果右侧表达式中都是常量,没有任何变量
  3. 那么编译器javac将会直接将若干个常量表达式结算得到结果
  4. short result = 5 + 8; // 等号左边全是常量,没有任何变量
  5. 编译之后,得到的.class字节码文件当中相当于【直接就是】:
  6. short result = 13;
  7. 右侧常量结果数值没有超过左侧范围,所以正确
  8. 这称为"编译器的常量优化"。
  9. 但是注意:一旦表达式中有变量参加,那么就不能进行这种优化
  10. */
  11. public class Demo13Notice {
  12. puvlic ststic void main(String[] args) {
  13. short num1 = 10; // 正确写法,右侧没有超过左侧范围
  14. short a = 5;
  15. short b = 8;
  16. // short + short --> int + int --> int
  17. // short result = a + b; // 错误写法!左侧需要是int类型
  18. // 右侧不用变量,而是采用常量,而且只有两个常量,没有别人
  19. short result = 5 + 8;
  20. Systrm.out.println(result);
  21. // short result1 = 5 + a + 8; // 不全是常量会报错
  22. }
  23. }

2,

  1. /*
  2. 对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过左侧范围
  3. 那么java编译器就会自动隐含的为我们补上一个(byte)(short)(char)
  4. 1,如果没有超过左侧范围,编译器会补上强转
  5. 2,如果超出范围,编译器会直接报错
  6. */
  7. public class Demo12Notice{
  8. public static void main(String[] args){
  9. // 右侧是一个int范围数字,但没有超出左侧范围,是正确的
  10. byte num1 = /*(byte)由编译器补上*/30; // 右侧没有超出左侧范围
  11. System.out.println(num1); // 30
  12. // byte num2 = 128; // 右侧超出左侧范围,报错
  13. // int --> char, 没有超出范围
  14. // 编译器会自动补上一个隐含的(char)
  15. char zifu = /*(char)*/ 65;
  16. System.out.println(zifu); //A
  17. }
  18. }