零基础学java第二周
day05.流程控制语句
1.顺序结构语句
代码由上至下依次加载
2.选择结构
2.1 if结构
格式1:if(条件表达式){
语句;
}
执行流程:
1)当前条件表达式成立,执行语句
2)否则不成立,不执行语句;
格式2: if(条件表达式){
语句1;
}else{
语句2;
}
执行流程:
1)判断表达式是否成立,如果成立,执行语句1,
2)如果不成立,执行语句2;
应用场景:针对两种情况进行判断
格式3: if(条件表达式1){
语句1;
}else if(条件表达式2){
语句2;
}else if(条件表达式3){
语句3;
}else{
语句n;
}
执行流程:
1)判断表达式1是否成立,如果成立,则执行语句1;
2)如果不成立,继续判断表达式2是否成立,如果成立,执行语句2;
3)如果表达式2不成立,继续判断表达式3是否成立,如果成立,执行语句3
...
4)如果上面的条件表达式都不成立,则执行else中的语句n....
2.1.1 if语句格式2 和三元运算符的区别
if..else : 流程控制语句,不仅可以操作具体数据值还可以操作语句
System.out.println("提示信息...") ;
三元运算符 :是运算符的一种,它只能操作具体的数据结果值,不能直接里面嵌套使用
System.out.println("提示信息...") ;
三元运算符能够实现的---一定能够使用if...else实现
而if...else...实现不一定能够使用三元运算符实现!
2.2 switch 结构
格式: switch(表达式){
case 值1:
语句1;
break ;
case 值2:
语句2;
break ;
...
default:
语句n;
break ;
}
执行流程:
1)首先表达式的值和case值1进行匹配,
如果匹配成功,执行语句1,break结束
2)如果case值1不匹配,继续和case后面的值2进行比较,如果匹配,语句2执行,break结束;
...
3)如果上面的case的值都和switch中表达式的结果不匹配的,那么最终
就执行default中的语句n,然后程序默认执行到末尾结束了,break结束;
//case 穿透的相关举例
int x = 3 ;
int y = 4 ;
switch(x){//3
default ://程序case没有匹配到,所以首先执行default
y++ ;//4+1 = 5 没有break,程序向下穿透
case 4:
y ++ ;//5+1 = 6
case 5 :
y++ ;//6+1 = 7
}
System.out.println("y:"+y) ;// 最终结果y=7
switch(x){//x=3
default :
y++ ;
case 3: //匹配到先执行case3
y ++ ; //y=4+1 = 5
case 4 :
y++ ;//y=5+1 = 6 程序默认执行到末尾不进行default
}
System.out.println("y:"+y) ;//最终结果y=6
System.out.println("------------------------") ;
int a = 3 ;
int b = 4 ;
switch(a){
default ://没有匹配到case值,首先执行default
b++ ; 4+1=5 break
break ;
case 4:
b++ ;
case 5:
b++;
}
System.out.println("b:"+b) ;//最终结果b=5
switch(a){//a=3
case 3://匹配到执行 4+1=5
b++ ;
case 5: //穿透 执行5+1=6
b++;
default ://穿透 执行6+1=7break
b++ ;
break ;
}
System.out.println("b:"+b) ; //最终结果b=7
2.2.1 switch中的表达式,可以是什么样的数据类型?
基本的能够使用的数据类型:
byte,short,char,int
JDK5以后,可以跟枚举 (enum)
JDK7以后,可以是String类型
2.2.2 switch语句中的注意事项:
1)case语句后面的值只能是常量
(Java是一个强类型语言:结构和格式是非常严谨的)
(在Javascript前端语言中,是一个弱类型语言,case后面的值既可以是常量
,也可以是变量)
2)case语句中的break必须带上,否则会造成一个现象:case 穿透
由于某个case已经匹配了,此时如果没有break,那么就继续往下面执行!
case的语句进行穿透,依次执行,遇见有case中有break的,那么switch结束!
3)switch的结束条件是什么?
a)语句break结束
b)程序默认执行到末尾!
4)default语句可以在语句中的任何位置,不影响程序的执行流程!
default的执行,当前case中都没有匹配的话,执行default
day06.流程控制语句
1. for循环
格式:
for(初始化语句;条件表达式;控制体语句(++/--)){
循环体语句;
}
执行流程:
1)初始化语句进行赋值,只执行一次
2)然后判断条件表达式是否成立
如果成立,执行循环体语句;----然后执行控制体语句 (++/--)
3)继续判断条件表达式是否成立,
如果成立,执行循环体语句;----然后执行控制体语句(++/--)
...
4)执行到条件表达式不成立,for循环语句结束!
2. while 循环
格式:
初始化语句;
while(条件表达式){
循环体语句;
控制体语句;
}
执行流程:
1)初始化语句进行赋值
2)判断条件表达式是否成立
如果成立,执行循环体语句,控制体语句对变量进行自增或者自减
3)继续判断条件表达式是否成立
4)如果条件表达式不成立,while循环结束
2.1.1 while循环和for循环的区别
共同点:都能够描述循环的思想,将重复度高的代码进行优化,解决冗余度问题
不同点:
1)格式上不同
2)从内存角度考虑,for循环使用完毕结束后,当前这个变量就被释放掉了,而while不会,它始终
可以访问到这个变量,故for循环比较节省内存空间!
3)释放明确循环次数
明确循环次数:优先采用for循环,其次再是while
while循环:不明确循环次数的情况下使用
while循环一般都是这样使用!
while(true){ 死循环
//当达到某个条件,break;中断
}
2.1.2 do-while
格式:
初始化语句;
do{
循环体语句;
控制体语句;
}while(条件表达式) ;
执行流程:
1)初始化语句执行
2)执行条件表达式,如果条件表达式不成立,循环体至少执行一次!
如果条件表达式成立...然后控制体语句,依次判断;
do-while循环和其他两个循环的最大的区别:
循环体至少执行一次;
2.1.3 死循环
死循环中常见的两种格式
for(;;){
//业务操作
}
while(true){//恒成立 (使用居多)
//业务操作..
}
day07.for循环的嵌套(相关例题)&跳转控制语句
1.99乘法表
class ForForTest{
public static void main(String[] args){
//9行9列的*,列数在变化的*
for(int x = 0 ; x <9; x++){
for(int y = 0 ; y <=x ; y++){
System.out.print("*") ;
}
System.out.println() ;
}
System.out.println("-------------------------------") ;
//99乘法表:为了保证有数据,从1开始
for(int x = 1 ; x <= 9 ; x ++){//行数
//列数也在变化
for(int y = 1 ;y <=x ; y ++){
//Java中的转义字符
// x :X任意字符 t---"制表符"
System.out.print(y+"*"+x+"="+(y*x)+"t" ) ;
}
System.out.println() ;
}
}
}
2.跳转控制语句
跳转控制语句:
break
continue
return
break
应用场景:
1)不能单独使用,报错
2)只能在两个场景中使用
switch语句自带了break关键字
循环结构语句中
for/while循环都可以用到
contine:
一般都在循环语句中使用的;
表示结束当前循环,立即进入下一次循环了...
return :返回结果 (结束方法去使用,但是很少单独使用)
一般情况:return不会单独使用(很少单独使用),结合Java中的有具体返回值类型的方法去使用
day08. 方法
1.方法
定义:
在java中,方法就是用来完成解决某件事情或实现某个功能的办法
格式:
权限修饰符 static 返回值类型 方法名(参数类型1 变量名1 ,参数类型2 变量名2.....){
完成你的代码的业务逻辑:根据需求来完成操作
return 结果;
}
调用方法:
1)输出调用
2)赋值调用
3)单独调用
详细解释:
权限修饰符:初期固定使用public :访问权限足够大的
现在写方法:必须带上static 前期初学的写法:public static
返回值类型:就是基本数据类型
方法名: 给{}代码块起名字, 见名知意,遵循"标识符规则",小驼峰命名法
add(),求和
sum() ,求和
参数列表:
参数类型 ----:基本数数据类型
变量名 ---- :给当前形式参数起名字,见名知意,"小驼峰命名法"
return 结果: 根据你的业务方法,
返回值类型时什么类型,给你返回具体的结果
1.1有具体返回值的方法
格式:
权限修饰符 static 返回值类型 方法名(参数类型1 变量名1 ,参数类型2 变量名2.....){
完成你的代码的业务逻辑:根据需求来完成操作
return 结果;
}
调用方法:
赋值调用:推荐
1.1.1定义有具体返回值类型的方法注意事项
1)方法和方法是平级关系,不能嵌套,只能在里面去调用
2)定义方法的时候需要两个明确
a)明确返回值类型
b)明确参数类型以及参数个数(形式参数类型和几个参数)
3)在定义方法的时候,形式参数必须携带数据类型,因为Java
是一个强类型语言!
4)在实际参数 main中,调用方法的时候,实际参数不需要携带数据类型,因为
已经键盘录入,已经定义过了
5)实际参数和形参参数,传参时,数据类型需要一一对应!
1.1.2例题
//(while循环)输入一个整数,计算它各位上数字的和。(注意:是任意位的整数)
//导包
import java.util.Scanner ;
class Test2{
public static void main(String[] args){
//定义一个最终结果变量
int sum = 0 ;
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并录入数据
System.out.println("请您录入任意位的整数: ") ;
int n = sc.nextInt() ;
while(n!=0){
//获取低位,和sum进行求和
sum += n%10 ;
//去掉低位,将结果在赋值给n
n = n / 10 ;
}
System.out.println("任意位的整数他们各个位的数据和是:"+sum) ;
}
}
1.2没有具体返回值的方法
格式:
public static void 方法名(形式参数列表){
//完成的业务逻辑,输出等等操作,
但是不能有return (必须和有具体返回值类型的方法一块使用)
}
方法调用:
单独调用
2. 方法重载(OverLoad)
当方法的功能都是相同的,
我们可以定义同名的方法,参数列表不同,跟返回值无关,可以提高这个功能的扩展性!
方法重载:---为了提供某个功能的扩展性
方法名相同,参数列表不同,与返回值无关!
参数列表不同:
1)参数个数不同
2)参数类型不同
3)考虑参数类型的顺序
day09. 数组
1. 定义&格式&初始化方式
定义:
什么是数组,数组就是能够存储同一种数据类型的容器!
格式:
1)数据类型[] 数组名称; (推荐第一种方式)
2)数据类型 数组名称[] ;
初始化方式:
动态初始化:
给定数组的长度,数组的元素内容由系统默认初始化!
默认初始化:系统给定的
根据我们数组中存储的数据类型来判定
举例:int类型的默认值就是0
double的默认值0.0
格式:
数据类型[] 数组名称 = new 数据类型[数组长度] ; (推荐第一种)
数据类型 数组名称[] = new 数据类型[数组长度] ;
静态初始化:
给定元素的内容,由系统来默认分配长度
格式:
(推荐)数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3....} ;
数据类型 数组名称[] = new 数据类型[]{元素1,元素2,元素3....} ;
推荐使用简写格式
(推荐)数据类型[] 数组名称 = {元素1,元素2,元素3....} ;
数据类型 数组名称[] = {元素1,元素2,元素3....} ;
2. 数组中的异常类
数组中常见的异常: 运行时期异常
1)数组角标越界异常---程序运行的时候出现异常
ArrayIndeexOutOfBoundsException 类名
出现这个异常原因:我们访问了数组中不存在的索引值报错!
解决方案:
改变索引值
2)实际开发中,经常会出现 空指针异常 NullPointerException
就是当前 我们在访问某个对象的时候,对象已经是null,
然后还要使用对象中的某个功能---出现空指针了
解决方案:
对当前这个对象进行非空判断
2.1空指针异常例题
//导包
import java.util.Scanner ;
class Demo{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//很明显--赋值为null
sc = null ;
//提示并录入数据
System.out.println("请您输入一个数据int类型: ") ;
if(sc!=null){
int a = sc.nextInt() ;
System.out.println("您录入的数据是:"+a) ;
}else{
System.out.println("键盘录入对象为空,无法录入数据!") ;
}
}
}
3. 数组的遍历
1)遍历数组
遍历数组:就是将数组中的元素一一输出
2)遍历数组---格式
for(int x = 0 ; x
4.相关例题
4.1数组的最值问题
//定义一个求数组最大值的方法
public static int getArrayMax(int[] array){
//定义参照物
int max = array[0] ;
//遍历其他元素
for(int x =1 ; x < array.length ; x ++){
//使用后面的元素依次和参照物max进行对比
if(array[x] > max){
max = array[x] ;
}
}
return max ;//返回
}
4.2数组逆序
逆序:就是将数组中的一个元素和最后一个元素互换
将数组中的第二个元素和倒数第二个元素进行互换
//调用逆序的方法(完成逆序)
public static void reverse(int[] array){
for(int x = 0 ; x < array.length/2 ; x ++){//x=0,1,2,...arr.length-1
//互换
int temp = array[x] ;
array[x] =array[array.length-1-x] ;
array[array.length-1-x] = temp ;
}
}
4.3数组的基本查表法
就是通过数组的对象名称[索引值]----获取元素内容
需求:
字符串数组
String[] weeks ={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"} ; 键盘录入指定的数据, (0-6的范围),通过数组查表法:通过角标查询元素!
//导包
import java.util.Scanner ;
class ArrayTest4{
public static void main(String[] args){
//字符串数组,静态初始化
String[] weeks = {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"} ;
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并录入数据
System.out.println("请您输入一个数据: ") ;
int n = sc.nextInt() ;
if(n>=0 && n<=6){
System.out.println("您要查找的是:"+weeks[n]) ;
}else{
System.out.println("录入的数据,不再数据表的范围内...") ;
}
}
}
4.4数组的基本元素查询
查元素第一次出现的索引值,每次从头查询到尾
这个数组:
皆可以无序,也可以有序!
方法1:
public static int getIndex(int[] array,int target){
//遍历数组
for(int x = 0 ; x < array.length ; x ++){
//获取到每个数组中的元素
//判断
//如果当前array[x] == target ----找到了元素了
if(array[x] == target){
//返回x--索引值
return x ;
}
}
//如果上面循环中找不到这个元素,就说明没有这个元素,方法调用完毕,必须结果值
return -1 ;//找不到
}
方法2:
public static int getIndex2(int[] array,int target){
//使用假设思想:
//先定义变量index:就是我们的索引值
int index = -1 ; //找不到
//遍历指定的array数组
for(int x = 0 ; x < array.length; x ++){
//获取到了所有元素,
//判断:如果当前array[x]== target 一致,找到了
if(array[x] == target){
//重新改变index 的值
index = x ;
break ;
}
}
return index ;
}
5.冒泡排序
冒泡排序思想:
两两比较,将较大的值往后方法,第一次比较完毕之后,最大值出现在最大索引处,依次这样比较!
规律:
两两比较,大的往后放
第一次比较,有0个不比
第二次比较,有1个不比..
....
比较的次数:数组长度-1次
//冒泡排序优化前:
for(int x = 0 ; x < arr.length-1 ; x ++){//比较了四次,0,1,2,3
//里面元素进行判断比较
for(int y = 0 ; y < arr.length-1-x ; y ++){//arr.length-1-0/
//arr.length-1-1
//前面的元素比较后面的元素大,互换
if(arr[y] > arr[y+1]){
//中间变量互换
int temp = arr[y] ;
arr[y] = arr[y+1] ;
arr[y+1] = temp ;
}
}
}
public static void bubbleSort(int[] array){
for(int x = 0 ; x < array.length-1 ; x ++){//比较次数
//里面元素进行判断比较
for(int y = 0 ; y < array.length-1-x ; y ++){//arr.length-1-0/
//arr.length-1-1
//前面的元素比较后面的元素大,互换
if(array[y] > array[y+1]){
//中间变量互换
int temp = array[y] ;
array[y] = array[y+1] ;
array[y+1] = temp ;
}
}
}
}