---恢复内容开始---
一、for循环的掌握
语法格式:
for( 初始化语句A ; 条件判断B ; 循环后功能语句C){ //循环体D } |
for的执行流程:
整个for循环结构中的 A 只会执行一次
循环第一次:Aà B(true)àDàC
第二次: B(true)àDàC
第三次: B(true)àDàC
…
第n次: B(false) 结束整个循环
- 举个例子演示一下,for 打印 1-10
-
1) 回顾下学过的while循环示例
2) 用for循环实现同样的功能
3) 注意定义的计数器i的作用域
for 常见面试题
1)
上面的代码打印的值?
循环了几次?
判断了几次?
最后i的值是多少?
2)
上面的代码打印的值?
循环了几次?
判断了几次?
最后i的值是多少?
练习:
- 用for循环计算1-10的 积(也就是 10的阶乘)
二、嵌套循环
循环嵌套 循环里面还有循环,可以嵌套多层,不同的循环结构相互之间也可以嵌套。
把循环里面的代码理解成一段普通的代码。
练习: 在控制台打印 5行*,每行5个星 *****
---恢复内容结束---
一、for循环的掌握
语法格式:
for( 初始化语句A ; 条件判断B ; 循环后功能语句C){ //循环体D } |
for的执行流程:
整个for循环结构中的 A 只会执行一次
循环第一次:Aà B(true)àDàC
第二次: B(true)àDàC
第三次: B(true)àDàC
…
第n次: B(false) 结束整个循环
- 举个例子演示一下,for 打印 1-10
-
1) 回顾下学过的while循环示例
2) 用for循环实现同样的功能
3) 注意定义的计数器i的作用域
for 常见面试题
1)
上面的代码打印的值?
循环了几次?
判断了几次?
最后i的值是多少?
2)
上面的代码打印的值?
循环了几次?
判断了几次?
最后i的值是多少?
练习:
- 用for循环计算1-10的 积(也就是 10的阶乘)
二、嵌套循环
循环嵌套 循环里面还有循环,可以嵌套多层,不同的循环结构相互之间也可以嵌套。
把循环里面的代码理解成一段普通的代码。
练习: 在控制台打印 5行*,每行5个星 *****
- 写上相同的5个 System.out.println(“*****”);
- 优化上面的代码,使用一个执行5次的循环,循环主体:System.out.println(“*****”)
- 希望一个一个的打印*(想想在控制台怎么实现单个打印*)
- 使用循环优化上面的代码
建议实际开发中不要嵌套太深
初学者而言,先学会从简单的代码优化开始(真正的理解到循环的作用,和语法)
练习:
在控制台打印如下的效果
①
*
**
***
****
*****
②
*****
****
***
**
*
③
*
**
***
****
*****
④
*
* *
* * *
* * * *
* * * * *
练习:
- 求1-5的 的阶乘和(1!+2!+3!+4!+5!)
package com.javaBase; public class Factorial { int ji = 1; int sum = 0; public static void main(String[] args) { Factorial factorial = new Factorial(); factorial.printFactorial(); } public Integer printFactorial(){ for (int i=1;i<=5;i++){ ji *= i; System.out.println(ji); sum +=ji; } System.out.println(sum); return sum; } }
三、循环控制语句
1. break
l break 表示终止 当前 这一层循环
示例:
1) 循环10次,打印计数器i的值
2) 假设当遇到i的值是3的时候,终止整个循环
3) 每一次循环,都应该判断的值是否是3,如果是,执行一个break;
u 怎么测试终止 当前这一层 ?
使用嵌套循环测试
- 给循环添加标签(名字)
语法:用break 名字
结束当前这一层的循环结构(标签名字必须符合Java中标识符的命名规则)
练习:
1) 求出100以内前5个2的倍数的数字
//循环1-100
int n = 0;
for(int i=1;i<=100;i++){
if(i%2==0){
//打印
n++;
}
if(n==5){
break;
}
}
2. continue
l continue 跳过本次循环,继续下一次循环
场景:
一周每天重复做的事情就是 :打代码
但是第5天不想打代码,第6 和第7天仍然继续打代码,怎么实现?
练习:
1) 计算出1—20之间所有不能被3整除的整数的总和 大于(或等于)100的第一个数字
for(){
判断不能被3整除 ,求总和sum
if( i %3 != 0 ){
sum+=i;
}
再有一个判断sum大于(或等于)100 用break 终止循环
if(sum>=100){
//打印sum i
break;
}
}
3. return
l return 表示结束当前的方法
- 使用刚才break的例子,修改为return 看看有什么区别
注意:break continue return 紧跟的后面不能够有其它的代码,因为永远执行不到
package com.javaBase; import java.sql.SQLOutput; public class LoopController { public static void main(String[] args) { LoopController loopController = new LoopController(); //loopController.breakController(); //loopController.continueController1(); //loopController.continueController2(); loopController.returnController(); } /** * 1)求出100以内前5个2的倍数的数字 */ //循环1-100 int n=0; public void breakController(){ for (int i=1;i<=100;i++){ if (i%2==0){ n++; System.out.println(n); } if (n==5){ break; } } } /** * continue 跳过本次循环,继续下一次循环 * 场景: * 一周每天重复做的事情就是 :打代码 * 但是第5天不想打代码,第6 和第7天仍然继续打代码,怎么实现? */ public void continueController1(){ for (int i = 1;i<=7;i++){ if (i==5){ continue;//跳出这次循环 } System.out.println(i+"写代码"); } } /** * 1)计算出1—20之间所有不能被3整除的整数的总和 * 大于(或等于)100的第一个数字 */ public void continueController2(){ int j=0; for (int i = 1;i<=20;i++){ if (i%3 !=0){ j += i;//跳出这次循环 }else { continue; } if (j>=100){ break; }else { System.out.println(j); } } } /** * return 表示结束当前的方法 * 使用刚才break的例子,修改为return 看看有什么区别 */ public void returnController(){ int j=0; for (int i = 1;i<=5;i++){ if (i==3){ return; } System.out.println(i); } System.out.println("方法结束"); } }
四、总结三种循环语句
3种循环结构的语法
while(条件){
执行这里面的内容
}
do{
}while(条件)
for(初始值;判断条件;循环后执行语句){
循环体里面做的事情
}
- 循环真正作用
- 目前而言,需要熟练的使用每一种循环完成基本的操
六、引入
思考:我们第一次听说方法是什么时候?
示例:
设计一段代码,计算1-10的和(举例代码演示)
我们还有个需求,计算1-1000的和,怎么做?
比较上面的代码区别,都比较类似,唯一不同的地方是在哪里?
希望设计一段代码,能够同时满足求1-n的和,怎么办?
我们可以用 方法 来解决
图示如下:
1. 什么是方法
方法,也叫 函数,但是一般在java中都叫 方法(同学们在其他地方看到 函数 ,它其实就是指 方法)。
方式 就是一个能够独立完成某个功能的一段代码。
方法 看成是一个整体,比如这个圈,既然可以看成一个整体,那么我们这个圈里是不是可以包含 1-n 的求和的代码
2. 怎么设计
需求:设计一个方法,完成计算任意两个整数的和的功能!
1) 拷贝一个主方法,然后修改
2) 完成此方法的功能
我们就是此方法的设计者,设计这个方法需要哪些步骤呢?
我们需要做什么事情?(计算任意两个整数的和)
计算哪两个数?
定义两个变量准备用来接收使用者给我的两个整数
这两个变量定义在方法的()中
我们在设计的时候,两个变量是没有具体数据的,我们可以当成这两个变量是有数据的
3. 定义语法
修饰符 返回类型 方法名字(数据类型 变量名,数据类型 变量名,……){ 在方法的代码块区域返回结果值的语法: return 返回和方法返回类型相同的值; }
|
方法的 返回类型 和 方法名字 必须定义
在一个类中不能 同时存在 相同名字 和 参数类型个数一模一样 的方法
jvm是怎么来判断 相同名字 和参数类型的方法?--》
方法签名:方法名+参数列表(和参数的名字没有关系,只是和参数的类型 ,个数,顺序有关)
4.怎么使用
上面计算2个数的和的方法怎么调用?在哪里调用?
主方法:是程序的入口,放在主方法里,jvm可以间接的调用我们定义的方法。
使用(调用)方法,我们现在是使用者,对于使用者而言,不用关心方法内部是如何计算的(应该把方法看成一个整体)
方法有static修饰 : 类名.方法名()
方法没有static修饰: 对象名.方法名()--(后面面向对象讲解)
如果调用的方法和被调用的方法同时在一个类中,并且同时有static 或者同时没有static:
方法名()
方法被调用的时候才会执行
可以重复的调用执行(多次调用相互之间没有关系,各自调用各自的)
5.常见问题
1) 调用的时候参数不一致
2) static main 方法调用一个非static方法
3) 直接写方法名add没有括号和参数;
6.总结
在一个类中,用static修饰的方法只能调用 同样是static修饰的方法
实参列表 和 形参参数个数和类型必须一一对应。
在一个类中不能定义一样的名字 和 相同形参类型和个数 的方法。
把一个方法看成是能够独立完成某个功能的一段代码,把一个方法看成是一个整体
从两方面去看:
1) 使用者
a) 不用关心方法内部的代码是如何写
b) 如何使用(调用)
c) 方法形式参数(所需要关心)
d) 方法的执行结果
2) 设计者
a) 实现什么功能,要做什么事情
b) 形式参数:用户在调用方法的时候传入什么已知条件
c) 执行完毕的结果如何处理
7.练习
1) 定义一个方法,接受三个int参数,计算打印最大的一个数。
七、方法return
1) 引入
设计一个方法求任意两个整数的和,我们之前代码是怎么写的?
在上面的方法基础之上,计算3个整数的和
a) 使用这个方法,先计算两个的和sum,再调用一次,然后sum和另外一个数求和
从代码上看,这个求和的方法只能够传入两个
b) 希望上面的方法计算完毕之后不打印,得到计算之后的一个结果值。
那我们可以用 return 来返回结果值…
2)示例
要求:计算2个整数的和,然后把计算的结果返回给调用者。
1) 方法里写上return 返回值(定义个sum变量存放求和的结果并返回)
return sum;//表示把sum变量中的值返回给调用者
2) 修改返回类型
方法的内部返回了一个数据,数据的类型是int,所以void 修改成 int
注意:把sum变量中的值返回给调用者,不是返回sum这个变量
3) 方法里面返回的变量sum 值,是否可以在调用的方法里面直接使用?
方法里面的变量sum只能在所在方法里面才能访问,其他方法不能访问
4) 怎么获得结果值?
把add方法这个整体 看成是 此方法计算完毕的结果值
a) 直接把 方法整体 放在打印语句中打印(把方法看成是整体)
b) 可以定义一个变量接收 方法结果值
c) 把方法整体看成是一个值,参与运算
思考:直接打印 方法整体,还是 把方法结果值定义一个变量存起来再去打印 ,哪种方式更好一些?
思考:计算1+3的和,直接每次计算的时候打印方法,还是单独定义一个变量接收起来 哪种方式更好;
3) 常见问题
①定义了一个有返回类型的方法,但是调用的时候没有放在打印语句中
例如:
add(1,2);
②在调用方法的里面去打印输出 被调用方法里面的变量
add方法中定义的返回变量sum的值,这个sum局部变量 只能在add方法内部访问,而
主方法中无法访问(作用域不同)
③没有返回任何东西,也就是返回类型为 void,去打印输出(或者使用变量接收)方法返回值
④定义了add(int x,int y) 是有返回值的方法,但是调用的的方式有问题,例如 1)错误调用方式一 public static void main(String [] args){ add(1,2); System.out.println(add(1,2)); /* 上面的代码什么问题? 多调用了一次,两次add(1,2) 调用了2次,是独立的调用了两次,第一次调用的时候可以使用一 个变量去接收,然后打印变量即可 */ } ⑤错误调用方式二 public static void main(String [] args){ add(1,2); System.out.println(add); /* 上面的代码什么问题? 打印的是一个变量add,这个变量然而并没有定义,和方法名字搞混淆了 */ }
|
⑥如果一个方法的返回类型不是void,那么要求(不管方法里面做了什么事情)都必须返回
一个和 返回值类型匹配的值
public static int add(){ if(true){ return 1; } } |
上面的代码:编译器只看结构,不看其中的值,编译器看到的是一个if结构
public static int add(){ if(true){ return 1; }else{ return 2; } } |
上面的代码:编译器看到结构是if-else,始终都会执行一部分,而这2部分都有return
public static int add(){ if(true){ return 1; }else if(false){ return 2; } } |
4)应用场景
一般来说就是如果需要方法返回一个结果值,那么就return(一般做一些数学运算都需要使用返回值)
设计一个方法:打印用户传入的字符串,思考是否需要返回值?
public static void print(String str){ System.out.println(str); } |
八、方法重载
1)引入
- 定义一个add方法,求2个整数的和
- 举例,定义不同方法,满足下面要求:
2个整数和,3个整数和,4个整数的和…….
这种方式不好,感觉不容易记住;方法名太多;-- 但是可以通过方法重载来修改上面的例子
2)概念
方法重载:是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数列表(类型 个数 顺序)。
如果一个类中存在了多个名字一样的方法而编译不报错,那么肯定就是重载
重载理解:①方法名相同
②参数类型,参数个数,参数顺序 只要有一个不同
注意:方法重载和参数名字没有关系。和 返回值类型 和 修饰符也没有关系。
3)作用
①多个方法写成重载方法有什么好处?方便记忆
②典型的方法重载示例w(多个不同类型);
4)应用场景
ava.io.PrintStream
java.io.PrintStream包里面的println方法 ,方法名字都一样,参数类型不同