Java基础语法
流程控制语句
if…else if…else if…else
多分支语法格式:
if(条件判断){
} else if(条件判断){
} else if(条件判断){
} else {
}
适合与多条件的判断,但是 if else过多,会导致程序的阅读性下降
优势 : 高效的优势,只要有一个if的条件判断结果是true,整体的语句结构就结束了
public static void main(String[] args) {
int i = 99;
//if else if的多分支
if(i < 100) {
System.out.println("第一个if的条件是true");
}else if(i > 100){
System.out.println("第二个if的条件是true");
}else if (i == 100) {
System.out.println("第三个if的条件是true");
}else {
System.out.println("所有的条件都是false");
}
}
多分支语句的练习
需求 : 请你输入你的考试成绩,对成绩进行等级划分
90-100 : 优
80-89 : 良
70-79 : 中
60-69 : 差
<60 : 不及格
switch选择语句
程序也是进行选择的, switch语句中包含的关键字比较多
switch case default break
switch语句的格式 :
switch (变量){
case 常量1 :
要执行的语句1;
break;
case 常量2 :
要执行的语句2;
break;
case 常量3 :
要执行的语句3;
break;
default:
要执行的语句;
break;
}
-
语句流程详细解释
- switch中的变量,和case后面的常量,进行比较 (是否相同)
- 如果和 常量1相等,执行 : 语句1, 执行break,整体switch结束
- 如果和 常量2相等,执行 : 语句2, 执行break,整体switch结束
- switch中的变量,和任何一个case后面的常量都不相等,执行default后面的语句, 执行break,整体switch结束
-
switch语句中的变量的数据类型有限制
- byte short int char (JDK1.0-1.4)
- 添加数据类型 enum 枚举 (JDK1.5)
- 添加数据类型字符串 (JDK1.7)
- 使用的是JDK1.8 (支持的类型 byte short int char 枚举 字符串)
public static void main(String[] args) { int i = 5; switch (i) { case 1: System.out.println("case1"); break; case 2: System.out.println("case2"); break; case 3: System.out.println("case3"); break; default: System.out.println("所有case都不相等"); break; } }
选择语句的练习
需求 : 根据输入的月份,判断是哪个季节
春季 : 3,4,5 夏季 : 6,7,8 秋季 : 9 ,10 ,11 冬季 12 , 1, 2
采用if和switch分别完成
if(month < 1 || month > 12) {
System.out.println("输入的月份不存在");
}
//季节判断 春季 : 3,4,5
else if(month >=3 && month <=5) {
System.out.println("春季");
}
//季节判断 夏季 : 6,7,8
else if (month >= 6 && month <=8 ) {
System.out.println("夏季");
}
//季节判断 秋季 : 9 ,10 ,11
else if (month >= 9 && month <= 11) {
System.out.println("秋季");
}
//季节判断 冬季 12 , 1, 2
else {
System.out.println("冬季");
}
case穿透特性
在switch的语句中,不写break,出现case的穿透性
switch (变量){
case 常量1 :
要执行的语句1;
// break;
case 常量2 :
要执行的语句2;
// break;
case 常量3 :
要执行的语句3;
// break;
default:
要执行的语句;
// break;
}
case穿透特性实现季节判断
public static void main(String[] args) {
//键盘输入,接收月份
Scanner sc = new Scanner(System.in);
int month = sc.nextInt(); // 4
//利用case穿透特性
switch(month) {
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
case 1:
case 2:
case 12:
System.out.println("冬季");
break;
default:
System.out.println("月份不存在");
}
}
循环语句
循环 : 程序中的语句(代码)多次的反复的执行
使用的频率非常的高
输出10次 “HelloWorld”
System.out.println("HelloWorld"); 语句复制10次,不行
while循环
语法格式 :
while(布尔类型的表达式){
//while的循环体
}
-
while循环的执行流程
- 执行布尔表达式,如果是true
- 执行循环体中的程序
- 再次执行布尔表达式,如果还是true
- 再次执行循环体中的程序
- 再次执行布尔表达式,如果是false
- while循环就结束了
- 结论: 只要while中的布尔表达式结果是true,就执行循环体,直到布尔类型为false,循环结束
public static void main(String[] args) {
int i = 1;
while(i < 10) {
System.out.println("while的循环体 "+i);
//变量i 发生变化 ++
i++;
}
//打印10次HelloWorld
//j变化到10的时候,循环结束
int j = 0;
while(j < 10) {
System.out.println("HelloWorld");
j++;
}
}
while循环练习
-
输出10以内的所有偶数
public static void main(String[] args) { //定义变量,默认值是0, 变化到10 int i = 0; while(i <= 10) { //判断是不是偶数 if(i % 2 == 0) { System.out.println(i + "是偶数"); } i++; } }
public static void main(String[] args) { //定义变量,默认值是0, 变化到10 int i = 0; //变量i在循环的时候,每次+2行不? 不需要判断了 while(i <= 10) { System.out.println(i + "是偶数"); //i=i+2; i+=2; } }
for循环
语法格式 :
for (初始化变量 ; 条件 ; 增量){
//for的循环主体
}
-
循环的三个部分解释
- 初始化变量 : 定义变量 数据类型 变量名 = 值
- 条件 : 条件必须是布尔类型结果 true 或者 false
- 增量 : 循环变量的变化
- 条件 : 控制循环是否执行,条件是true,循环,条件是false结束循环
public static void main(String[] args) { for(int i = 0 ; i < 5 ; i++) { System.out.println("这里是for循环的循环体 "+i); } }
-
for循环的执行流程
- 执行初始化的变量. (只会执行一次)
- 执行条件的判断 (判断条件是false,循环直接结束), 判断条件是true
- 进入到for的循环体执行
- 执行变量的自增
- 执行条件的判断 (判断条件是false,循环直接结束), 判断条件是true
- 执行循环体
- 执行变量的自增
- 执行条件的判断 (判断条件是false,循环直接结束)
for循环实现练习
-
for循环实现0-10之间的偶数
public static void main(String[] args) { //利用for循环中的变量 for(int i = 0 ; i <= 10 ;i+=2) { System.out.println(i +"是偶数"); } }
-
for实现求和计算 1 + 2 + 3 +…+ 100 = 5050 (高斯算法)
public static void main(String[] args) { //定义变量int类型,保存求和后的结果 int sum = 0; //进行1-100之间的循环 for(int i = 1 ; i <= 100 ;i++) { //求和计算, sum变量保存求和后的结果 sum = sum + i; } System.out.println(sum); }
do…while
格式 :
do{
//循环主体
}while(条件判断);
-
循环执行流程
- 判断while中的循环条件
- 如果条件是true,执行循环体
- 如果条件是false,结束循环
-
注意
: do … while 无条件先执行一次循环体
break和continue
- break : 终止 作用就是终止循环, 在循环中遇到break,循环就结束,只能在循环中或者switch出现
public static void main(String[] args) {
int i = 0;
while(true) {
i++;
//判断变量的值,如果=10,执行break终止循环
if(i == 10) {
break;
}
}
for( ; ;) {
break;
}
}
-
continue : 终止本次循环,开始下一次循环
public static void main(String[] args) { for(int i = 0 ; i <=10 ;i++) { //判断,如果变量是偶数,执行下一次循环 if(i % 2 == 0) { continue; } System.out.println(i); } }
嵌套循环
引出 : 上体育课迟到20分钟,处罚
操场跑圈 : 跑5圈, 再跑5圈, 再跑5圈, 再跑5圈
跑了4组,每组跑了5圈, 一共跑了多少圈 20 组数*每组圈数
理解 : 第一组5圈… 我的第一次循环 5圈 我的第二次循环 5圈 (围绕操场循环了5次)
一次大的循环,包含5次小的循环 : 程序 嵌套循环, 总的循环次数 = 大循环次数*小循环次数
嵌套for
两个for循环在一起,形成嵌套形式, 双循环
一个for是另一个for的循环体
格式 :
for(初始化变量 ; 条件 ; 增量){ //外循环
for(初始化变量 ; 条件 ; 增量){ //内循环
}
}
//内循环是外键循环的循环体
public static void main(String[] args) {
//外循环,循环5次
for(int i = 0 ; i < 5 ;i++) {
//内循环,循环3次
for(int j = 0; j < 3 ; j++) {
System.out.println("内循环");
}
System.out.println("外循环");
}
}
嵌套for循环练习
-
外循环一次,内循环多次
-
结论 : 外循环控制行数 ,内循环控制每行的个数
public static void main(String[] args) {
//外循环5次
for(int i = 0 ; i < 5 ;i++) {
//内循环5次
for(int j = 0 ; j < 5 ;j++) {
//内循环输出星号
System.out.print("*");
}
//外循环输出空的换行
System.out.println();
}
}
-
尖向下的直角三角形
public static void main(String[] args) { // 有几个行 5行 外循环5次 for(int i = 0 ; i < 5; i++) { /* * 每个行有几个星号 第一行是5个,逐行递减 * 变量j 0 1 2 3 4 * * 外循环第一行的时候,内循环5个 * 外循环第二行的时候,内循环4个 * j变化 : 每次执行内循环的时候,变量j的初始化都+1 * * 外循环的i 变量 0 1 2 3 4 */ for(int j = i ; j < 5 ;j++) { System.out.print("*"); } System.out.println(); } }
-
尖向上的直角三角形
public static void main(String[] args) { // 有几个行 5行 外循环5次 for(int i = 0 ; i < 5 ;i++) { /* * 内循环 : 循环次数不固定 每行递增效果 * 第一行 : 内循环1次 * 第二行 : 内循环2次 * 内循环的变量 j * * 第一行 : 内循环1次 j<1 * 第二行 : 内循环1次 j<2 * 内 : 变量j每次都从0开始,但是条件在改变 */ for(int j = 0 ; j <= i ;j++) { System.out.print("*"); } System.out.println(); } }
-
乘法表
public static void main(String[] args) { //i 1-9 for(int i = 1 ; i <= 9 ;i++) { // 第一次循环1 ,第二次循环 1 2 for(int j = 1; j<=i ;j++) { /* * 替换为乘法计算即可 */ System.out.print(j+"*"+i+"="+j*i+"\t"); } System.out.println(); } }
数组(Array)
概述 : 数组是一种容器,容器就是存储数据的,数组可以同时存储多个数据的容器.
比如 : 班级里面有100个同学,100个名字,定义变量的方式 ,需要定义出100个变量,存储名字
更好的解决办法 : 100个名字全部存储在一个容器中,方便管理这些个数据
凡是数据多了,存储在数组容器中.
Java数组 : 只能存储同一个数据类型的数据
数组的定义
-
定义数组的格式1:
-
数据类型,定义的数组容器存储的数据的类型 int 这个数组就只能存储整数
-
[] 就表示数组
-
数组的名字, 理解为就是一个变量的名字 (标识符,驼峰命名)
-
new 创建数组容器的关键字
-
数据类型,定义的数组容器存储的数据的类型 int 这个数组就只能存储整数
-
整数值, 表示的是数组的长度, 就是容量,也就数组能存储多少个数据
数据类型[] 数组的名字 = new 数据类型[整数值]; int[] arr = new int[3];
-
-
JVM内存划分
数组内存
-
栈内存和堆内存区别
- 栈内存,使用完毕就释放,效率高
- 堆内存,等待JVM垃圾回收,效率低
- 栈内存中的变量,必须赋值,否则不能使用
- 堆内存的数据,必须有默认值
- 栈内存,方法运行的时候计算
- 堆内存,负责存储对象和数组
数组的访问
操作数组中的数据了, 存储到数组中的任何数据,都称为数组的元素(Element)
数组元素的访问,依靠数组的索引 (index) (下标)
-
数组的索引
- 每个数组都有自己的索引
- 索引是从0开始的
- 索引是数组的特性,天生就有, 本质上就是数组中每个元素的编号
-
数组访问的语法:
- 数组名[索引]
public static void main(String[] args) {
//定义存储int类型的数组,数组的长度是3
int[] arr = new int[3];
//输出,数组0索引上的元素
System.out.println(arr[0]);
//输出,数组1索引上的元素
System.out.println(arr[1]);
//输出,数组2索引上的元素
System.out.println(arr[2]);
//数组0索引上的元素,赋值
arr[0] = 5;
System.out.println(arr[0]);
}
数组的长度
Java中的数组是定长的, 数组的长度,也就是存储元素的个数,一旦创建完毕,不可改变
定长也是数组的一个弊端
对于数组 : JVM赋予数组一个属性 (属性 : 属于这个事务的特性)
属性的名字 length, 表示数组的长度 (int类型)
使用方法 : 数组名.length
public static void main(String[] args) {
//定义数组,存储的类型是int类型,长度5
int[] arr = new int[5];
//使用数组的长度属性 length
//int l = arr.length;
System.out.println(arr.length);
}
数组长度length属性, 数组的最大索引,是长度-1 arr.length-1
数组的定义
-
定义格式2 : 定义数组的同时直接存储元素
- {}可以直接写入数组的元素值
数据类型[] 数组的名字 = new 数据类型[]{元素1,元素2,元素3};
public static void main(String[] args) { int[] arr = new int[] {1,2,3,4,5,6,7}; System.out.println(arr); //输出5, 在4索引的位置 System.out.println(arr[4]); //数组的长度length属性 System.out.println(arr.length); }
-
定义格式3:
数据类型[] 数组的名字 = {元素1,元素2,元素3};
public static void main(String[] args) { int[] arr = {1,2,3,4,5,6,7,8,9,0}; System.out.println(arr[7]); System.out.println(arr.length); }