1.1 基本格式
所有Java代码都应该在一个class中。
Java是严格区分大小写的。
Java是一种自由格式的语言。
Java代码分为结构定义语句和功能执行语句,结构定义语句以大括号结束,功能执行语句最后必须以分号结束
1.2 注释
单行注释和多行注释是在程序用来标记一些特殊的文本,这些文本不参与编译运行。
单行注释: // 注释内容
多行注释: /* 注释内容
文档注释是Java中特有的一种注释,它可以通过JDK中的工具(javadoc.exe)解析,生成帮助文档。
文档注释: /** 注释内容 */
1.3 标识符
Ø 什么是标识符
标识符可以理解为程序中我们自定义的一些名字,包括:包名、类名、函数名、变量名、常量名。
Ø 标识符的命名规则
由大小写字母、数字、下划线(_)和美元符号($)组成,开头不能是数字。不能使用关键字。推荐使用全英文。
Ø 标识符通用规范
类名、接口名:
所有单词首字母大写,驼峰式命名,例如:XxxYyyZzz
变量名、函数名:
第一个单词首字母小写,其他单词首字母大写,驼峰式命名,例如:xxxYyyZzz
常量名:
所有字母都大写,单词之间用下划线分割,例如:XXX_YYY_ZZZ
包名:
全部小写,例如:xxx.yyy.zzz
1.4 关键字
catch | ||||
short | ||||
throws | ||||
注:java 无sizeof ,goto, const 关键字,但不能用goto const作为变量名
1.5 变量(variable)
int x = 5;
System.out.println(x);
x = 1 + 1;
System.out.println(x);
x = x + 1;
System.out.println(x);
上面的x就是一个变量,变量没有固定的值,是在内存中开辟的一片空间。
Java中的变量中只能存储同一种类型的值。
变量在被取值之前必须初始化(第一次给变量赋值)。
Ø 变量分类
a.基本数据类型: 8种
整数:
byte 1个字节,最小值:-128,最大值:127
short 2个字节,最小值:-32768,最大值:32767
int 4个字节,最小值:-2147483648,最大值:2147483647
long 8个字节,最小值:-
浮点数:
float 4个字节,最小值:1.4E-45,最大值:3.4028235E38
double 8个字节,最小值:4.9E-324,最大值:1.7976931348623157E308
字符:
char 2个字节,最小值:0,最大值:65535
布尔:
boolean 1个字节,true或false
b.引用数据类型:
类、接口、数组都是引用数据类型,除了8种基本数据类型,其他所有类型都是引用数据类型。
Ø 类型转化
a. 自动类型转换
在byte、short、char参与运算的时候会自动提升为int,相当于将一个占空间较小的值放入了一个较大的空间。
b. 强制类型转换
可以将一个占空间较大的值使用(类型)的形式强制放入一个较小的空间,有可能损失精度。
c. 字符串转换
任何值和字符串相加都会得到字符串。
Ø 变量的作用域与生命周期
作用域:变量定义在哪一级大括号中,哪个大括号的范围就是这个变量的作用域。相同的作用域中不能定义两个同名变量。
生命周期:变量的生命周期从定义时开始,超出作用域后结束。变量生命周期以外不能使用。
1.6 常量(Constant)
Ø 常量代表程序运行过程中不能改变的值。
Ø 用途
常量在程序运行过程中主要有2个作用:
圆周率的值)
常量UP、DOWN、LEFT和RIGHT分辨代表上下左右,其数值分别是1、2、3 和4)
Ø 格式
常量的语法格式和变量类型:只需要在变量的语法格式前面添加关键字final即可。
在Java编码规范中,要求常量名必须全部大写。
则常量的语法格式如下:
final 数据类型 常量名称 = 值;
final 数据类型 常量名称1 = 值1, 常量名称2 = 值2,……常量名称n = 值n;
例如:
final double PI = 3.14;
final char MALE=‘M’,FEMALE=‘F’;
在Java语法中,常量也可以首先声明,然后再进行赋值,但是只能赋值一次,示例代码如下:
final int UP;
UP = 1;
1.7 运算符
Ø 算数运算符
加号:在操作数字、字符、字符串时是不同的,两个字符相加得到的是码表值,两个字符串相加是将字符串连接在一起。
除号:整数在使用除号操作时,得到的结果仍为整数(小数部分忽略)。
取模:模数(%右边的数)的符号忽略不计,结果的正负取决于被模数(%左边的数)。
自增:符号在前就是先运算后取值,符号在后则是先取值后运算。
Ø 赋值运算符
等于:可以多个连用,例如:x = y = z = 5;
加等于:x += 5; 相当于 x = x + 5;
面试题:
以下代码正确的是? (多选)
a. byte b = 1 + 1;
b. byte b = 1; b = b + 1;
c. byte b = 1; b = b += 1;
d. byte b = 1; b = ++b;
Ø 比较运算符
比较运算符会将运算符左右两边的值进行比较,运行结束之后返回的都是boolean值。
注意运算符==不要写成=
Ø 逻辑运算符
逻辑运算符操作的都是布尔值,运行结束之后返回的也是boolean值
& 两边都为true结果才为true,只要有一边是false,结果就是false
| 两边都为false结果才为false,只要有一边是true,结果就是true
^ 判断两边是否不同,不同则为true,相同则为false
! 取反,!true结果是false,!fasle结果是true
&& 和&结果相同,具有短路效果,如果前半是false,表达式结果一定为false,不运行后一半
|| 和|结果相同,具有短路效果,如果前半是true,表达式结果一定为true,不运行后一半
分析以下程序运行结果:
int x = 1;
int y = 2;
System.out.println(x++ == y & ++x > y++);
System.out.println(x);
System.out.println(y);
int x = 1;
int y = 2;
System.out.println(x++ == y && ++x > y++);
System.out.println(x);
System.out.println(y);
int x = 1;
int y = 2;
System.out.println(x++ == y | ++x > y++);
System.out.println(x);
System.out.println(y);
int x = 1;
int y = 2;
System.out.println(x++ == y || ++x > y++);
System.out.println(x);
System.out.println(y);
&& 在前半是false的时候短路
|| 在前半是true的时候短路
Ø 位运算符
任何信息在计算机中都是以二进制的形式保存的,&、|、^除了可以作为逻辑运算符,也可以做为位算符。
它们对两个操作数中的每一个二进制位都进行运算,0当做false,1当做true。
& 将两个二进制数每一位进行与运算,两边都为1结果才为1,只要有一边是0,结果就为0。
| 将两个二进制数每一位进行或运算,两边都为0结果才为0,只要有一边是1,结果就为1。
^ 将两个二进制数每一位进行异或运算,只要两边不同结果就为1,相同则为0。
我们可以对数据按二进制位进行移位操作,java的移位运算符有三种:
<< 左移 将二进制的每一位向左移,低位补0。左移几位就相当于乘以2的几次方。
>> 右移 将二进制的每一位向右移,原来高位是0就补0,原来高位是1就补1。右移几位就相当于除以2的几次方。
>>> 无无符号右移 将二进制的每一位向右移,高位补0。正数移动没区别,负数移动后变为正数。
Ø 三元运算符
语法:表达式 ? 结果1 : 结果2
如果表达式结尾为true取结果1,为false则取结果2。
注意三元运算符也是有短路的效果,根据表达式的结果,只运行冒号一边的,另外一边的不参与运行。
练习:
定义一个函数,接收三个int参数,返回最大的一个。
Ø 运算符优先级
思考一下代码运行结果:
System.out.println(1 + 2 * 3);
System.out.println(false && true || true);
System.out.println(true || true && false);
int a = 2;
int b = a + 3 * a++;
System.out.println(b);
int a = 2;
int b = a++ + 3 * a;
System.out.println(b);
int a = 1;
int b = 2;
System.out.println(a+++b);
尽量写简单的表达式,遇到运算符优先级的问题使用括号解决。
1.8 语句
Ø 顺序结构
顾名思义,就是程序从上到下一行一行执行的结构,中间没有判断和跳转,直到程序结束。
Ø 选择结构
程序具备多个分支,通过条件判断决定程序选择那一条分支执行
a. if语句:
通过if...else if...else决定程序流程。
如果if中的条件满足则执行其中语句,if未满足则继续判断else if,如果满足则执行,不满足继续判断下一个else if,如果所有都不满足,则执行else。
练习:
用if else语句判断一个数是奇数还是偶数。
。
b. switch语句:
通过switch...case...default语句控制程序流程。
根据switch后括号中的值判断运行哪一个case,这个值可以是byte、short、char、int、String、enum
default语句是可选的,如果所有case都不满足,则会执行default。
一旦匹配到一个case,程序就会从这个case向下执行,执行完一个case之后不会跳过其他的case,如需跳过请使用break。
Ø 循环结构
通过循环条件控制同一段代码反复执行多次,执行完毕程序才会继续往后运行
a. while
先判断while中的表达式结果是否为true,true则执行循环体,执行结束之后再次判断,如果表达式结果为false则跳出循环。
练习:
打印出0-9
打印出a-z
b. do...while
先执行一次循环体,然后判断while中的表达式,如果是true继续执行,如果是false则跳出循环。
练习:
编写一个程序,这个程序不断地读取键盘上输入的字符,直到读到字符’q’时,程序结束。
c. for
for循环的括号中有三条语句,都是可选项。
语句1:这条语句会在整个循环开始之前执行,且仅运行一次,不参与循环。
语句2:必须是一个返回boolean值的表达式,如果写了这个语句那么每次循环开始之前会判断,true则执行循环,false则不执行。没写则直接执行。
语句3:这条语句在每次循环体运行结束之后执行。
练习:
使用星号打印如下图案
*****
*****
*****
*****
*****
i *
* 0 1
** 1 2
*** 2 3
**** 3 4
***** 4 5
i 空格 *
* 0 4 1
*** 1 3 3
***** 2 2 5
******* 3 1 7
********* 4 0 9
d. continue、break、return
continue:跳过一次循环,继续执行下一次
break:结束循环
return:结束方法
1.9 函数(方法)
Ø 函数的定义
函数就是一段有名字的代码,可以完成某一特定功能。
如果有一段代码要使用多次,我们可以给它起个名字,每次使用时通过名字调用,这样就不用每次都写一大段代码了。
如果某个函数在执行的时候需要调用者传入数据,那么可以定义参数列表,用于接收数据。
如果函数运行之后需要返回给调用者数据,那么需要指定返回值类型,并且用关键字return返回。
定义函数的3个必要条件:返回值类型、函数名、参数列表。如果不需要参数也要写小括号,如果没有返回值类型要写void。
Ø 名词解释
形参:在定义函数时小括号中的参数,用来接收数据的参数。
实参:在调用函数时真正传入的参数,传递给函数的数据。
参数类型:函数的参数的类型,一旦定义传入时必须匹配。
返回值:函数运行结束后返回的值,使用return关键字返回。
返回值类型:函数运行结束后返回的值的类型,在类型非void情况下必须返回,而且必须类型匹配。
Ø 函数的重载
多个函数的函数名相同,参数列表不同(个数、顺序、类型),这就是函数的重载。在调用函数的时候通过传入的实参找到匹配的函数调用。
函数的重载和返回值类型无关。
2.0 数组
Ø 什么是数组
数组是一个类型一致,长度不可变的容器。可以通过索引操作容器中的每一个元素。
如果有多个类型相同的数据需要存储,我们就可以将其定义为一个数组,这样做省去了创建多个变量的麻烦。
Ø 如何定义数组
int[] arr = {1,2,3};
定义int数组arr,长度为3,其中3个元素分别为1、2、3。这种方式只能在给数组类型变量赋值时使用。
int[] arr = new int[]{1,2,3};
定义int数组arr,长度为3,其中3个元素分别为1、2、3。可以在任何情况使用。
int[] arr = new int[3];
定义int数组arr,长度为3。其中所有元素都为默认值0。
Ø 访问数组元素、遍历数组
存在数组中的数据是有索引的,从0开始递增,我们通过数组名和索引就可以操作其中每一个元素。例如:
System.out.println(arr[0]); // 打印数组中索引为0的元素
给数组中索引为1的元素赋值为100
数组的长度
数组可以使用length属性获取其长度。
遍历数组
由于数组可以通过索引获取每一个元素,又可以通过length获取长度,那么我们就可以定义循环来遍历数组中的每一个元素了。
Ø 使用数组时的异常
如果访问数组时索引越界(小于0或者大于length-1),会抛出异常:ArrayIndexOutOfBoundsExcepion
如果访问数组的引用为空(null),会抛出空指针异常:NullPointerException
Ø 数组练习
a. 定义一个函数,将数组中所有元素打印。要求打印成一行,每个元素之间以逗号分隔。
b. 定义一个函数,交换数组中的两个元素。
c. 定义一个函数,找出数组中的最大数。
d. 定义一个函数,将数组中所有元素反转。例如:{1, 2, 3} 反转后为 {3, 2, 1}。
e. 定义一个函数,对数组进行排序。
f. 定义一个函数,对数组进行二分法查找。
Ø 与数组操作相关函数
Arrays.toString() 查找帮助文档Arrays类,学习使用此方法将数组转为字符串形式输出。
将一个数组转为字符串表示形式
System.arraycopy() 查找帮助文档System类,学习使用此方法拷贝数组中元素。
将一个数组中的某些元素拷贝到另一个数组的指定位置
Ø 多维数组
数组中的每一个元素都是数组,这样的数组就是多维数组。
int[][] arr = { { 1, 2, 3 }, { 4, 5 }, { 6, 7, 8, 9 } };
定义二维数组arr, 其中有三个元素都是数组, 第一个数组3个元素, 第二个2个元素, 第三个4个元素.
int[][] arr = new int[][] { { 1, 2, 3 }, { 4, 5 }, { 6, 7, 8, 9 } };
定义二维数组arr, 其中有三个元素都是数组, 第一个数组3个元素, 第二个2个元素, 第三个4个元素.
int[][] arr = new int[3][3];
定义二维数组arr, 其中有三个元素都是数组, 每个小数组都是3个元素.
int[][] arr = new int[3][];
定义二维数组arr, 其中有三个元素都是数组, 每个小数组元素个数不确定.