标识符,不能数字开头,区分大小写
命名建议:
类、接口等命名标识符——大驼峰命名法
变量、方法的命名标识符——小驼峰命名法
常量的命名标识符——全部大写,多个单词之间用下划线(_)隔开
数据类型 | 关键字 | 字节长度 | 取值范围 |
---|---|---|---|
整数类型 | byte | 1 | -128 到 127 |
short | 2 | -32768 到 32767 | |
int(默认) | 4 | -2^31 到 2^31-1 | |
long | 8 | -2^63 到 2^63-1 | |
浮点类型 | float | 4 | -3.403E38 到 3.404E38(有效位数7-8位) |
double(默认) | 8 | -1.798E308 到 1.798E308(有效数字16-17位) | |
字符类型 | char | 2 | 0 到 65535 |
布尔类型 | boolean | 1 | true,false |
注意:根据JVM规范,在内存中boolean当作int处理,占4个字节,boolean数组当成byte数组处理,一个boolean元素占1个字节
//强制转换的语法:目标数据类型 变量名 = (目标数据类型)(被转换的变量变量名); int a = 10; byte m = (byte)a; //注意:在进行计算时,byte会先转换为int再计算 byte a = 3; byte b = 4; byte c = a + b; //报错 byte c = (byte)a + (byte)b; //报错 byte c = (byte)(a+b); //正确写法
在给一个变量赋值的时候,如果“=”的右边全部是常量那么在编译阶段会把右边的结果赋值给左边的变量;
如果范围不超过左边的变量类型的范围(或者说属于左边的范围)那么就会赋值成功如果超过就会赋值失败;
右边如果存在变量,则不会触发常量优化机制。
//编译时,会将3+4计算出结果,并且会自动判断该结果是否在类型取值范围内。在则编译成功,不在则编译失败 byte num = 3 + 4; //整数默认为int,如果超过int,则需要加L long num = 123456789123456789L; //小数形式默认为double,加后缀可以更改为float float num = 58.0F;
四则运算:+,-,*,/ 取余:%
//整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。 System.out.println(10 / 3); // 输出结果为3 System.out.println(10 /3.0); // 输出结果为3.333...
字符与字符串的"+"操作
字符:做加法操作时,是其对应的ASCII码增加,从而改变字符
字符串:做加法操作时,不是算数运算,而是字符串之间做拼接操作
自增自减 ++,--
如果放在变量的后边,先拿变量参与操作,再拿变量做++或者--。
如果放在变量的前边,先拿变量做++或者--,再拿变量参与操作。
int x = 10; int y = x++; System.out.println("x:" + x + ", y:" + y); // x:11,y:10 int m = 10; int n = ++m; System.out.println("m:" + m + ", n:" + n); // m:11,n:11
基本赋值运算符:=
扩展赋值运算符(自带强转类型的功能):+=,-=,*=,/=,%=
short s = 1; s = s + 1 //会报错,因为运算中s提升为int类型,运算结果int赋值给short可能损失精度 s += 1 //不报错,因为隐含了强制类型转换,相当于 s = (short) (s + 10);
普通逻辑运算符:&(与),|(或),!(非),^(异或)
与:当且仅当两个操作数都为真,条件才为真。
或:如果任何两个操作数任何一个为真,条件为真。
非:true时为false,false时为true。
异或:相同时为false,不同时为true。
短路逻辑运算符:&&,||
短路时,若第一个表达式已经能够决定表达式的值了,后面就都不算了
if (条件语句){…} if (条件语句){…} else {…} if (条件语句){…} else if (条件语句){…}else{…}
switch(表达式){ case 值1: 语句块1; break; … case 值n: 语句块n; break; default: 语句块n+1; break; //所有值都不匹配则执行default语句体部分 }
//需要注意的是:如果switch语句中,case省略了break语句, 就会开始case穿透. //当开始case穿透,后续的case就不会具有匹配效果,内部的语句都会执行 //直到看见break,或者将整体switch语句执行完毕,才会结束。 switch(week){ case 1: case 2: case 3: case 4: case 5: System.out.println("工作日"); break; case 6: case 7: System.out.println("休息日"); break; default: System.out.println("您的输入有误"); break; }
//1.先执行初始化语句, //2.再执行条件判断语句, //3.如果是false,则循环结束,如果是true,则执行循环体语句,再执行循环控制语句,最后回到第2步继续循环 for(初始化语句 ; 条件判断语句(布尔表达式); 循环控制语句) { //循环体语句 }
//1.先执行初始化语句, //2.再执行条件判断语句, //3.如果是false,则循环结束,如果是true,则执行循环体语句,再回到第2步继续循环 初始化语句; while(条件判断语句){ 循环体语句; (循环控制语句) }
//1.先执行初始化语句,再执行循环体语句 //2.再执行条件判断语句, //3.如果是false,则循环结束,如果是true,则执行循环体语句,再回到第2步继续循环 初始化语句; do{ 循环体语句; (循环控制语句) } while(条件判断语句);
break
中断当前循环
continue
结束本次循环
return
结束方法,并返回一定内容
格式一
数据类型[] 数组名;
格式二
数据类型 数组名[];
注意:
- 第一种格式具有更好的可读性
- 可以直观的看到这个数组是一个什么数据类型的数组
- 第二种格式,是Java沿袭自C语言的一种声明方式
- 像C#这种和Java同源的设计语言,已经取消了数组的第二种声明格式
- 不排除后期Java也会取消这一声明格式
- 所以严格来说,在Java当中定义数组,都应该使用第一种格式
格式一
数据类型[][] 二维数组名;
格式二
数据类型 二维数组名[][];(废弃,不要使用)
格式三(奇怪的写法)
数据类型[] 二维数组名[];(废弃,不要使用)
静态初始化:指定数组中每个元素的初始值,数组的长度由系统决定
int[] arr1 = new int[]{1,2,3}; int[] arr2 = {1,2,3}; //简化的形式必须跟在声明之后,不能后续赋值使用 int[][] arr3 = new int[][]{{1,2,3},{4,5,6},{7,8,9}}; int[][] arr3 = {{1,2,3},{4,5,6},{7,8,9}};
动态初始化:只是指定数组的长度,数组中每个元素的初始值由系统决定
int[] arr = new int[3]; int[][] arr2 = new int[3][3]; //1.没有直接给出一维数组的长度,可以动态给出 //2.该形式定义的二维数组,还需要手动初始化二维数组中的每一个一维数组,并且手动初始化一维数组时,不能使用简化版的一维数组静态初始化 int[][] arr2 = new int[3][];
for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]) } for (int a : arr) { System.out.print(a); }
[修饰符列表] 返回值类型 方法名 (形式参数列表){ //方法体 } //没有返回值类型时,使用void
定义:一个类中存在多个方法名相同,但是形参列表不同的方法,它们就构成方法的重载,
所以,尽管他们方法名相同,但是它们表示不同的方法
需要注意的是:形参的名字不同,返回值类型不同,修饰符列表不同都无法构成方法的重载
public static int sum(int a,int b,int... arr) { //arr为可变参数 return a + b; }
我们把方法在运行时调用自身的情况,称之为递归,又叫做递归调用
注意事项
优点