JAVA 基础语法
一、java注释,标识符,关键字
1.1 注释
1.1.1 用法
- 对源代码的解释说明,不参与程序编译
- 做代码删减的调试
1.1.2 分类
-
单行注释 //注释内容
-
多行注释 /* 注释内容 */
-
文档注释
/**
*javaDoc生成说明文档
*/
1.2 标识符
1.2.1 概念
用来定义类,变量,包,方法,接口等的命名标识,目的是有一个名字
1.2.2 标识符的组成
- 英文的大写字母a-z A-Z
- 数字0-9
- 符号 _ 与 $
1.2.3 命名规则
- 不能以数字开头
- 不可以使用关键字
- 严格区分大小写
- 驼峰命名法
- 定义类(首字母大写,驼峰原则) 定义包(全小写) 定义方法(首字母小写,驼峰原则) 常量(全大写,加下划线 使用final修饰 不能重写赋值)
1.2.4 深入变量
变量的语法定义:
数据类型 变量名 = 值;
根据位置不同,分为两大类:
- 成员变量(全局变量)
- 类成员变量(
类名.字段名
调用)- 生命周期:从类加载到程序结束
- 使用static修饰的,直接定义到类里面的
- 实例成员变量
- 声明周期:从创建对象开始到GC垃圾回收器回收垃圾结束
- 直接定义到类里面
- 类成员变量(
- 局部变量
- 生命周期:从变量定义开始,到最近的花括号结束
- 方法内部的变量
- 参数列表
- 代码块里面的变量
- 什么时候使用成员变量,什么时候使用全局变量?
- 考虑变量的生存时间(影响内存的开销)
- 能减少作用域都减少(减少内存开销)
- 定义工具类是 (static 使用起来比较方便) 成员变量封装好,利于我们方法使用
1.3 关键字列表
1.3.1 关键字
1.3.2 保留字
1.3.3 特殊直接量
二、数据类型
2.1 八种基本数据类型
基本数据类型存储在栈内存中
四类 | 八种 | 字节数 | 数据范围 |
---|---|---|---|
整型 | byte | 1 | -128-127 |
short | 2 | -32768~32767 | |
int | 4 | -2147483648~2147483648 | |
long | 8 | -263~263-1 | |
浮点型 | float(f,F) | 4 | -3.403E–3.403E |
double(d,D) | 8 | ||
字符型 | char | 2 | ‘a’,‘A’,‘1’ |
布尔型 | boolean | 1 | true,false |
注意:
-
float浮点数 在赋值时,必须加后缀f或F
-
不要比较float和double类型
float f=3.55f; double d=3.55; System.out.println(f); System.out.println(d); System.out.println(f==d);//false
2.2 引用数据类型
数组,类,接口被称为引用数据类型,共同特点是,他们的字面值并不是一个“值”而是一段地址。
引用数据类型存储在堆内存中
2.3 数据类型转换
自动转换:小的数据类型向大的数据类型转换,或者整数类型转换成浮点数类型,都是可以实现自动转换的
强制转换: 大的数据类型向小的数据类型转换,或者浮点数要转换成整数,需要使用强制转换。要在转换类型加括号,如果是浮点数转整数,直接去掉小数点,只保留整数(不考虑四舍五入情况),考虑精度丢失问题
byte b = (byte)300;
三、运算符
3.1 算术运算符
-
运算符用来计算数据的,数据可以是常量,也可以是变量,被我们运算符操作的数,我们称之为操作数
-
算术运算符+、-、*、/、%、++、–
运算符 运算规则 例子 结果 + 正号 +10 10 + 加法 10+12 22 + 连接符 “名字:”+“上云” 名字:上云 - 负号 -10 -10 - 减法 20 - 10 10 * 乘法 10*2 20 / 除 6/3(5/2) 2 % 取模 5%2 1 ++ 自增 int a = 1;a++/++a; 2 – 自减 int b = 2; b–/–b; 1 注意:
- 前置++ 先+1 后运算(后做操作),后置++ 先操作后+1;
- 前置-- 变量先-1,后操作,后置-- 先操作,变量后-1;
3.2 赋值运算符
赋值运算符,用来为变量赋值的。=、+=、-=、*=、/=、%=
运算符 | 运算规则 | 例子 | 结果 |
---|---|---|---|
= | 赋值符号 | int a = 10; | 10 |
+= | 加后赋值 | int a = 10; a+=2;(a = a+2) | 12 |
-= | 减后赋值 | int a = 10; a-=2; | 8 |
*= | 乘后赋值 | int a = 10;a*=2; | 20 |
/= | 除后赋值 | int a = 10;a/=5; | 2 |
%= | 取模后赋值 | int a = 10;a%=3; | 1 |
3.3 关系运算符
关系运算符又叫比较运算符,用来判断两个操作数大小关系,以及是否相等,结果是我们boolean 类型,true false
运算符 | 运算规则 | 例子 | 结果 |
---|---|---|---|
> | 大于 | 5 > 3 | true |
>= | 大于或者等于 | 5>=5 | true |
< | 小于 | 5<3 | false |
<= | 小于等于 | 3<=4 | true |
== | 等于 | 3==3 | true |
!= | 不等于 | 3!=4 | true |
注意:赋值运算的 = 和关系运算符的 == 是有区别的,= 是做赋值, == 是做判断比较。
int a = 5;
int b = 10;
System.out.println( a == b);
System.out.println(a = b);
3.4 逻辑运算符
逻辑运算符,用与 boolean 类型的值进行运算比较的。最终结果 true 或者是 false(按住 shift + 对应符号)
运算符 | 运算规则 | 例子 | 结果 |
---|---|---|---|
& | 与(两者为真) | true & false | false |
| | 或(有一个真即为真) | true | false | true |
! | 非(取反) | !true | false |
^ | 异或(两者不同即为真) | true ^ false | true |
&& | 短路与 | false && true | false |
|| | 短路或 | true || false | true |
^ | 异或做二进制运算 | 二进制无进位相加 |
& | 与 && || 的区别
-
逻辑与& 逻辑或 | 两边都要判断,&两边都为真的时候结果为真,| 只要有一边为真结果就为真
-
&&(短路与) ||(短路或) 只判断一边,&& 左边为false右边不计算,||左边为true 右边不计算
逻辑异或运算 A^B: 使用^进行运算,只要两边相同,返回false,两边不同,返回true
如果要求右侧表达式,不管在什么情况下,都要计算到,只能使用逻辑与和逻辑或运算,不能使用短路 与和短路或运算
3.5 条件运算符(三目运算)
boolean ? 值1:值2;
true? “你好” : “不好”;
3.6 位运算符
当你使用数字操作位运算符时,是使用二进制操作的。
位运算符(1=true,0=false):
-
&(与) 1&1=1,1&0=0 使用&符号,两边同是为1,才为1,不然为0
-
|(或)1|1=1,1|0=1,0|0=0 使用|符号,两边有一边为1,则运算结果为1,否则为0
-
^(异或) 11=0,10=1,0^0=0 使用^符号,两边相同,则结果为0,两边不同,则结果为1
-
〜(取反) 1=0,0=1(二进制元素位) 使用~符号,按位取反,如果是0,则取值为1,如果是1,则取值为
0000 0001 1111 1110
-
<< (左移)左移一位相当于乘以2,右移一位相当于除以2
0000 0001 <<2 0000 0100 >>1 右移 0000 0010 >>1 0000 0001
-
无符号移位
无符号右移位运算:
使用>>>符号表示,不考虑正负数的问题
正数移动和右移位相同
负数移动不考虑最左侧负号的问题,意义不大
3.7 运算符优先级
四、java 条件语句与循环结构
4.1 Java 条件语句 - if…else
4.1.1 if 单分支
if (boolean){
//如果条件是true执行的代码块
}
/**
* 需求:考试得了100,奖励一部手机
*/
4.1.2 if…else… 结构
if (boolean){
//如果条件是true执行的代码块
} else {
//如果条件是false执行的代码
}
/**
* 需求:考试得了100,奖励一部手机;否则作业翻倍
*/
4.1.3 if…else if…else if …else 多分支结构
if(boolean){
//语句块1
} else if(boolean) {
//语句块2
} else if(boolean) {
//语句块3
} else if(boolean) {
//语句块4
} else {
//都不满足执行的代码块
}
/**
* 需求:考90份以上等级A,[80 - 90) B;[70 - 80)c; [0 - 70)d;
*/
4.2 Java switch case 语句
4.2.1 语法
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句 case 值中没有匹配到执行default语句块
}
/**
* 需求: 打印星期 1 -7
*/
- value的值必须和表达式声明的类型一致,并且不能重复
- switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。
- switch case 执行时,一定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有 break,判断是否继续输出,或是跳出判断。
4.3 java 循环结构
4.3.1 while 循环
当条件为true时,此时while循环为死循环,需要添加循环结束条件(break)
while(boolean) {
//代码块
}
/**
*需求1: 播放音乐100次
*需求2: 定义一个变量从0开始,当变量小于5的时候,计算变量之间的和
*/
4.3.2 do…while 循环
先执行一次语句块,再判断条件是否满足,满足则继续执行循环,不满足则结束循环
do {
//代码块
}while(boolean)
4.3.3 for 循环
for(表达式1;表达式2;表达式3){
//语句块
}
/**
* 执行流程
* 表达式1 -> 表达式2 —> 语句块 —> 表达式3 —> 表达式2 -> 语句块 -> ...
*/
死循环
for(;;){
//循环体
}
for循环嵌套
特点:外层循环执行一次,里面全部执行完,再继续执行外层的循环
for(表达式1;表达式2;表达式3){
//语句块
for(表达式1;表达式2;表达式3){
//语句块
}
}
增强for循环
for(声明语句 : 表达式) //(表达式声明类型 临时变量 : 迭代量)
{
//代码句子
}
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
public static void main(String[] args){
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ){
System.out.print( x );
System.out.print(",");
}
System.out.print("\n");
String [] names ={"James", "Larry", "Tom", "Lacy"};
for( String name : names ) {
System.out.print( name );
System.out.print(",");
}
}
五、break 与 continue 关键字
5.1 break 关键字
break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。结束循环的执行
break 跳出最里层的循环,并且继续执行该循环下面的语句(跳出循环结构)。
public static void main(String[] args) {
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ) {
// x 等于 30 时跳出循环
if( x == 30 ) {
break;
}
System.out.print( x );
System.out.print("\n");
}
}
break标记语法
public static void main(String[] args) {
a:for(int i=0;i<3;i++){
System.out.println("外层循环"+i+"执行");
for (int j=0;j<3;j++){
System.out.println("内层循环"+j+"执行");
break a;//break的标签语法 含义结束a标签循环
}
}
}
5.2 continue 关键字
- 终止本次循环,继续执行下一循环
- 需求:对1-100内的奇数求和
continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。
在 for 循环中,continue 语句使程序立即跳转到更新语句。
在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。
public static void main(String[] args) {
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ) {
if( x == 30 ) {
continue;
}
System.out.print( x );
System.out.print("\n");
}
}
六、数组
6.1 数组的定义
-
数组的概念
是一种容器。是一组相同类型的数据的组合,将这一组数据做统一管理。
数组是一种引用数据类型。在数组中,可以存储基本数据类型,也可以存储引用类型 引用类型:类、String、数组、接口、枚举、注解
方法中的变量,如果是基本数据类型,存储在栈内存中 如果是引用类型,内容存储在堆内存中,在栈内存中,有一个变量指向堆内存地址(引用)
-
动态定义数组
//数组的声明 int[] nums; // 数据类型[] 数组名称 = new 数据类型[元素个数]; int[] nums = new int[10];
-
静态定义数组 (数组初始化的时候,就已经确定各索引元素的值)
//方式1 数据类型[] 数组名称 = new 数据类型[]{数据1,数据2,数据3}; //方式2 数据类型[] 数组名称 = {数据1,数据2,数据3};
-
赋值,获取值
//给元素赋值 数组名称[索引] = 值; //索引从0开始 //取值 数组类型 变量名 = 数组名称[索引];
-
数组的遍历
//for循环,快捷键fori for(int i = 0;i < arr.length;i++){ } //forEach遍历 (底层使用for循环) //快捷键:数组名称.iter for (数据类型 变量名 :数组名称){ } //倒序遍历 快捷键forr for(int i = arr.length; i > 0; i--){ }
-
数组可能产生的异常
数组下标越界异常
java.lang.ArrayIndexOutOfBoundsException
数组元素长度定义为负数
java.lang.NegativeArraySizeException
空指针异常
java.lang.NullPointerException
6.2 数组的优缺点
- 特点:
- 数组元素类型必须一致(char有ASCII码表对应)
- 数组元素连续,空间大小一致,并且内存地址连续,呈线性结构
- 数组长度固定后不可改变
- 数组不仅可以存储基本数据类型也可以存储引用数据类型,数组本身就是引用数据类型
- 优点
- 根据索引去获取访问元素(快)
- 能存储较多的数据
- 缺点
- 数组的长度固定,不可改变(超过容量增加数组元素时,只能用新数组代替)
- 只能存储一种数据类型
- 删除很慢,根据内容找索引很慢
6.3 数组的排序
-
选择排序
public static void main(String[] args) { int[] x = {15, 7, 12, 2, 8};//5 for (int z=0;z<x.length-1;z++){//控制循环几轮 int minIndex = z;//认为第一个下标的数字是最小的 for (int i = z+1; i < x.length; i++) { if (x[i] < x[minIndex]) { minIndex=i;//最小值的下标放在minIndex } } //交换处理 //每一轮,只做一次交换处理 if (minIndex!=z){ int tmp=x[z]; x[z]=x[minIndex]; x[minIndex]=tmp; } System.out.println("第"+(z+1)+"轮结束:"); for (int a:x){ System.out.print(a+"\t"); } System.out.println(); } } }
-
冒泡排序
public static void main(String[] args) { int[] x = {15, 57, 12, 22, 8, 16};// for (int i =0; i < x.length-1; i++) {//循环轮次 0 1 2 3 4 for (int j=0;j<x.length-1-i;j++){//内循环越来执行的次数越少 if (x[j]>x[j+1]){ int t=x[j]; x[j]=x[j+1]; x[j+1]=t; } } } for (int i : x) { System.out.print(i+"\t"); } }