一,循环结构语句
1.for语句
for :使用最多: 普通for循环
格式
for(初始化语句;条件表达式;控制体语句或者步长语句){
循环体语句;
}
执行流程
1) 初始化语句:给变量赋值 (只执行一次)
2)然后执行条件表达式,看其是否成立,如果成立,执行的是循环体语句------>再次回到控制体语 句或者步长语句--->变量自增或者自减
3)再次执行条件表达式,是否成立,成立,继续循环体语句---->再次回到控制体语句或者步长语 句---->变量自增或者自减
4)一直执行到条件表达式不成立,for循环结束;
2.while语句
while:其次才是这个while
while循环的格式
经常使用的格式
初始化语句;
while(条件表达式){
循环体语句 ;
控制体语句或者步长语句;
}
经常使用的格式
初始化语句;
while(条件表达式){
循环体语句 ;
控制体语句或者步长语句;
}
执行流程:
首先,先初始化语句,对变量赋值;
执行条件表达式,是否成立;成立,则执行循环体语句,依次控制体语句进行变量控制
--->再次判断条件表达式是否成立,成立,执行循环体语句--->控制体语句进行变量控制
...
...
当条件表达式不成立,while循环结束;
注意事项:控制体语句不要忘了,否则死循环;
首先,先初始化语句,对变量赋值;
执行条件表达式,是否成立;成立,则执行循环体语句,依次控制体语句进行变量控制
--->再次判断条件表达式是否成立,成立,执行循环体语句--->控制体语句进行变量控制
...
...
当条件表达式不成立,while循环结束;
注意事项:控制体语句不要忘了,否则死循环;
3.do...while语句
do-while
引入两个死循环 :一定要出口条件
for(;;){
循环体;
}
4.for循环的综合运用(for循环嵌套)
for(初始化语句1;条件中表达式1;控制体语句1){ //外层循环
// 循环体语句又是一个for循环for(初始化语句2;条件表达式2;控制体语句2){//内层循环
循环体语句...
}
}
5.死循环
死循环的两种格式
第一个格式
for(;;){
循环体语句;
}
第二个格式:while(true){ //死循环格式中使用比较多
循环体语句;
}
二,跳转控制语句
break ; looper循环或者switch中用 (中断,结束...)
continue:继续 (循环中用,结束当期循环之后,立即进入下一次循环了)
return ; // 结束方法用的 (很少单独使用, 引入 --Java中的方法(函数))
三,switch语句
格式: switch(表达式或者某个变量值)
{
case 值
1:
语句1;
break ;
case 值2:
语句2:
break ;
...
default:
语句n;
break ;
}
执行流程
switch接收结果,
1)接收的结果和case后面的值1进行对比,成立,执行语句
1,break 结束语句;
2)值1和switch接收的结果不匹配,和值2进行比较,成立,执
行语句2, break,结束语句;*
3)...
如果上面case都不匹配,执行default语句,语句n,break ,结
束
注意事项:
switch语句中的注意事项也是 (考点)
1)关于switch中的case语句后面只能常量,不能是变量 (体现Java是一种强类型语言)
----前端的javascript:它里面的swtich的case是可以是变量,可是个常量
2)在书写switch语句的标准结构,不忘了break,如果语句中忘了书写break,会出现一个现象:case穿透!
在有的需求里面利用 case穿透 来完成一些需求;
3)关于switch语句的结束条件
a)要么遇见break结束
b)程序默认执行到末尾
4)关于default语句可以在switch语句中的任何位置,不影响语句的执行流程;
不管在任何位置,只要case语句都不匹配,执行default;
如果default语句的末尾,break可以省略;
补充:
Math的随机数使用
jdk提供了类:java.lang.Math
java.lang包下的类不需要导包
针对数学运算的工具类,提供了很多的方法;
获取伪随机数,取值范围:[0.0,1.0)
public static double random():
快速使用:
Math.random()---获取一个随机数
四,方法的定义格式
1)有具体返回值类型的方法定义和调用
有具体返回值方法的定义格式
固定写法:
public static 返回值类型 方法名(形式参数类型1 参数名1,形式参数类型2 参
数名2,....){
//完成功能业务逻辑
...
return 具体结果;
有具体返回值类型的方法的调用格式
在main方中
赋值调用
接收的结果类型 变量名 = 方法名(实际参数1,实际参数2,...) ;
实际参数:直接赋值或者main中键盘录入
2)
没有具体返回值类型的方法定义和调用
定义格式:
public static void 方法名(形式参数类型1 参数名称1,形式参数类型2 参数
名2,....){
调用格式
单独调用
举例
public static void getMax(int a,int b){
//完成逻辑判断
//举例
if(a>b){
System.out.println(a+"是最大值");
}else{
System.out.println(b+"是最大值");
}
}
需求:
完成如下一个操作
键盘录入一个数据n,n为int类型
控制台输出 nn乘法表
public class FunctionDemo {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并录入数据System.out.println("请输入一个数据(1-9):");
int num = sc.nextInt() ;
//没有使用方法之前
//为了保证有数据从1开始
for(int x = 1 ;x<=num;x++) { //外层控制行数
for(int y =1 ; y <=x ;y++){ //内层循环控制列数,
列数随着行数的变化 第一行,1列,第二行,2列....
System.out.print(x+"*"+y+"="+(y*x) +"\t"); //不换行
}
System.out.println(); //换行
}
System.out.println("-------------------------------------------------
-");
//1)单独调用
// printNN(num); //8
//2)输出调用
//System.out.println(printNN(num)); //本身这个方法中就是输出给控制台,
输出语句套输出 :语法错误
// 3)赋值调用
//Void v = printNN(num) ; 错误的 这是void只是定义的方法格式,没有这个
类型
}
//定义一个方法来完成上面的操作
定义 方法两个明确
1)明确返回值类型: java提供关键字 void
2)明确参数类型以及参数个数
int类型 1个参数
public static void printNN(int n){//8
for(int x = 1 ;x<=n;x++) { //外层控制行数
for(int y =1 ; y <=x ;y++){
//内层循环控制列数,列数随着行数的变化 第一行,1列,第二行,2列....
System.out.print(x+"*"+y+"="+(y*x) +"\t"); //不换行
}
System.out.println(); //换行
}
}}
3)方法重载
方法重载:为了某个功能扩展性,多个方法方法名可以相同(完全相同),参数列表不同,与
返回值无关
参数列表不同
1)参数个数不同
2)参数类型不同
3)考虑参数类型的顺序
五,数组
Java中数组就是容器,这个容器 "只能存储同一种类型的元素"
在数组中定义格式
动态初始化和静态初始化
动态初始化:自己定义数组的长度,数组的元素有系统(jvm)默认分配
格式:
数据类型[] 数组名称 = new 数据类型[数组长度] ; 推荐第一种
数据类型 数组名称[] = new 数据类型[数组长度] ;
举例
int[] arr = new int[3] ;
int arr[] = new int[3] ;
所有的数组有一个特点:数组名称[角标或者索引值]:访问数组的元素 ,角标值/索引值从
0开始计算
静态初始化:直接我们自己给定的了元素内容,数组的长度由系统默认分配*
原生的格式写法:
数据类型[] 数组对象名 = new 数据类型[]{元素1,元素2,元素3.....} ;
数据类型 数组对象名[] = new 数据类型[]{元素1,元素2,元素3.....} ;
举例
int[] arr = new int[]{1,2,3} ;
int arr[] = new int[]{1,2,3} ;
静态初始化的简写格式
数据类型[] 数组对象名 = {元素1,元素2,元素3.....} ; 推荐的写法
数据类型 数组对象名[] = {元素1,元素2,元素3.....} ;
int[] arr = {1,2,3} ;
int arr[] = {1,2,3} ;
注:
在数组中有一个特有的属性:length
数组名称.length:获取数组长度
数组中的最大索引值: 数组名称.length-1
java.lang.ArrayIndexOutOfBoundsException:数组角标越界异常 :访问了数组中的不
存在的索引就会出现这种问题;
异常:Exception
编译时期异常:idea写代码的,编译通过不了,无法运行; 语法有问题;
运行时期异常: 开发者在编写代码的时候,大部分逻辑性不严谨,比如:
数组的5个元素,角标最大4,你访问角标5
1)最值问题:最大值
数组元素查表法 :通过数组名称[索引值]确定元素
基本元素查询:查询数组中某个元素的角标值
int[] arr = {87,56,13,24,17};
弊端:
每次查询元素的时候,都是从头查到尾
高级数组中的元素:二分搜索法(折半查询) :高级查询算法
2)冒泡排序
冒泡排序:
两两比较,将较大的值往后放,第一次比较完毕,最大值出现在最大索引处;
依次这样比较,可以得到排好序的数组;
规律
1)两两比较,将较大的值往后放,
2)第一次有0个不比
第二次有1个不比
....
每次比较,就会减少一次比较
比较的次数:数组长度-1次
六,面向对象
面向对象思想特点:
1)更符号生活中的思想行为习惯
2)让复杂的事情简单化
3)让我们从执行者变成指挥者
举例:生活中的例子
面向对象的三大特征:
封装,继承,多态
1)基本类型作为形式参数和引用类型(数组,类,接口) 作为形式参数的特点?
基本类型作为形式参数,形式参数改变不影响实际参数;
引用类型作为形式参数,形式参数的改变直接影响实际参数;
2.类 描述现实世界事物的一组属性和
行为,代码体现出来对某个事物的描述
以及在对应的主方法中测试
描述学生事物
属性:姓名,年龄,性别...
行为:学习,玩游戏,抽烟...
具体的学生: ---- 描述具体的学生事物----代码中体现创建这个类对象:创建具体的对象的格式
类名 对象名 = new 类名();
张三,20,男 对象名.成员变量名 = 赋值;//成员变量赋值
学习JavaEE 对象名.成员方法名(); //调用成员
使用面向对象方式描述这个学生事物 --定义一个类, 类Java中最基本单元
属性:姓名,年龄,性别...
行为:学习,玩游戏,抽烟...
具体的学生: ---- 描述具体的学生事物----代码中体现创建这个类对象:创建具体的对象的格式
类名 对象名 = new 类名();
张三,20,男 对象名.成员变量名 = 赋值;//成员变量赋值
学习JavaEE 对象名.成员方法名(); //调用成员
使用面向对象方式描述这个学生事物 --定义一个类, 类Java中最基本单元
测试类: 里面就主方法main
具体的学生: ---- 描述具体的学生事物----代码中体现创建这个类对象:创建具体的对象的格式
类名 对象名 = new 类名();
张三,20,男 对象名.成员变量名 = 赋值;//成员变量赋值
学习JavaEE 对象名.成员方法名(); //调用成员方法
具体的学生: ---- 描述具体的学生事物----代码中体现创建这个类对象:创建具体的对象的格式
类名 对象名 = new 类名();
张三,20,男 对象名.成员变量名 = 赋值;//成员变量赋值
学习JavaEE 对象名.成员方法名(); //调用成员方法
七,封装
以后:描述事务的时候,需要定义类,类中的所有的成员变量(现实世界事物的属性)
,必须都是私有化private;
封装:
就是将显示世界事物的属性隐藏了(加入一个关键字private),私有的,无法直接访问的,对外数据的安 全性!(外界不能访问的)对外提供一个方法,公共的(public)访问方法(setXXX()/getXXX())
注意事项:
以后在书写的代码的时候,写一个类,描述真是存在事物的属性的时候,需要属性(英文单词字母全部 小写)全部加入private
面试题:
private关键字的特点?
1)被private修饰的成员变量以及成员方法只能在本类中访问
2)可以修饰成员变量也可以成员方法,就是为了外界不能直接访问
3)被private修饰的成员变量/成员方法可以间接的通过通过的方法访问;
private关键字的特点?
1)被private修饰的成员变量以及成员方法只能在本类中访问
2)可以修饰成员变量也可以成员方法,就是为了外界不能直接访问
3)被private修饰的成员变量/成员方法可以间接的通过通过的方法访问;