一.关键字定义被java语言赋予特殊含义用做专门用途的字符串或单词特点全部关键字都是小写字母。例如HelloWorld案例中出现的关键字有class、public、static、void等这些单词已经被Java定义好了。二.标识符定义java中变量/方法/类等要素命名使用的字符串序列称为标识符。技巧凡是自己可以起名字的地方都叫标识符。比如类名、常量、包名、变量名、方法名等命名规则1、由24个英文字母组成可以由0-9数字也可由_或者这两个特殊符号其他的符号不行2.单数字不能作为开头3.java严格区分大小写长度没有限制4.标识符号中不包含空格命名规范建议遵守1.包名多单词时后所有小写。例如java.lang、com.atguigu.bean2.类名、接口名多单词的时候所有单词首字母大写例如HelloWorldStringSystem等3.变量名、方法名多单词的时候第一单词首字母小写后面的单词首字母大写例如bookName,main,binarySearch,getName4.常量名所有单词都大写。 例如MAX_VALUE,PI,DEFAULT_CAPACITY三、变量1.变量的概念内存中的一个存储区域该区域的数据可以在同一类型范围内不断变化变量的构成包含三个要素数据类型、变量名、存储的值Java中变量声明的格式数据类型 变量名 变量值变量的作用用于在内存中保存数据。使用变量注意Java中每个变量必须先声明后使用。使用变量名来访问这块区域的数据。变量的作用域其定义所在的一对{ }内。变量只有在其作用域内才有效。出了作用域变量不可以再被调用。同一个作用域内不能定义重名的变量。2.变量的类型Java中分了两大类型基础数据类型8种整数类型int、long、byte.short浮点数类型:float/double字符类型:char布尔类型:buoolean引用数据类型类class、数组 array、接口 inteface枚举enum、注解annotation、记录record说明和补充Java各整数类型有固定的表数范围和字段长度不受具体操作系统的影响以保证Java程序的可移植性。3.基础数据类型注意事项1.定义long类型的变量赋值时需要以l或L作为后缀。2.一般在定义整型变量的过程时都是定义为int类型方便快捷除非是特殊情况才使用long类型补充计算机存储单位字节Byte是计算机用于计量存储容量的基本单位一个字节等于8 bit。位bit是数据存储的最小单位。二进制数系统中每个0或1就是一个位叫做bit比特其中8 bit 就称为一个字节(Byte)。转换关系8 bit 1 Byte1024 Byte 1 KB1024 KB 1 MB1024 MB 1 GB1024 GB 1 TB4.浮点型数据类型float/doublefloat单精度尾数可以精确到7位有效数字很多情况下精度很难满足需求。定义的时候要加上“f”或者“F”。double:双精度时lloat精度的两倍通常采用double。说明1.通常在定义浮点型数据类型的过程中通常使用double.2.浮点类型float、double的数据不适合在不容许舍入误差的金融计算领域。如果需要精确数字计算或保留指定位数的精度需要使用BigDecimal类。5.char字符类型常用的表示类型1.表示形式1使用单引号来表示例如char c1 a;char c2 1;char c3 3;2.表示形式2使用Unicode值来表示字符型常量‘\uXXXX’其中‘\u’就是特殊的表示方式XXXX代表一个十六进制整数。 例如‘\u0023 ’表示 #。3.表示形式3Java中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。通常有如下内容4.表示形式4使用具体的字符对应的数值。6.布尔类型booleanloolean类型用来判断逻辑条件一般用在流程控制语句中if条件控制、while循环控制、for循环控制、do-while循环控制语句中。注意boolean类型数据只有两个值true、false无其它。不可以使用0或非 0 的整数替代false和true这点和C语言不同。拓展Java虚拟机中没有任何供boolean值专用的字节码指令Java语言表达所操作的boolean值在编译之后都使用java虚拟机中的int数据类型来代替true用1表示false用0表示。——《java虚拟机规范 8版》我们不谈boolean类型占用的空间大小。但是真正在内存中分配的话使用的是4个字节。7.基础数据类型变量间运算规则转换的方式自动型提升和强制类型转换。自动类型提升规则将取值范围小或者容量小的类型自动提升为取值范围大或者容量大的类型。char.byte.shortintlong float double在平时输出的时候如何出现L2123的情况没有报错是因为将123的int类型自动提升了但如何超出int的范围就会报错比如L41234548345313543131就会报错只要加上l就没问题这是运算规律的体现。体现在小的数值往大的数值方面提升但是反过来是不行的。强制类型转换只有当高向低进行转化的时候使用但通常会造成精度损失、溢出等问题。数据类型1 变量名 (数据类型1)被强转数据值;//()中的数据类型必须变量值的数据类型例如下面的情况int i (int)3.14;//损失精度int i2 128; byte b1 (byte)i2; 使用System.out.println(b1);时候结果时-128这也是精度问题。double d 1.2;int num (int)d;//损失精度int i 200;byte b (byte)i;//溢出8.基础数据类型和String的运算字符串类型 StringString不是基础数据类型属于引用数据类型使用一对“”来表示一个字符串内部可以包含0个、1个或者多个字符。声明方式和基本数据类型类似类如String str “和尚出家了’;运算规则1、任意八种基本数据类型的数据与String类型只能进行连接“”运算且结果一定也是String类型如下System.out.println( 1 2);//12int num 10;boolean b1 true;String s1 abc;String s2 s1 num b1;System.out.println(s2);//abc10true//String s3 num b1 s1;//编译不通过因为int类型不能与boolean运算String s4 num (b1 s1);//编译通过2.String类型不能通过强制类型()转换转为其他的类型如下String str 123;int num (int)str;//错误的int num Integer.parseInt(str);//正确的后面才能讲到借助包装类的方法才能转9.计算机底层如何存储数据计算机世界中只有二进制所以计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。进制的分类十进制decimal数字组成0-9进位规则满十进一二进制binary数字组成0-1进位规则满二进一以0b或0B开头八进制octal很少使用数字组成0-7进位规则满八进一以数字0开头表示十六进制数字组成0-9a-f进位规则满十六进一以0x或0X开头表示。此处的 a-f 不区分大小写代码演示class BinaryTest {public static void main(String[] args) {int num1 123; //十进制int num2 0b101; //二进制int num3 0127; //八进制int num4 0x12aF; //十六进制System.out.println(num1);System.out.println(num2);System.out.println(num3);System.out.println(num4);}}二进制的由来二进制是计算技术中广泛采用的一种数制由德国数理哲学大师莱布尼茨于1679年发明。二进制数据是用0和1两个数码来表示的数。它的基数为2进位规则是“逢二进一”。二进制广泛应用于我们生活的方方面面。比如广泛使用的摩尔斯电码Morse Code它由两种基本信号组成短促的点信号“·”读“滴”保持一定时间的长信号“—”读“嗒”。然后组成了26个字母从而拼写出相应的单词。二进制如何表示整数计算机数据的存储使用二进制补码形式存储并且最高位是符号位。正数最高位是0负数最高位是1规 定正数的补码与反码、原码一样称为三码合一负数的补码与反码、原码不一样负数的原码把十进制转为二进制然后最高位设置为1负数的反码在原码的基础上最高位不变其余位取反0变1,1变0负数的补码反码1二进制转十进制权相加法针对于byte数据举例来说例如byte类型1个字节8位25 原码 0001 1001 反码 0001 1001 --补码 0001 1001-25 原码 1001 1001 反码1110 0110 补码 1110 0111歌进制间的转换10.运算符Operator掌握运算符是一种特殊的符号用于表示数据的运算、赋值、和比较等。运算符的分类按照功能划分算数运算符、赋值运算符、比较或关系运算符、逻辑运算符、位运算符、条件运算符、Lambda运算符。按照操作数个数分为一元运算符单目运算符、二元运算符双目运算符、三元运算符 三目运算符算符运算符基础语法1.加减乘除模2.“”号的两种用法第一种对于两边都是数值的话就是加法的意思第二种对于两边至少有一边是字符串的话就是拼接的意思3.自加自减运算理解运算表示自增1。同理--运算表示自减1用法与 一致。1、单独使用变量在单独运算的时候变量前和变量后是没有区别的。变量前例如a。变量后例如a。2、复合使用和其他变量放在一起使用或者和输出语句放在一起使用前和后就产生了不同。变量前变量先自增1然后再运算。变量后变量先运算然后再自增1。问下面的输出结果是什么int i 1;int j i i * i;System.out.println(j j);System.out.println(i i);答案是i4j10解析只要有了符号i就会加一不过是先后问题一共3个i就是4。至于j的运算可以这样表示j1111*21就是第一个i通过1和后面第二i他现在是3以为前面已经1了在*乘法运算前又1所以用3的数字参加运算同理double s25;s2(s25)*(s25);s2的数值就是155这样看510*15s2先用5参与第一个第二个就是10参与运算有括号先赋值第三个就是15105来的15.s2s25*s25;赋值运算符基础语法符号当“”两侧数据类型不一致时可以使用自动类型转换或使用强制类型转换原则进行处理。支持连续赋值扩展赋值运算符 、 -、*、 /、%例子public class SetValueTest1 {public static void main(String[] args) {int i1 10;long l1 i1; //自动类型转换byte bb1 (byte)i1; //强制类型转换int i2 i1;//连续赋值的测试//以前的写法int a1 10;int b1 10;//连续赋值的写法int a2,b2;a2 b2 10;int a3 10,b3 20; //这样写看起来更加高效//举例说明 - * / %int m1 10;m1 5; //类似于 m1 m1 5的操作但不等同于。System.out.println(m1);//15//练习1开发中如何实现一个变量2的操作呢// 的操作不会改变变量本身的数据类型。其他拓展的运算符也如此。//写法1推荐short s1 10;s1 2; //编译通过因为在得到int类型的结果后JVM自动完成一步强制类型转换将int类型强转成shortSystem.out.println(s1);//12//写法2short s2 10;//s2 s2 2;//编译报错因为将int类型的结果赋值给short类型的变量s时可能损失精度s2 (short)(s2 2);System.out.println(s2);//练习2开发中如何实现一个变量1的操作呢//写法1推荐int num1 10;num1;System.out.println(num1);//写法2int num2 10;num2 1;System.out.println(num2);//写法3int num3 10;num3 num3 1;System.out.println(num3);}}比较关系运算符说明比较运算符的结果都是boolean型也就是要么是true要么是false。 只适用于基本数据类型除boolean类型之外 ! 适用于基本数据类型和引用数据类型比较运算符“”不能误写成“”举例class CompareTest {public static void main(String[] args) {int i1 10;int i2 20;System.out.println(i1 i2);//falseSystem.out.println(i1 ! i2);//trueSystem.out.println(i1 i2);//falseint m 10;int n 20;System.out.println(m n);//falseSystem.out.println(m n);//20boolean b1 false;boolean b2 true;System.out.println(b1 b2);//falseSystem.out.println(b1 b2);//true}}逻辑运算符基本语法逻辑运算符操作的都是boolean类型的变量或常量而且运算得结果也是boolean类型的值。运算符说明 和 表示且关系当符号左右两边布尔值都是true时结果才能为true。否则为false。叫做逻辑与叫做短路与| 和 || 表示或关系当符号两边布尔值有一边为true时结果为true。当两边都为false时结果为false! 表示非关系当变量布尔值为true时结果为false。当变量布尔值为false时结果为true。^ 当符号左右两边布尔值不同时结果为true。当两边布尔值相同时结果为false。理解异或追求的是“异”逻辑运算符用于连接布尔型表达式在Java中不可以写成 3 x 6应该写成x 3 x 6 。区分“”和“”相同点如果符号左边是true则二者都执行符号右边的操作不同点 如果符号左边是false,则继续执行符号右边的操作 如果符号左边是false,则不再继续执行符号右边的操作建议开发中推荐使用 区分“|”和“||”相同点如果符号左边是false则二者都执行符号右边的操作不同点| 如果符号左边是true则继续执行符号右边的操作|| 如果符号左边是true则不再继续执行符号右边的操作建议开发中推荐使用 ||举例public class LoginTest {public static void main(String[] args) {int a 3;int b 4;int c 5;// 与且有false则falseSystem.out.println((a b) (a c));System.out.println((a b) (a c));System.out.println((a b) (a c));System.out.println((a b) (a c));System.out.println();// | 或有true则trueSystem.out.println((a b) | (a c));System.out.println((a b) | (a c));System.out.println((a b) | (a c));System.out.println((a b) | (a c));System.out.println();// ^ 异或相同为false不同为trueSystem.out.println((a b) ^ (a c));System.out.println((a b) ^ (a c));System.out.println((a b) ^ (a c));System.out.println((a b) ^ (a c));System.out.println();// ! 非非false则true非true则falseSystem.out.println(!false);System.out.println(!true);//和的区别System.out.println((a b) (a c));System.out.println(a a);System.out.println((a b) (a c));System.out.println(a a);System.out.println((a b) (a c));System.out.println(a a);//|和||的区别System.out.println((a b) | (a c));System.out.println(a a);System.out.println((a b) || (a c));System.out.println(a a);System.out.println((a b) || (a c));System.out.println(a a);}}位运算符基本语法位运算符的运算过程都是基于二进制的补码运算1左移运算规则在一定范围内数据每向左移动一位相当于原数据*2。正数、负数都适用【注意】当左移的位数n超过该数据类型的总位数时相当于左移n-总位数位2右移运算规则在一定范围内数据每向右移动一位相当于原数据/2。正数、负数都适用【注意】如果不能整除向下取整。3无符号右移运算规则往右移动后左边空出来的位直接补0。正数、负数都适用4按位与运算规则对应位都是1才为1否则为0。1 1 结果为11 0 结果为00 1 结果为00 0 结果为05按位或|运算规则对应位只要有1即为1否则为0。1 | 1 结果为11 | 0 结果为10 | 1 结果为10 0 结果为06按位异或^运算规则对应位一个为1一个为0才为1否则为0。1 ^ 1 结果为01 ^ 0 结果为10 ^ 1 结果为10 ^ 0 结果为07按位取反~运算规则对应位为1则结果为0对应位为0则结果为1。~0就是1~1就是0举例举例2体会 m k ^ n (m ^ n) ^ n案例1高效的方式计算2 * 8的值经典面试题答案2 3 、 8 1如何交换两个int型变量的值public class BitExer { public static void main(String[] args) { int m 10; int n 5; System.out.println(m m , n n); //推荐实现方式1优点容易理解适用于不同数据类型 缺点需要额外定义变量 //int temp m; //m n; //n temp; //实现方式2优点没有额外定义变量 缺点可能超出int的范围只能适用于数值类型 //m m n; //15 10 5 //n m - n;//10 15 - 5 //m m - n;//5 15 - 10 //实现方式3优点没有额外定义变量 缺点不易理解只能适用于数值类型 m m ^ n; n m ^ n; //(m ^ n) ^ n m m ^ n; System.out.println(m m , n n); } }条件预算符基础语法条件运算符格式 (条件表达式)? 表达式1:表达式2说明条件表达式是boolean类型的结果根据boolean的值选择表达式1或表达式2也就是结果需要什么条件就要设置什么类型的或者兼容的类型如double可以兼容int如果运算后的结果赋给新的变量要求表达式1和表达式2为同种或兼容的类型举例三个数中选出最大的数值public class ConditionExer2 { public static void main(String[] args) { int n1 23; int n2 13; int n3 33; int max; //写法1 max (n1 n2)? n1:n2; max (max n3)? max : n3; System.out.println(三个数中最大值为 max); //写法2不推荐可读性差 int finalMax1 (((n1 n2)? n1:n2) n3)? ((n1 n2)? n1:n2) : n3; System.out.println(三个数中最大值为 finalMax1); } }举例2今天是周510天以后是周几要求控制台输出今天是周510天以后是周x。public class ConditionExer3 { public static void main(String[] args) { int week 4; week 10; week % 7; System.out.println(今天是周4,10天以后是周 (week 0 ? 日 : week)); // 如果出现被整除的情况就会出现0的问题但我们知道如果是0那就是星期日也就是星期天 } }与if-else的转换关系凡是可以使用条件运算符的地方都可以改写为if-else结构。反之不成立。开发中如果既可以使用条件运算符又可以使用if-else推荐使用条件运算符。因为执行效率稍高。同样是选出三个数中最大的数值的问题写法如下public class Test7{ public static void main(String[] args) { int n123; int n2123; int n312312; int max; if(n1n2){ maxn1; } else{ maxn2; } if(maxn3){ System.out.println( 最大数是max); } else { maxn3; System.out.println( 最大数是max); } } }运算符优先级运算符有不同的优先级所谓优先级就是在表达式运算中的运算符顺序。上一行中的运算符总是优先于下一行的。优先级运算符说明Java运算符1括号()、[]、{}2正负号、-3单元运算符、--、~、4乘法、除法、求余*、/、%5加法、减法、-6移位运算符、、7关系运算符、、、、instanceof8等价运算符、!9按位与10按位异或^11按位或|12条件与13条件或||14三元运算符? :15赋值运算符、、-、*、/、%16位赋值运算符、|、、、开发建议不要过多的依赖运算的优先级来控制表达式的执行顺序这样可读性太差尽量使用()来控制表达式的执行顺序。不要把一个表达式写得过于复杂如果一个表达式过于复杂则把它分成几步来完成。例如 (num1 num2) * 2 num3 num2 num3 ? num3 : num1 num2;