二、Java基础语法(2)

本文深入解析Java中的流程控制语句,包括选择结构、循环结构及控制跳转语句,并详细介绍了数组的概念、定义与内存分配,适合初学者及进阶学习。

1 流程控制语句

(1)顺序结构 从上往下,依次执行
(2)选择结构 按照不同的选择,执行不同的代码
(3)循环结构 做一些重复的代码

1.1 选择结构

选择结构:
		if语句
		switch语句
1.1.1 if 的三种格式
三种格式
	A:格式1
		if(比较表达式) {
			语句体;
		}
		
		执行流程:
			判断比较表达式的值,看是true还是false
			如果是true,就执行语句体
			如果是false,就不执行语句体
	
	B:格式2
		if(比较表达式) {
			语句体1;
		}else {
			语句体2;
		}
		
		执行流程:
			判断比较表达式的值,看是true还是false
			如果是true,就执行语句体1
			如果是false,就执行语句体2
			
	C:格式3
		if(比较表达式1) {
			语句体1;
		}else if(比较表达式2){
			语句体2;
		}
		...
		else {
			语句体n+1;
		}
		
		执行流程:
			判断比较表达式1的值,看是true还是false
			如果是true,就执行语句体1
			如果是false,就继续判断比较表达式2的值,看是true还是false
			如果是true,就执行语句体2
			如果是false,就继续判断比较表达式3的值,看是true还是false
			...
			如果都不满足,就执行语句体n+1

三元运算符和if 语句第二种格式的关系:

所有的三元运算符能够实现的,if语句的第二种格式都能实现。反之不成立。
举例:
如果if语句第二种格式控制的语句体是输出语句,就不可以。
因为三元运算符是一个运算符,必须要有一个结果返回,不能是一个输出语句。
1.1.2 switch格式
	(1)格式:
	switch(表达式) {
		case 值1:
			语句体1;
			break;
		case 值2:
			语句体2;
			break;
		...
		default:
			语句体n+1;
			break;
	}
	
	格式解释说明:
		switch:说明这是switch语句。
		表达式:可以是byte,short,int,char
			JDK5以后可以是枚举
			JDK7以后可以是字符串
		case:后面的值就是要和表达式进行比较的值
		break:表示程序到这里中断,跳出switch语句
		default:如果所有的情况都不匹配,就执行这里,相当于if语句中的else
	
	注意:
	A:遇到左大括号缩进一个tab的位置。
	B:关联不是很大的语句间空行
switch语句的注意事项:
	A:case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
	B:default可以省略吗?
		可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
		特殊情况:
			case就可以把值固定。
			A,B,C,D
	C:break可以省略吗?
		可以省略,但是结果可能不是我们想要的。
		会出现一个现象:case穿透。
		最终我们建议不要省略
	D:default一定要在最后吗?
		不是,可以在任意位置。但是建议在最后。
	E:switch语句的结束条件
		a:遇到break就结束了
		b:执行到末尾就结束了

举个例子:

import java.util.Scanner;

class SwitchDemo {
	public static void main(String[] args) {
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		
		//控制键盘录入数据
		System.out.println("请输入一个数据(1-7):");
		int week = sc.nextInt(); //3
		
		//switch判断语句
		switch(week) {
			case 1:
				System.out.println("星期一");
				break;
			case 2:
				System.out.println("星期二");
				break;
			case 3:
				System.out.println("星期三");
				break;
			case 4:
				System.out.println("星期四");
				break;
			case 5:
				System.out.println("星期五");
				break;
			case 6:
				System.out.println("星期六");
				break;
			case 7:
				System.out.println("星期日");
				break;
			default:
				System.out.println("你输入的数据有误");
				break;
		}
	}
}

1.2 循环结构

有三种:for,while,do...while
1.2.1 for循环
for循环格式:
	for(初始化语句;判断条件语句;控制条件语句) {
		循环体语句;
	}
	
	执行流程:
		A:执行初始化语句
		B:执行判断条件语句,看其返回值是true还是false
			如果是true,就继续执行
			如果是false,就结束循环
		C:执行循环体语句;
		D:执行控制条件语句
		E:回到B继续。
		
注意事项:
	A:判断条件语句无论简单还是复杂结果是boolean类型。
	B:循环体语句如果是一条语句,大括号可以省略;如果是多条语句,大括号不能省略。建议永远不要省略。
	C:一般来说:有左大括号就没有分号,有分号就没有左大括号

案例1:求水仙花数

