格式
for(初始化语句;条件表达式;控制体或者步长语句){ 循环体语句; }
执行流程
初始化语句对当前变量赋值,执行一次; 判断条件表达式是否成立,如果成立,执行循环体语句------>执行控制体语句 继续判断条件表达式是否成立,如果成立,执行循环体语句------>执行控制体语句 for结束条件当前条件表达式不成立的时候,for循环结束!
如何获取每个位上的数据呢?
举例:153 获取个位 int ge = 153 % 10(对10求余) 3 获取十位: int shi = 153 /10(取整) % 10(取整的结果对10求余)5 获取百位: int bai = 153/100; 1
格式: 基本格式:
while(初始化语句以及条件表达式){ 循环体语句; 步长语句(控制体语句) ; }
扩展格式(推荐):
初始化语句; while(条件表达式){ 循环体语句; 步长语句(控制体语句) ; }
执行流程
1)首先初始化语句进行赋值 2)判断条件表达式是否成立,如果成立,执行循环体语句 再次执行步长语句; 3)继续判断条件表达式是否成立,如果成立,执行循环体语句 再次执行步长语句; … 4)当条件表达式为false,不成立,while循环语句结束
1)从格式上不太一样 2)从内存角度:(是否节省内存空间) for循环:for循环语句结束,变量从内存中释放掉了,节省内存空间(优先) while循环:while循环语句结束,依然可以访问变量,耗费内存空间 3)应用场景:是否明确次数 针对for循环:(使用居多) 明确循环次数 举例: == :基本类型: int a = 10 ; int b = 20 ; 模拟用户登录, 给三次机会! (String类:equals()) 针对while循环:(使用:仅此for) :不明确循环次数 举例: 猜数字游戏: (不知道猜多少次,能猜中!) 键盘录入一个数据
==两个死循环 ==
格式1: for( ; ; ){ 循环体语句; }
格式2 :(推荐) while(true){ 循环体语句; }
Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。 取随机数的方法 使用: public static double random() :取值范围[0.0,1.0) static:静态的 (面向对象讲) 需求:使用Math类中的方法 random()获取一个1-100之间的随机数 int number = (int)(Math.random()*100+1) ;
格式:
初始化语句; do{ 循环体语句; 步长语句(控制体语句) ; }while(条件表达式) ;
执行流程:
1)初始化语句赋值 2)直接执行循环体语句---->步长语句—>条件表达式 … …
特点:循环体至少执行一次 (它和while,for的区别)
使用Math类中的random产生一个1-100之间的随机数,键盘录入一个数据然后进行比较 统计总共多少次猜中了
import java.util.Scanner; class Random { public static void main(String[] args) { int num = (int)(Math.random()*100 + 1); int count = 0 ; while(true){ Scanner sc = new Scanner(System.in) ; System.out.println("请您输入一个要猜的数据:") ; int guess = sc.nextInt() ; if(guess > num){ System.out.println("猜的数据大了") ; count += 1; }else if(guess < num){ System.out.println("猜的数据小了") ; count += 1; }else{ System.out.println("猜中了!!!") ; break ; } } System.out.println("次数为"+count+"次"); } }for(初始化语句;条件表达式;步长语句){ //循环体语句 for(初始化语句;条件表达式;步长 语句){ } }
转移字符:
\t : 制表符号 ----->类似于文本文件中那个tab键 :缩进 \n : 换行符号 后面学习:IO流(输入/输出) : windows操作系统:换行符号"\r\n"
break :中断,结束 continue: 结束当前循环,立即进入下一次循环 return :结束方法方法去使用的!(结合方法) break:中断,结束的意思 不能单独使用,没有意义! 在switch中以及循环中使用! 循环中使用: 1)可以在单层循环中使用 2)早期的使用:用在for循环嵌套中使用(外层循环,内层循环)
标签语句
给外层循环/内层循环中起一个名字 格式:标签名称:for(初始化语句;条件表达式;步长语句){…} 标签名称:for(){} 循环嵌套:应用场景: 后期使用: 增强for循环: 遍历集合 类上于: HashMap<String,ArrayList<>> 集合嵌套集合
概念:
将一个独立的代码块{}抽取出来并为当前这个起名字!(作用:提高代码的复用性) 使用{}将代码包裹起来,并给这个代码起一个名字:方法名 ---->以后直接使用方法名调用. {}代码块
定义方法
有返回值类型的方法的定义没有返回值类型的方法定义固定格式:
public static 返回值类型 方法名(形式参数类型1 参数名称1,形式参数类型2 参数名称2…){ 业务需求… return 结果; }
格式的详细介绍:
权限修饰符:public(公共的,访问权限足够大) static(静态) 返回值类型:数据类型(目前基本数据类型:四类八种: ) 举例:求两个数据之后 结果:int类型 方法名:遵循标识符的规则(见名知意) 单个单词:全部小写 多个单独:第一个单词小写,从第二个单词开始,每个单词首字母大写,其余小写 小驼峰命名法! 形式参数类型:数据类型(目前基本数据类型:四类八种: ) 参数名称:变量名称 return: 这个方法调用完毕了,带回具体的结果!
有返回值类型的方法调用:
1)单独调用(没有意义) 2)输出调用:不推荐 3)赋值调用:推荐
定义有具体返回值类型的方法的定义的注意事项!
1)方法和方法平级关系,不能嵌套使用! 特殊:方法递归(IO流后面讲):方法调用方法本身的一种现象! 2)定义方法注意两个明确 明确返回值类型 明确参数类型以及参数个数 3)定义方法的时候:参数类型必须携带的! public static int add(x,y){} 错误的: 因为Java是一种强类型语言:语法非常严谨的,以及格式是有要求的! 4)定义方法的时候,()后面不要出现; (目前来说没意义的方法!) 5)调用方法的时候,实际参数不需要携带数据类型
方式1:三元运算符
public static int getMax(int a,int b){ //业务: //比较a和b的最大值 return (a > b) ? a: b ; }方式2:if…else 语句
public static int getMax2(int a,int b){ //定义max变量 int max ; if(a> b){ max = a ; }else{ max = b ; } return max ; }方式1:使用中间变量+三元运算符
public static int getMax(int a,int b, int c){ //定义变量 int temp = (a > b) ? a : b ; int max = (temp > c) ? temp : c ; return max ; }方式二使用if语句实现:if嵌套
public static int getMax2(int a,int b,int c){ //定义一个max变量 int max ; if(a > b ){ if(a > c){ max = a ; }else{ max = c ; } }else{ if( b > c ){ max = b ; }else{ max = c ; } } return max ;//返回 }方式三直接采用三元运算符
public static int getMax(int a,int b, int c){ //定义变量 int max = (a>b)?((a>c)?a:c):((b>c)?b:c); return max ; }方法定义:
public static void 方法名(形式参数类型1 变量名1,形式参数类型2 变量名2…){ 直接输出语句或者其他业务操作; }
1)键盘录入行数m,列数n,输出m行和n列的
public static void printXing(int m,int n){ for(int x = 0 ; x < m ; x ++){ for(int y = 0 ; y < n ; y ++){ System.out.print("*") ; } System.out.println() ; } }打印nn乘法表
public static void printNN( int n){ for(int i =1 ;i <=n ; i++){ for(int j = 1; j<=i; j++){ System.out.print(j+"*"+i+"="+j*i+"\t"); } System.out.println(); } }没有具体返回值类型的方法调用
单独调用 赋值调用 输出调用(推荐)
方法名相同,参数列表不同,与返回值无关! 参数列表不同: 1)数据类型一样的,参数个数不同 2)参数个数一样,类型不同! 参数个数不一样,参数类型不同
数组:是可以存储元素的一种容器! 前提:元素的数据类型必须一致的!
定义格式
数据类型[] 数组名称 ; (习惯) 数据类型 数组名称[] ;
数组的初始化
1)动态初始化:指定了数组长度,系统默认给定数组的元素值. 2)静态初始化:指定了具体的元素的内容,系统默认指定数组的长度.
数据类型[] 数组名称 = new 数据类型[数组长度] ; 数据类型 数组名称[] = new 数据类型[数组长度] ; int[] arr = new int[3];
数组中元素的的访问方式:
数组名称[角标]来访问 角标(下标/索引):都是从0开始记录元素的!
数组的静态初始化 :指定数组的元素内容,系统给它默认长度
格式 标准格式
数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3…} ; 数据类型 数组名称[] = new 数据类型[]{元素1,元素2,元素3…} ;
简化格式
数据类型[] 数组名称 ={元素1,元素2,元素3…} ; 数据类型 数组名称[] ={元素1,元素2,元素3…} ;
(后期Throwable:异常的总称)
严重问题: error : 内存异常了 (通过一些第三方工具避免了!) 举例: 一些软件通过一些特殊的操作:造成软件崩溃了!
异常: Exception: 能够通过本身代码来解决问题 编译时期异常:只要不是运行时期的异常都属于编译时期(不解决,编译通过不了) RuntimeExcetion:运行时期异常 在执行过程中,由于代码结构不严谨,导致的问题!
java.lang.ArrayIndexOutOfBoundsException: 出现的原因:访问不存在的角标!就出异常了 解决方案:改动角标值即可!
java.lang.NullPointerException: 出现的原因: 某个对象都为null,还需要使用对象访问内容或者调用其他功能! 解决方案 : 只需要对某个对象做一个非空判断!(逻辑判断)
分析:假设思想(以求最小值为例) 1)将数组中第一个元素arr[0]看为最小值 2)从角标1开始遍历其他元素 2.1)分别将当前遍历的元素依次和最小值进行比较 如果当前元素小于最大值 将当前元素内容赋值min变量
public static int getMin(int[] arr){ //参照物 int min = arr[0] ;//假设第一个元素是最小值 //从角标1开始遍历其他元素 for(int x =1 ; x < arr.length ; x ++){ //比较 if(arr[x] < min){ min = arr[x] ; } } return min ; }中心思想: 将13 arr[0]–57 arr[arr.length-1]互换 将87 arr[1]—24 arr[arr.length-1-1]互换… … 保证 数组的长度/2
方法一
public static void reverse2(int[] arr){ //start:表示开启索引值 //end:表示最大索引值 for(int start = 0 ,end = arr.length-1 ; start<end ; start ++,end --){ //中间变量互换 int temp = arr[start] ; arr[start] = arr[end] ; arr[end] = temp ; } }方法二
for(int x=0; x<arr.length/2; x++) { int temp = arr[x]; arr[x] = arr[arr.length-1-x]; arr[arr.length-1-x] = temp; }数组名称[index:角标]访问元素
字符串数组: 数据类型[] 数组名称 = new 数据类型[]{元素1,…} ; String[] strs = {“星期一”,“星期二”, “星期三”,“星期四”,“星期五”,“星期六”,“星期天”} ;
import java.util.Scanner ; class ArrayTest4{ public static void main(String[] args){ //字符串数组 String[] strs = {"星期一","星期二", "星期三","星期四","星期五","星期六","星期天"} ; //创建键盘录入对象 Scanner sc = new Scanner(System.in) ; //提示并录入数据 System.out.println("请您输入一个数据(0-6):") ; int index = sc.nextInt() ; System.out.println("你要查询的是:"+strs[index]) ; } }查询数组中的元素在数组索引值
假设思想: 1)假设找不到 定义一个变量 int index = -1 ; 2)遍历数组,获取到每一个元素 如果当前元素和要查询的元素一致的话 改变index的值(将当前元素所在的角标值赋值给index) break ; 3)找不到,直接返回index
public static void findArray(int[] arr,int a){ int index = -1; for (int i = 0; i < arr.length; i++) { if (arr[i]==a) { index = i; break; } } if (index > 0) { System.out.println("该数据角标值为:"+index); } else { System.out.println("未查询到该数值"); } }冒泡排序思想
两两比较,将较大的值往后放;第一次比较完毕,最大值就出现在最大索引处! 依次这样比较: 规律: 第一次:有0个不比 第二次:有1个不比 … … 比较的次数:数组长度-1次
public static void bubboleSort(int[] arr){ for(int x = 0 ; x < arr.length-1 ; x ++){ //x = 0 ; 1 2,3 控制比较的次数 for(int y = 0 ; y < arr.length-1-x ; y++){//y表示元素的角标 if(arr[y] > arr[y+1]){ int temp = arr[y] ; arr[y] = arr[y+1] ; arr[y+1] = temp ; } } } }定义格式
数据类型[] 数组名称[] ; 数据类型[][] 数组名称 ; (推荐)
初始化格式 格式一
数据类型[][] 数组名称 = new 数据类型[m][n] ; m:表示当前二维数组中的一维数组的个数 n:表示每一个一维数组的长度
格式二
数据类型[][] 数组名称 = new 数据类型[m][] ; 数据类型[] 数组名称[] = new 数据类型[m][] ;
格式三
标准格式: 数据类型[][] 数组名称 = new 数据类型[][]{{元素1,元素2,…},{元素1,元素2…},{元素1,元素2…}};
简化格式 数据类型[][] 数组名称 = {{元素1,元素2,…},{元素1,元素2…},{元素1,元素2…}}
输出格式优雅: {{1,2,3},{4,5,6},{7,8,9}}
public static void PrintlnArray2(int[][] arr){ System.out.print("{"); for(int i= 0; i<arr.length;i++){ System.out.print("{"); for(int j=0; j<arr[i].length;j++){ if(j==arr[i].length-1 && i<arr.length-1){ System.out.print(arr[i][j]+"},"); } else if(j==arr[i].length-1 && i==arr.length-1){ System.out.print(arr[i][j]+"}"); } else{ System.out.print(arr[i][j]+","); } } } System.out.println("}"); }A:如果是n行,那么最后一行是n列。 B:每一行的第一列和最后一列的元素是1。 C:规律: 每一行的第二列开始数据是:上一行的上一列+上一行的同一列 D:把二维数组组成,然后遍历即可。 遍历的时候,注意模仿九九乘法表的遍历。否则会有很多0。
import java.util.Scanner; class YangHui{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println("请输入杨辉三角的行数:"); int n = sc.nextInt(); System.out.println("-----------------------:"); int[][] arr =new int[n][n]; for(int i =0;i<arr.length;i++){ arr[i][0] = 1; arr[i][i] = 1; } //第三行开始 for(int i=2; i<n; i++) { //第二列开始,一定要记得减去最后一列 for(int j=1; j<=i-1; j++) { arr[i][j] = arr[i-1][j-1]+arr[i-1][j]; } } //输出的时候,千万要和九九乘法表的输出类似。 for(int i=0; i<arr.length; i++){ for(int j=0; j<=i; j++){ System.out.print(arr[i][j]+"\t"); } System.out.println(); } } }一
基本类型作为形式参数进行传递,的特点: 形式参数的改变对实际参数没有影响!
class ArgsDemo{ public static void main(String[] args){ //定义两个变量 int a = 10 ; int b = 20 ; System.out.println("a:"+a+",b:"+b);//10,20 System.out.println("----------------------------") ; change(a,b) ;//实际参数 System.out.println("----------------------------") ; System.out.println("a:"+a+",b:"+b);//10,20 System.out.println("----------------------------") ; } public static void change(int a,int b){ //a,b形式参数 System.out.println("a:"+a+",b:"+b);//10,20 a = b ;//a = b =20 ; b = a + b ;//b = 20 + 20 = 40 System.out.println("a:"+a+",b:"+b);//2,40 } }二
如果形式参数是一个引用数据类型:数组 形式参数的改变对实际参数有影响!
class ArgsDemo2{ public static void main(String[] args){ //定义一个数组,静态初始化 int[] arr = {1,2,3,4,5} ; System.out.println(arr[3]) ;//4 System.out.println("-------------------------") ; change(arr) ; System.out.println(arr[3]) ;//8 } public static void change(int[] arr){ //遍历了数组 for(int x = 0 ; x < arr.length ; x ++){ //判断 if(arr[x] % 2 == 0){ arr[x] *=2 ; } } } }三
String类型是一种特殊的引用类型: 它作为形式参数,形参的改变对实际参数没有影响-----跟基本类型作为形式参数是一样!
class ArgsDemo3{ public static void main(String[] args){ String s = "hello" ; //字符串是一个常量,一旦被赋值,其值不能被更改! System.out.println(s) ; change(s) ; System.out.println(s) ; } public static void change(String s){ //String:引用类型 作为形式参数 s += "world" ; }面向对象本质其实就是一个面向过程的!(基于面向过程)
代表语言:C语言 1)需求分析 :遍历数组 2)将分析结果使用功能改进 3)需要书写功能的业务操作(将元素一一获取出来,直接输出/按照特定格式输出) 4)在main方法中调用—输出数组的元素!
面向对象思想特点:
1)符合现实世界事物生活中的思想行为习惯! 2)让我们执行者变成了指挥者(角色发生了改变!) 3)让复杂的事情简单化!
事物 描述现实世界真实存在的
Java中最基本的单元:class 类 :来描述现实世界事物的一组属性和行为的集合! 创建对象的格式:
类名 对象名 = new 类名() ; 要给具体的人赋值属性 : 对象名.成员变量= 值; (需要和数据类型保持一致!) 使用人的功能:学习,打游戏,睡觉 对象名.成员方法名() ;