001 循环结构 while
循环结构:
While ,do while , for
写循环语句时要注意 : 1.初始值,2.条件判断,3.让初始值变化以便能跳出循环,4.执行语句
002 do while
Do {语句,增量 }; while(判断)
Do while的特点是无论怎么样语句都会执行一次。 即使条件不满足
003 for
For (初始化表达式;循环条件表达式;循环后的表达式)
{
执行语句;
}
for的优势在for内部创建变量,跳出循环后释放。
循环条件满足则进入执行语句,不满足跳出循环。
for执行顺序 : 1.初始化--2.循环条件--3.执行语句---4.循环后----5.循环条件---6.执行语句---7.循环后表达---…
初始化语句只执行一次
004 while 和 for的不同
While 和 for ,初始变量的作用域不同,for的变量在for循环结束后在内存中释放,所以下图编译时会报找不到 变量的错误。
什么时候使用循环结构:
当对某些语句执行很多次时,就是用循环结构。
005 循环语句的其他特点
会报错, 因为在循环条件中我们不能得到一个布尔类型的值,即不真不假,程序无法继续。
除了循环条件外,其他3部分只要是合法的表达式就可以~
可执行多条语句,可以用逗号隔开~依然管用。 强大。
如for (int x =0 ,y =8 ; x<3; x++,y++)
无限循环的最简单表达:
for (;;){} for的条件默认为真
While(true){}
006 循环练习
1: 获取 1到10 的和,并打印
题1 思路:
一定要明确哪些语句需要参与循环,哪些不需要
定义变量用于存储不断变化的和
定义变量,记录不断变化的被加数
定义循环,重复加法的过程
Log: 第一次由于没有在for循环的初始值中用 int x=1;而是直接用x =1;导致
结果调整后正确输出了
2: 1-100 之间7的倍数的个数,并打印
题2 思路:
先对1-100进行遍历,通过循环 for
在遍历的过程中,定义条件,只对7的倍数进行操作。
定义一个变量来记录7的倍数的个数,但要注意变量的作用域。 For 以外。
Log : 一次通过。
练习总结。
累加思想: 比如求和 , 字符串的叠加。 通过变量记录每次变化的结果,再通过循环的形式进行累加动作。
计数器思想: 通过一个变量记录数据的变化(需要if判断)for 内的if来实现。 比如在范围内有多少个什么什么,就需要想到计数器。
007 008 009for循环嵌套
比如for中嵌套if语句
循环嵌套: for for嵌套
****
****
****
对于打印长方形,外部循环控制行数,内部循环控制的是每一行的列数,也就是一行的元素。
练习
打印下列的图形
1.
*****
****
***
**
*
2.
*
**
***
****
*****
思路: 有行有列,使用循环的嵌套,长方形的图形是行列固定,而需求中的图形是行列中有相应的关系
题1,x=1 , y=5, x=2, y=4 ,
外: x=,x<=5,x++
内: y=5,y>=x ,y--
Or
外 x=1,x<=5,x++
内 y=x , y<=5 , y++
题2, x=1 ,y=1 ,
Log , 注意 System.out.print("*"); 中不要用println, 而且要在外循环中加入换行。
小规律: 图像的尖朝上,可以改变循环条件,让条件随着循环变化
尖朝下,可以改变初始化的值,让初始化的值随着外循环变化。
JerryJava 循环练习4
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
....
打印九九乘法表
思路
被乘数递增 : 1 , 2 ,3...
乘数的个数与被乘数相关, 从1 到 等于被乘数
所以被乘数为外循环,乘数为内循环,且尖朝上,则需要关联循环条件。 y<=x
另外注意输出的格式,和输出的换行。
Log : 一次通过
010 break - continue
Break 跳出 结束本层循环结构
Continue 跳出一次循环,还在当前循环体内
常见的是用if语句来控制 break, 如果达到了某一个条件,则选择跳出。
If(x==1)
Break;
可以给循环起名字~ 。~
Continue 只能用于循环结构
Continue 下面的语句执行不到。所以也需要用if来控制。
For (intx=1;x<=10;x++)
{
If(x%2==1)
Continue;
System.out.println("x="+x);
}
最后只打印的是偶数。
011 练习
JerryJava 循环练习5
打印一个等腰三角形。
思路
外循环固定, x=1 , x<=5 , x++
内循环其实是两个组成的, 一个是尖朝下的打印空格,一个是尖朝上的星号,
尖朝下则关联初始值,尖朝上则关联条件。
内循环1 :y=x;y<5;y++ ----- 打印空格
2 : y=1;y<x;y++ ------打印星号和一个空格
打印一次换行
Log: 在第一次编写的时候又忘记在初始值中int y=x了
修正后结果正确
一个for循环中嵌套了两个并列的for
012 函数 特点,定义
函数又称为方法,两个一样的。
函数提高代码的复用
函数: 具有特定功能的一段独立小程序。
相同的部分进行抽取,封装成一个独立的功能。
函数定义的格式:
修饰符 返回值类型 函数名 (参数类型 形式参数1 , 参数类型 形式参数2…)
{
执行语句
Return 返回值
}
Return 是函数的结束
谁调用return给谁
IntgetResult (int num)
{
Return num*3+5;
}
添加修饰符
Public static int getResult (int num)
{
Return num*3+5;
}
函数定义, 函数执行
函数只有被调用才会执行
getResult(4); 就是调用了
Int x =getResult(4);
如果函数的返回值不为Void,则都需要写return语句作为函数的结束。
012 013 函数 应用
编写功能是主要任务: 函数是最小的功能单元。
主函数的功能就一个,调用其他的函数。 不要把所有的功能都放在Main中,不得体。
如何定义一个函数:?
1.明确结果, | 返回值类型 |
2.该功能的过程是否需要未知内容参与 | 参数列表 |
第一步:
Publicstatic int getSum()
{
Return 3+4;
}
进化, 第二步:
Publicstatic int getSum(int x , int y )
{
Return x+y;
}
/*
需求: 判断2个数时候相同
1.结果是boolean
2.功能中有2个整数
*/
Publicstatic boolean campare(int a , int b)
{
//if(a==b)
//Return true;
//return false;
return a==b;
}
如果返回值是void类型的函数,是不能在输出语句中输出的
写函数的时候,除非需要,否则不要在函数输出语句
是否进行打印操作是调用者的事情。
014 函数练习
1.打印矩形
2.99乘法表
===========
/**
JerryJava 函数练习2
1.打印矩形
2.99乘法表
*/
class DemoFunc_2
{
public static void printSq (int row , int col)
{
for (int x=1;x<=row ;x++ )
{
for (int y=1;y<=col ;y++ )
{
System.out.print("*");
}
System.out.println("");
}
}
public static void printnn()
{
for (int x=1;x<=9 ;x++ )
{
for (int y=1;y<=x ;y++ )
{
int z=y*x;
System.out.print(y+"*"+x+"="+z+" ");
}
System.out.println("");
}
}
public static void main(String[] args)
{
printSq(7,7);
printnn();
}
}
015 016 重载和练习 overload
重载: 在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者类型不同即可
重载和且 仅仅和参数列表相关, 功能一致,功能名称就可以一样啦~
/**
JerryJava 重载练习1
加法重载
*/
class DemoOverload_1
{
public static int add (int x , int y)
{
return x+y;
}
public static int add (int x , int y,int z)
{
return x+y+z;
}
public static void main(String[] args)
{
System.out.println(add(3,4));
System.out.println(add(3,4,7));
}
}
99乘法表的改进,进一步提高代码的复用
这个思路要记住
即, 在一个函数中调用另外一个函数,达到提高代码复用性的目的
public static void printnn(int num)
{
for (int x=1;x<=num ;x++ )
{
for (int y=1;y<=x ;y++ )
{
int z=y*x;
System.out.print(y+"*"+x+"="+z+" ");
}
System.out.println("");
}
}
public static void printnn()
{
printnn(9);
}
重载和返回值类型没有关系。
017 数组的概念 定义 内存结构
数组是同一个数据类型的集合, 其实一个数组就是一个容器。
数组,自动编号。方便操作。 数组的编号从0开始。
定义一个数组:
格式
元素类型[] 数组名 = new 元素类型[元素的个数或者数组长度];
int[] x = new int[3];
new是在内存中开辟空间~ x 是一个引用类型, (数组,类,接口)
Java在内存中开辟了5片空间来进行自己数据的存储
栈内存 (局部变量,数据用完了释放)
堆内存 (数组和对象,通过new建立的实例都存在堆内存中),每一个实体都有内存地址,实体中的变量都有默认的初始化值,实体不在被使用,会在不确定的时间被回收。
方法区
本地方法区
寄存器
凡是局部变量都是栈内存中的, 比如 int [] x =new int[3];
其中的x就是栈内存变量,他会随着函数的释放而消失。
而new int[3] 则在堆内存开辟了一个空间,
每一个堆内存的实体都有一个地址,上面的语句意为,将new int[3]这个堆内存中的实体的首地址值赋值给栈内存的x变量,
即x指向了这个数组,或者x引用了这个数组。 所以是引用类型。
堆内存中实体的两个特点: 1. 有地址,2 有初始值 (int 0 , double 0.0 , float 0.0f , boolean false...),3内存垃圾回收机制
x[0]=22;
x=null; (斩断了链接)
问题来了,x不引用该数组了, 该数组失连了,怎么办?
答,当一个实体在堆内存中没有任何的引用使用他的话,Java虚拟机就使其为垃圾,启动垃圾回收机制,不定时的清除。
比起C++真的好多了~ 自动内存回收机制真是机智啊~
栈: 自动释放
堆:垃圾回收
int[] x : 建立一个整形数组类型的引用变量 x
new int[3] : 在堆内存中建立一个长度为3的整形数组,且初始值为默认
int []x = new int[3] :建立连接: 将该整形数组的首地址值赋给x整形数组引用变量
堆内存的实体,可以在栈内存中有多个引用。
只要有New ,就会开辟一个新的空间!
int [] x= new int[3]
int [] y=new int [3]
x , y 值不同啊, 因为他们是不同数组的引用~