/*
	需求:在控制台输出所有的”水仙花数”
	
	分析:
		我们都不知道什么叫"水仙花数",你让我怎么做呢?
		
		所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
		举例:153就是一个水仙花数。
		153 = 1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 = 153

		A:三位数其实是告诉了我们范围。
		B:通过for循环我们就可以实现获取每一个三位数
		  但是麻烦是如何获取这个三位数的个,十,百位上的数据
		  
		  我们如何获取一个数据的个,十,百呢?
			假设有个一个数据:153
			ge:	153%10 = 3
			shi: 153/10%10 = 5
			bai:153/10/10%10 = 1
			qian:x/10/10/10%10
			wan:  x/10/10/10/10%10
			...

		C:让ge*ge*ge+shi*shi*shi+bai*bai*bai和该数据比较
		  如果相同,就把该数据在控制台输出。
*/
class ForDemo6 {
	public static void main(String[] args) {
		//三位数其实是告诉了我们范围。
		for(int x=100; x<1000; x++) {
			int ge = x%10;
			int shi = x/10%10;
			int bai = x/10/10%10;
			
			//让ge*ge*ge+shi*shi*shi+bai*bai*bai和该数据比较
			if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)) {
				//如果相同,就把该数据在控制台输出。
				System.out.println(x);
			}
		}
	}
}
1.2.2 while循环
/*
	while循环的基本格式:
		while(判断条件语句) {
			循环体语句;
		}
		
		扩展格式:
		
		初始化语句;
	    while(判断条件语句) {
			 循环体语句;
			 控制条件语句;
		}
		
		通过这个格式,我们就可以看到其实和for循环是差不多的。
		
		for(初始化语句;判断条件语句;控制条件语句) {
			循环体语句;
		}
*/
class WhileDemo {
	public static void main(String[] args) {
		//输出10次"HelloWorld"
		//for语句版
		for(int x=0; x<10; x++) {
			System.out.println("HelloWorld");
		}
		System.out.println("--------------");
		//while语句版
		int x=0;
		while(x<10) {
			System.out.println("HelloWorld");
			x++;
		}
		
	}
}
while循环和for循环的区别?
	使用区别:如果你想在循环结束后,继续使用控制条件的那个变量,用while循环,否则用for循环。不知道用for循环。
	          因为变量及早的从内存中消失,可以提高内存的使用效率。
			  
	其实还有一种场景的理解:
		如果是一个范围的,用for循环非常明确。
		如果是不明确要做多少次,用while循环较为合适。

案例1:

/*
	我国最高山峰是珠穆朗玛峰:8848m,我现在有一张足够大的纸张,厚度为:0.01m。
	请问,我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?

	分析:
		A:定义一个统计变量,默认值是0
		B:最高山峰是珠穆朗玛峰:8848m这是最终的厚度
		  我现在有一张足够大的纸张,厚度为:0.01m这是初始厚度
		C:我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?
		  折叠一次有什么变化呢?就是厚度是以前的2倍。
		D:只要每次变化的厚度没有超过珠穆朗玛峰的高度,就折叠,统计变量++
		E:输出统计变量。
*/

class WhileDemo5 {
	public static void main(String[] args) {
		//定义一个统计变量,默认值是0
		int count = 0;
		
		//最高山峰是珠穆朗玛峰:8848m这是最终的厚度
		//我现在有一张足够大的纸张,厚度为:0.01m这是初始厚度
		//为了简单,我把0.01变成1,同理8848就变成了884800
		int end = 884800;
		int start = 1;
		
		while(start<end) {
			//只要每次变化的厚度没有超过珠穆朗玛峰的高度,就折叠,统计变量++
			count++;
			
			//折叠一次有什么变化呢?就是厚度是以前的2倍。
			start *= 2;
			
			System.out.println("第"+count+"次厚度是"+start);
		}
		
		//输出统计变量。
		System.out.println("要叠"+count+"次");
	}
}
1.2.3 do while循环
do while 循环:
	A:基本格式
		do {
			循环体语句;
		}while(判断条件语句);
		
		扩展格式:
		初始化语句;
		do {
			循环体语句;
			控制条件语句;
		}while(判断条件语句);
		
		通过查看格式,我们就可以看出其实三种循环的格式可以是统一的。
	B:三种循环的区别
		a:do...while循环至少执行一次循环体
		b:for和while必须先判断条件是否是true,然后后才能决定是否执行循环体
1.2.4 总结
  1. 那么,我们一般使用哪种循环呢?
    优先考虑for,其次考虑while,最后考虑do…while
  2. 循环使用的注意事项(死循环)
    A: 一定要注意修改控制条件,否则容易出现死循环。
    B: 最简单的死循环格式
    	a:while(true){...}
    	b:for(;;){}
    

