第一章 数据类型转换
java程序中要求参与计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换
1.1自动转换
自动转换:将取值范围小的类型自动提升为取值范围大的类型
转换原理图解

转换规则
/*当数据类型不一样时,将会发生数据类型转换自动类型转换 (隐式)1,特点:代码不需要进行特殊处理,自动完成2,规则数据范围从小到大强制类型转换 (显式)*/public class Demo01DataType {public static void main(String[] args) {System.out.println(1024); // 这是一个整数,默认为int类型System.out.println(3.14); // 这是一个浮点数,默认为double类型// 左边为long类型,右边为默认int类型,左右不一样// 一个等号代表赋值,将右侧的int常量,交给左侧的long变量进行存储// int --> long,符合数据范围从小到大的要求// 这一行代码发生了自动类型转换long num1 = 100;System.out.println(num1); // 100// 左边是double类型,右边是float类型,左右不一样// float --> double, 符合从小到大的规则// 发生了自动类型转换double num2 = 2.5F;System.out.println(num2); // 2.5// 左边是float类型,右边是long类型,左右不一样// long --> float , 范围是float更大一些,符合从小到大的规则// 发生了自动类型转换float num3 = 30L;System.out.println(num3); // 30.0}}
1.2强制转换
转换原理图解

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

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 |
/*数字和字符的对照关系表(编码表):ASCII码表:American Standard Code for Information Interchange 美国信息交换标准代码Unicode码表:万国码。也是数字和符号的对照关系,开头0 - 127部分和ASCII完全一样,但是从128开始包含有更多字符48 - '0'65 - 'A'97 - 'a'*/public class Demo03DataTypeChar{public static void main(String[] args) {char zifu1 = '1';System.out.println(zifu1 + 0); // 49char zifu2 = 'A'; // 其实底层保存的数字是65char zifu3 = 'c';// 左侧是int类型,右侧是char类型,// char --> int ,确实是从小到大// 发生了自动类型转换int num = zifu3;System.out.println(num); //99char zifu4 = '中';System.out.println(zifu4 + 0); // 20013}}
第二章运算符
2.1算数运算符
加减乘除取模
/*运算符:进行特定操作的符号。例如:+表达式:用运算符连起来的式子叫做表达式。例如:20 + 5。又例如:a + b四则运算加: +减: -乘: *除: /取模(取余数):%首先计算得到表达式的结果,然后再打印输出这个结果复习一下小学一年级的除法公式:被除数 / 除数 = 商 …… 余数对于一个整数的表达式来说,除法用的式整除,整数除以整数,结果还是整数。只看商,不看余数之对于除法来说,取模运算符才有意义注意事项:1. 一旦运算中有不同类型的数据,那么结果将会是数据类型范围大的那种。*/public class Demo04peralor{public static void main(String[] args){// 两个常量之间可以进行数学运算System.out.println(7 + 5);// 两个变量之间可以也进行数学运算int a = 10, b = 20;System.out.println(a - b);// 常量与变量之间可以混合运算System.out.println(a * 5);System.out.println(7 / 5); // 1System.out.println(5 / 7); // 0System.out.println(7 % 5); // 2System.out.println(5 % 7); // 5System.out.println(7.0 / 5.0); // 1.4System.out.println(5.0 / 7.0); // 0.7142857142857143System.out.println(7.0 % 5.0); // 2.0 余数由整型变为浮点型System.out.println(5.0 % 7.0); // 5.0 余数由整型变为浮点型// int + double --> double + double --> doubleSystem.out.println(7 + 5.0);double result1 = a + 2.5;System.out.println(result1);// b = a + 1.2; //当运算中含有多种数据类型时,需注意结果变量的数据// System.out.println(b);}}
加法多种用法
/*四则运算当中的“+”有常见的三种用法:1,对于数值来说,是加法2,对于字符char来说,在计算之前,char会被提升成为int,然后计算char类型字符,和int类型字符,之间的对照关系表:ASSCII,Unicode3,对于字符串String(首字母大写,并不是关键字)来说,加号代表字符串连接操作任何数据类型和字符串进行连接的时候,结果都会变成字符串*/public class Demo05Plus {public static void main(String[] args){// 字符串类型的变量的基本使用// 数据类型 变量名称 = 数据值String String = "Hello";System.out.println(String); // String 不是关键字String str1 = "Hello";System.out.println(str1); // HelloString str2 = "java";// String + int --> StringSystem.out.println(str2 + 20); // java20// 优先级问题// String + int + int// String + int// StringSystem.out.println(str2 + 20 + 30); // java2030System.out.println(str2 + (20 + 30)); // java50}}
自增自减
/*自增运算符:++自减运算符:--基本含义:让一个变量涨一个数值1,或者让一个变量降一个数值1使用格式:写在变量名称之前,或者之后。例如:++num,也可以num++使用方式:1,单独使用:不与其他任何操作混搭,自己独立成为一个步骤2,混合使用:和其他操作混搭,例如与赋值混搭,或者与打印操作混搭,等使用区别:1,在单独使用时,前++与后++没有任何区别。也就是:++num;和num++;是完全一样的2,在混合使用时,有【重大区别】A,如果是【前++】,那么【立刻马上+1】,然后拿着结果进行使用。 【先加后用】B,如果是【后++】,那么首先使用变量本来的值,【然后再让变量+1】 【先用后加】注意事项:只有变量才能使用自增,自减运算符,常量不可发生改变,所以不能用*/public class Demo06perator{public static void main(String[] args) {// 单独使用int num1 = 10;System.out.println(num1);System.out.println(num1); // 10++num1; // 单独使用 前++System.out.println(num1); // 11num1++; // 单独使用 后++System.out.println(num1); // 12System.out.println("================");// 与打印操作混合使用时int num2 = 20;// 混合使用,前++,变量立刻马上变成21,然后打印结果21System.out.println(++num2); // 21System.out.println(num2); // 21System.out.println("================");int num3 = 30;// 混合使用,后++,首先使用变量原本的30,然后再让变量+1得到31System.out.println(num3++); // 30System.out.println(num3); // 31System.out.println("=================");// 和赋值操作混合int num4 = 40;// 混合使用,前--,变量立刻马上-1变成39,然后将结果39交给result1变量int result1 = --num4;System.out.println(result1);System.out.println(num4);System.out.println("==================");int num5 = 50;// 混合使用,后--,首先把本来的数字50交给result2,然后自己再-1变成49int result2 = num5--;System.out.println(result2);System.out.println(num5);System.out.println("=================");int x = 10;int y = 20;// 11 * 20 + 11 - 18int result3 = ++x * y-- + x++ - --y; //213System.out.println(result3);System.out.println(x); // 12System.out.println(y); // 18// 60++; // 语法错误!常量不可以使用++或--}}
2.2赋值运算符
/*赋值运算符分为:基本运算符:就是等号 ”=“,代表将右侧的数据交给左侧的变量int a = 10;复合赋值运算符:+= a += 5 相当于 a = a + 5-= b -= 6 相当于 b = b - 6*= c *= 7 相当于 c = c * 7/= d /= 8 相当于 d = d / 8%= e %= 9 相当于 e = e % 9注意事项:1,只有变量才能使用赋值运算符,常量不能进行赋值2,复合赋值运算其中隐含了一个强制类型转换*/public class Demo07perator{public static void main(String[] args){int a = 10;// 按照公式进行翻译:a = a + 5// a = 10 + 5// a = 15// a本来是10,现在重新赋值得到15a += 5;System.out.println(a); // 15int b = 10;// // 按照公式进行翻译:b = b + 5// b = 10 % 3// b = 1// a本来是10,现在重新赋值得到1b %= 3;System.out.println(b);// 50 = 30 // 常量不能进行赋值byte c = 100;// c = c + 5// c = byte + int// c = int + int// c = int// c = (byte) intc += 30;System.out.println(c); // -126 出错了,因为发生了强制类型转换}}
2.3比较运算符
/*比较运算符大于: >小于: <大于等于: >=小于等于: <=相等: == 【两个等号连写,才是相等,一个等号是赋值】不相等: !=注意事项:1,比较运算符的结果一定是一个boolean值,成立就是true,不成立就是false2,如果进行多次判断不能连着写数学中的写法:例如:1 < x < 3Java程序中【不允许】这种写法*/public class Demo08perator{public static void main(String[] args){System.out.println(10 > 5); // trueint num1 = 10;int num2 = 20;System.out.println(num1 > num2); // flaseSystem.out.println(num1 >= 5); // trueSystem.out.println(num2 <= 11); // flaseSystem.out.println(num1 >= 20); // trueSystem.out.println("====================");System.out.println(10 == 10); // trueSystem.out.println(10 != 5); // trueSystem.out.println(10 != 10); // flaseint x = 2;// System.out.println(1 < x < 3); // 错误写法,编译报错,不能连着写}}
2.4逻辑运算符
/*逻辑运算符:与 (并且) && 全真则真,有假则假或 (或者) || 有真则真,全假则假非 (取反) ! 是真则假,是假则真与"&&", 或"||",具有短路效果,如果根据左边已经可以判断得到最终结果,那么右边的代码将不会执行,从而节省一定的性能注意事项:1,逻辑运算符只能用于boolean值2,与、或需要左右各自有一个boolean值,但是取反只要有唯一的一个boolean值即可3,与、或两种运算符,如果有多个条件,可以连续写两个条件:条件A && 条件B多个条件:条件A && 条件B && 条件CTIPS:对于1 < x < 3的情况应该拆成两个部分,然后使用与运算符连接起来int x = 21 < x && x < 3*/public class Demo09Logio{public static void main(String[] args){System.out.println(true && true); // trueSystem.out.println(true && false); // falseSystem.out.println(false && false); // falseSystem.out.println("=========================");System.out.println(true || true); // trueSystem.out.println(true || false); // trueSystem.out.println(false || false); // falseSystem.out.println("=========================");System.out.println(true); // trueSystem.out.println(!true); // falseSystem.out.println("=========================");int a = 10;// false && ...System.out.println(3 > 4 && a++ < 100); // falseSystem.out.println(a); // 10,触发短路,a++没有执行System.out.println("=========================");int b = 20;// true || ...System.out.println(5 > 3 || b++ < 100); // trueSystem.out.println(b); // 20,触发短路,b++没有执行}}
2.5三元运算符
/*一元运算符:只需要一个数据就可以进行操作的运算符。例如;取反!、自增++、自减--二元运算符:需要两个数据才可以进行操作的运算。例如:加法+、减法-、赋值=三元运算符:需要三个数据才可以进行运算的运算符格式:数据类型 变量名称 = 条件判断 ? 表达式A : 表达式B;流程:首先判读条件是否成立:如果成立 为true,那么将表达式A的值赋给左侧的变量如果不成立 weifalse,那么将表达式B的值赋给左侧的变量二者选其一注意事项:1,必须同时保证表达式A和表达式B都符合左侧的变量的数据类型的要求2,三元运算符的结果必须被使用*/public class Demo10Operato{public static void main(String[] args){int a = 10, b = 20;// 数据类型 变量名称 = 条件判断 ? 表达式A : 表达式B;// 判断a > b是否成立,如果成立将a的值赋给max;如果不成立将bde值赋给max。二者选其一int max = a > b ? a : b; // 最大值 maxSystem.out.println("最大值:" + max); //20// int result = 3 > 4 ? 2.5 : 11; //错误写法!System.out.println(a > b ? a : b); // 正确写法!// a > b ? a : b; // 错误写法!System.out.println("===========");int x = 10;// 100 > 1 成立,将表达式A 100 赋给y,表达式B没有执行,x的值不变int y = 100 > 1 ? 100 : ++x;System.out.println(x); // 100System.out.println(y); // 10}}
第三章方法入门
3.1概述
方法:
就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。 当我们需要这个功能的时候,就可以去调用。这样即实现了代码的复用性,也解决了代码冗余的现象。
3.2方法的定义

3.3方法的调用

3.4调用练习
3.5注意事项
- 方法定义注意事项:
- 方法必须定义在一类中方法外
- 方法不能定义在另一个方法的里面
/*定义一个方法的格式:public static void 方法名称() {方法体;}方法的命名规则采用小驼峰式方法体:也就是大括号中包含的任意条语句注意事项:1,方法定义的先后顺序无所谓2,方法的定义不能产生嵌套包含关系3,方法在定义后,不会执行,如果想要执行,一定要进行方法的【调用】。如何调用方法,格式:方法名称();*/public class Demo11Method{public static void main(String[] args){farmer(); // 调用农民的方法seller(); // 调用小商贩的方法cook(); // 调用厨师的方法me(); // 调用我自己的方法}// 厨师public static void cook() {System.out.println("洗菜");System.out.println("切菜");System.out.println("炒菜");System.out.println("装盘");/*public static void me() {System.out.println("吃");} 错误写法,方法的定义不能嵌套*/}// 我public static void me() {System.out.println("吃");}// 小商贩public static void seller() {System.out.println("运输到农贸市场");System.out.println("抬高价格");System.out.println("吆喝");System.out.println("卖给厨师");}// 农民public static void farmer() {System.out.println("播种");System.out.println("浇水");System.out.println("施肥");System.out.println("除虫");System.out.println("收割");System.out.println("卖给小商贩");}}
第四章JShell脚本工具
JShell脚本工具是JDK9的新特性
第五章扩展知识点
5.1+=符号的扩展
5.2常量和变量的运算
/*在给变量赋值时,如果右侧表达式中都是常量,没有任何变量那么编译器javac将会直接将若干个常量表达式结算得到结果short result = 5 + 8; // 等号左边全是常量,没有任何变量编译之后,得到的.class字节码文件当中相当于【直接就是】:short result = 13;右侧常量结果数值没有超过左侧范围,所以正确这称为"编译器的常量优化"。但是注意:一旦表达式中有变量参加,那么就不能进行这种优化*/public class Demo13Notice {puvlic ststic void main(String[] args) {short num1 = 10; // 正确写法,右侧没有超过左侧范围short a = 5;short b = 8;// short + short --> int + int --> int// short result = a + b; // 错误写法!左侧需要是int类型// 右侧不用变量,而是采用常量,而且只有两个常量,没有别人short result = 5 + 8;Systrm.out.println(result);// short result1 = 5 + a + 8; // 不全是常量会报错}}
2,
/*对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过左侧范围那么java编译器就会自动隐含的为我们补上一个(byte)(short)(char)1,如果没有超过左侧范围,编译器会补上强转2,如果超出范围,编译器会直接报错*/public class Demo12Notice{public static void main(String[] args){// 右侧是一个int范围数字,但没有超出左侧范围,是正确的byte num1 = /*(byte)由编译器补上*/30; // 右侧没有超出左侧范围System.out.println(num1); // 30// byte num2 = 128; // 右侧超出左侧范围,报错// int --> char, 没有超出范围// 编译器会自动补上一个隐含的(char)char zifu = /*(char)*/ 65;System.out.println(zifu); //A}}