2 控制跳转语句

(1)break:中断的意思
		A:用在循环和switch语句中,离开此应用场景无意义。
		B:作用
			a:跳出单层循环
			b:跳出多层循环,需要标签语句的配合
(2)continue:继续
	A:用在循环中,离开此应用场景无意义。
	B:作用
		a:跳出单层循环的一次,可以继续下一次
	C:填空题
		for(int x=1; x<=10; x++) {
			if(x%3 == 0) {
				//补齐代码
			}
			System.out.println("JavaSE");
		}
		如何让控制台输出2次:JavaSE
		break;
		如何让控制台输出7次:JavaSE
		continue
		如何让控制台输出13次:JavaSE
		System.out.println("JavaSE")
(3)return:返回
	A:它的作用不是结束循环的,而是结束方法的。
	B:一旦遇到return,程序就不会在继续往后执行。

举个例子:

/*
	return:返回
	
	其实它的作用不是结束循环的,而是结束方法的。
*/
class ReturnDemo {
	public static void main(String[] args) {
		for(int x=0; x<10; x++) {
			if(x == 2) {
				System.out.println("退出");
				//break;
				//continue;
				return;
			}
			
			System.out.println(x);
		}
		
		System.out.println("over");
	}
}

3 方法

(1)方法:就是完成特定功能的代码块。
		注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法。
(2)格式:
	修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
		方法体语句;
		return 返回值;
	}

	修饰符:目前就用 public static。后面再详细讲解其他修饰符
	返回值类型:就是功能结果的数据类型
	方法名:就是起了一个名字,方便我们调用该方法。
	参数类型:就是参数的数据类型
	参数名:就是变量
	参数分类:
		实参:实际参与运算的数据
		形参:方法上定义的,用于接收实际参数的变量
	方法体语句:就是完成功能的代码块
	return:结束方法
	返回值:就是功能的结果,由return带给调用者。
(3)两个明确:
	返回值类型:结果的数据类型
	参数列表:参数的个数及对应的数据类型
(4)方法调用
	A:有明确返回值的方法
		a:单独调用,没有意义
		b:输出调用,不是很好,因为我可能需要不结果进行进一步的操作。但是讲课一般我就用了。
		c:赋值调用,推荐方案
	B:void类型修饰的方法
		a:单独调用
(5)方法的注意事项
	A:方法不调用不执行
	B:方法之间是平级关系,不能嵌套定义
	C:方法定义的时候,参数是用,隔开的
	D:方法在调用的时候,不用在传递数据类型
	E:如果方法有明确的返回值类型,就必须有return语句返回。
(6)方法重载
	在同一个类中,方法名相同,参数列表不同。与返回值无关。
	
	参数列表不同:
		参数的个数不同。
		参数的对应的数据类型不同。

4 数组

4.1 一维数组

(1)数组:存储同一种数据类型的多个元素的容器。
(2)特点:每一个元素都有编号,从0开始,最大编号是长度-1。
         编号的专业叫法:索引
(3)定义格式
	A:数据类型[] 数组名;
	B:数据类型 数组名[];
	
	推荐是用A方式,B方法就忘了吧。
	但是要能看懂
(4)数组的初始化
	A:动态初始化
		只给长度,系统给出默认值
		
		举例:int[] arr = new int[3];
	B:静态初始化
		给出值,系统决定长度
		
		举例:int[] arr = new int[]{1,2,3};
		简化版:int[] arr = {1,2,3};

4.2 二维数组

(1)元素是一维数组的数组。
(2)格式:
	A:数据类型[][] 数组名 = new 数据类型[m][n];
	B:数据类型[][] 数组名 = new 数据类型[m][];
	C:数据类型[][] 数组名 = new 数据类型[][]{{...},{...},{...}};
	D:数据类型[][] 数组名 = {{...},{...},{...}};

5 Java的内存分配

A:栈 存储局部变量
B:堆 存储所有new出来的
C:方法区(面向对象部分详细讲解)
D:本地方法区(系统相关)
E:寄存器(CPU使用)

注意:
	a:局部变量 在方法定义中或者方法声明上定义的变量。
	b:栈内存和堆内存的区别
		栈:数据使用完毕,就消失。
		堆:每一个new出来的东西都有地址
		    每一个变量都有默认值
				byte,short,int,long 0
				float,double 0.0
				char '\u0000'
				boolean false
				引用类型 null
		    数据使用完毕后,在垃圾回收器空闲的时候回收。

在这里插入图片描述

5.1 二维数组内存分配图

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值