课前回顾:
1. 循环控制语句:
break:在switch中表示结束switch语句;在循环中,表示结束循环
continue:结束本次循环,进行下一次循环
2.死循环:
比较永远成立,永远是true
3.嵌套循环:
先走外层循环,进入到内层循环,内层循环就一直循环,直到内层循环结束,外层循环进行下一次循环,直到外层循环都结束了,循环整体结束
4.Random:
可以生成随机数
使用:
a.导包:import java.util.Random
b.创建对象:Random rd = new Random()
c.调用方法:
nextInt()->在int的取值范围内随机一个数
nextDouble()->在0.0 - 1.0之间随机
nextInt(int bound)->在0-(bound-1)之间随机一个数
5.数组:
a.定义:
静态初始化:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2...}->推荐
数据类型 数组名[] = new 数据类型[]{元素1,元素2...}->不推荐
简化: 数据类型[] 数组名 = {元素1,元素2}->静态初始化中极力推荐的
动态初始化
数据类型[] 数组名 = new 数据类型[数组长度]
b.获取长度
数组名.length
c.索引:元素在数组中存储的位置
从0开始的,最大索引是数组长度-1(数组名.length-1)
唯一
d.存储元素
数组名[索引值] = 值
e.获取元素
数组名[索引值]
数组名[索引值]在等号右边代表获取元素,在等号左边代表的是存储元素
arr[0] = arr1[1] -> 将arr1数组的索引1位置上的元素存储到arr数组的0索引上
f.遍历
数组名.fori
g.操作数组时容易出现的问题:
ArrayIndexOutOfBoundsException(索引越界异常)->操作的索引超出了数组索引范围
NullPointerException(空指针异常):->如果引用为null再操作就会出现
今日重点:
1.会冒泡排序(一级重点)
2.方法的四种定义格式以及调用方式(重中之重)
3.二维数组(二级重点)
第一章.冒泡排序
数组的排序,是将数组中的元素按照大小进行排序,默认都是以升序的形式进行排序,数组排序的方法很多,我们讲解的是数组的冒泡排序。
排序,都要进行数组 元素大小的比较,再进行位置的交换。冒泡排序法是采用数组中相邻元素进行比较换位。
8.1 冒泡排序图解
8.2 代码实现
public class Test01 {
public static void main(String[] args) {
//定义一个数组
int[] arr = {7,6,5,4,3};
//第一圈比较,i = 0 i<4 比较了4次
for (int i = 0; i < arr.length-1-0; i++) {
if (arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
System.out.println(Arrays.toString(arr));//按照[元素1,元素2]格式打印元素
//第二圈比较:i = 0 i<(4-1) 比较了3次
for (int i = 0; i < arr.length-1-1; i++) {
if (arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
System.out.println(Arrays.toString(arr));//按照[元素1,元素2]格式打印元素
//第三圈比较:i = 0 i<(4-2) 比较了2次
for (int i = 0; i < arr.length-1-2; i++) {
if (arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
System.out.println(Arrays.toString(arr));//按照[元素1,元素2]格式打印元素
//第四圈比较:i = 0 i<(4-3) 比较了1次
for (int i = 0; i < arr.length-1-3; i++) {
if (arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
System.out.println(Arrays.toString(arr));//按照[元素1,元素2]格式打印元素
System.out.println("======================================");
for (int j = 0; j < arr.length-1; j++) {//外层循环代表的是比较的圈数
for (int i = 0; i < arr.length-1-j; i++) {//内层循环代表的是每圈比较的次数,每圈都应该少一次比较
if (arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
第二章.二维数组
2.1二维数组的定义格式
1.概述:
一个数组中存有多个一维数组
2.定义格式:
a.动态初始化:
数据类型[][] 数组名 = new 数据类型[m][n]->推荐使用
数据类型 数组名[][] = new 数据类型[m][n]
数据类型[] 数组名[] = new 数据类型[m][n]
m:代表的是二维数组的长度(二维数组中有多少个一维数组)
n:代表的是每一个一维数组的长度(一维数组中最多有多少个元素)
b.静态初始化
数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2...},{元素1,元素2..}...}
简化:
数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2..}...}
public class Demo01Array {
public static void main(String[] args) {
//数据类型[][] 数组名 = new 数据类型[m][n]->推荐使用
int[][] arr1 = new int[3][3];
//数据类型 数组名[][] = new 数据类型[m][n]
int arr2[][] = new int[3][3];
//数据类型[] 数组名[] = new 数据类型[m][n]
int[] arr3[] = new int[3][3];
System.out.println("=====================");
//静态初始化
String[][] arr4 = {{"孙悟空","白骨精","青牛精"},{"姜子牙","纣王","妲己"},{"刘备","曹操","孙权"},{"宋江","晁盖","卢俊义"}};
}
}
2.2获取二维数组长度
1.格式:
数组名.length
//静态初始化
String[][] arr4 = {{"孙悟空","白骨精","青牛精"},{"姜子牙","纣王","妲己"},{"刘备","曹操","孙权"},{"宋江","晁盖","卢俊义"}};
System.out.println(arr4.length);
System.out.println(arr4[0].length);
2.3获取二维数组中的元素
1.格式:
数组名[i][j]
i:代表的是一维数组在二维数组中的索引位置
j:代表的是元素在一维数组中的索引位置
public class Demo02Array {
public static void main(String[] args) {
String[][] arr = {{"乔峰","虚竹","段誉"},{"张无忌","张三丰","张翠山"},{"杨过","小龙女","尹志平"}};
System.out.println(arr[0][2]);
System.out.println(arr[1][0]);
System.out.println(arr[2][2]);
}
}
2.4二维数组中存储元素
1.格式:
数组名[i][j] = 元素值
i:代表的是一维数组在二维数组中的索引位置
j:代表的是元素在一维数组中的索引位置
public class Demo03Array {
public static void main(String[] args) {
int[][] arr = new int[3][3];
//存元素
arr[0][0] = 100;
arr[0][1] = 200;
arr[0][2] = 300;
arr[1][0] = 400;
arr[1][1] = 500;
arr[1][2] = 600;
arr[2][0] = 700;
arr[2][1] = 800;
arr[2][2] = 900;
}
}
2.5.二维数组的遍历
思想:
先将每一个一维数组从二维数组中遍历出来->遍历二维数组
然后再将每一个元素从一维数组中遍历出来->遍历一维数组
public class Demo03Array {
public static void main(String[] args) {
int[][] arr = new int[3][3];
//存元素
arr[0][0] = 100;
arr[0][1] = 200;
arr[0][2] = 300;
arr[1][0] = 400;
arr[1][1] = 500;
arr[1][2] = 600;
arr[2][0] = 700;
arr[2][1] = 800;
arr[2][2] = 900;
System.out.println("=====================");
for (int i = 0; i < arr.length; i++) {//遍历二维数组,将每一个一维数组遍历出来
for (int j = 0; j < arr[i].length; j++) {//遍历的每一个一维数组
System.out.println(arr[i][j]);
}
}
}
}
2.6二维数组内存图
public class Test04 {
public static void main(String[] args) {
//代表只规定了二维数组的长度,但是没有初始化里面的一维数组,所以默认为null
int[][] arr1 = new int[3][];
//相当于在二维数组中的1索引位置上创建了一个存有1 2 3的一维数组
arr1[1] = new int[]{1,2,3};
//相当于在二维数组中的2索引位置上创建了一个长度为3的一维数组,没有元素
arr1[2] = new int[3];
//相当于在二维数组中的2索引位置上的一维数组的1索引位置上存放了100
arr1[2][1] = 100;
}
}
第三章.方法的使用
1.方法介绍以及简单方法定义(无参无返回值)
1.概述:方法就是功能,是拥有功能性代码的代码块
所以,将来我们开发时,一个功能就需要定义一个方法
2.好处:
让代码好维护
提高代码的复用性
3.通用的方法定义格式:
修饰符 返回值类型 方法名(参数){
方法体;
return 结果
}
如果一个方法没有返回值,返回值类型写void,方法体中就不用写return 结果
如果一个方法有返回值,返回值类型就写具体的数据类型,写return 结果
4.从通用定义格式上细分,分出来四种方法定义格式:
无参无返回值的方法->最简单
有参数无返回值的方法
无参数有返回值的方法
有参数有返回值的方法
5.无参数无返回值的方法定义
public static void 方法名(){
方法体
}
调用:
在其他方法中:方法名()
6.注意事项:
a.方法不调用不执行->main方法是jvm调用的
b.方法之间不能互相嵌套
c.方法的执行顺序只和调用顺序有关系(谁先调用谁先执行)
需求:定义一个方法,实现两个整数相加,将结果输出
public class Demo02Method {
public static void main(String[] args) {
//方法调用
sum();
System.out.println("我想要执行");
}
public static void sum(){
int a = 10;
int b = 20;
int sum = a+b;
System.out.println(sum);
}
}
2.无参数无返回值的方法执行流程
public class Demo01Method {
public static void main(String[] args) {
//调用
famer();//调用处
cooker();
cooker();
customer();
}
//农民伯伯
public static void famer(){
System.out.println("种菜");
System.out.println("浇水");
System.out.println("施肥");
System.out.println("拔草");
System.out.println("收割");
}
//厨师
public static void cooker(){
System.out.println("洗菜");
System.out.println("切菜");
System.out.println("炒菜");
System.out.println("尝尝");
System.out.println("装盘");
}
//顾客
public static void customer(){
System.out.println("洗手");
System.out.println("吃菜");
}
}
3.方法定义各部分解释
修饰符 返回值类型 方法名(参数){
方法体;
return 结果
}
1.修饰符:目前先写成public static
2.返回值类型:返回值的数据类型(return后面那个结果的数据类型)
3.方法名:见名知意即可
4.参数:传递到方法内部的数据 数据类型 变量名,数据类型 变量名
5.方法体:具体实现此方法(此功能)的具体代码
6.return 结果:代表将方法运行的结果返回给调用处(用户)
4.有参数无返回值的方法定义和执行流程
1.格式:
public static void 方法名(参数){
方法体
}
2.调用:
方法名(参数具体的值)
需求:定义一个方法实现两个整数相加
public class Demo03Method {
public static void main(String[] args) {
//调用处(用户)
sum(1,2);
}
public static void sum(int a,int b){
int sum = a+b;
System.out.println(sum);
}
}
5.无参数有返回值定义以及执行流程
1.格式:
public static 返回值类型 方法名(){
方法体
return 结果;
}
2.注意:结果会返给调用处(用户)
3.调用:
数据类型 变量名 = 方法名()
需求:定义一个方法,实现两个整数相加,并将结果返回
public class Demo04Method {
public static void main(String[] args) {
//调用处(用户)
int result = sum();//30 推荐使用
System.out.println(result);
System.out.println("=================");
System.out.println(sum());//不推荐
}
//定义一个方法,实现两个整数相加,并将结果返回
public static int sum(){
int a = 10;
int b = 20;
int sum = a+b;
return sum;//30
}
}
6.有参数有返回值定义以及执行流程
1.定义格式:
public static 返回值类型 方法名(参数){
方法体
return 结果;
}
2.调用
数据类型 变量名 = 方法名(具体的值)
定义方法,实现两个整数相加,将结果返回
public class Demo05Method {
public static void main(String[] args) {
//调用处(用户)
int result = sum(10,20);//30 推荐使用
System.out.println(result);
}
//定义一个方法,实现两个整数相加,并将结果返回
public static int sum(int a,int b){
int sum = a+b;
return sum;//30
}
}
7.形式参数和实际参数区别
形式参数:在定义方法的时候在小括号中定义的参数,此时并没有给值
实际参数:在调用方法的时候给参数赋予的实际的值
8.参数和返回值使用的时机
看需求
返回值:
什么时候用返回值:当调用者需要被调用方法的结果时,被调用的方法就需要将结果return
什么时候不用返回值:当调用者不需要被调用方法的结果时,被调用的方法就不需要将结果return
参数:
什么时候使用参数:
1.当定义方法的时候不确定要操作什么数据时,就需要定义参数,等着调用方法的时候给我传递具体的值
2.想将一个方法中的数据传递到另外一个方法的时候,也可以通过参数传递
9.变量作为实参使用
需求:定义一个方法,比较两个整数的大小,如果第一个参数比第二个参数大,返回true,否则返回false;
方法三要素
参数: 要
返回值:要
方法名:要
public class Demo07Method {
public static void main(String[] args) {
int i = 10;
int j = 20;
boolean compare = compare(i, j);
System.out.println(compare);
}
public static boolean compare(int a,int b){//int a = 10;int b = 20
if (a>b){
return true;
}else{
return false;
}
}
}
第四章.方法的练习
1.方法练习1(判断奇偶性)
需求:
键盘录入一个整数,将整数传递到另外一个方法中,在此方法中判断这个整数的奇偶性
如果是偶数,方法返回"偶数" 否则返回"奇数"
方法名:要
参数:要
返回值:要
public class Test01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int data = sc.nextInt();
String result = method(data);
System.out.println(result);
}
public static String method(int n){
if (n%2==0){
return "偶数";
}else {
return "奇数";
}
}
}
2.方法练习2(1-100的和)
需求 : 求出1-100的和,并将结果返回
方法名:要
参数:不要
返回值:要
public class Test02 {
public static void main(String[] args) {
int sum = sum();
System.out.println(sum);
int i = sum1(100);
System.out.println(i);
}
public static int sum(){
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum+=i;
}
return sum;
}
public static int sum1(int n){
int sum = 0;
for (int i = 1; i <= n; i++) {
sum+=i;
}
return sum;
}
}
3.方法练习3(不定次数打印)
需求:
定义一个方法,给这个方法传几,就让这个方法循环打印几次"我是一个有经验的大数据开发工程师"
方法名:要
参数 : 要
返回值:不要
public class Test03 {
public static void main(String[] args) {
method(1);
}
public static void method(int n){
for (int i = 0; i < n; i++) {
System.out.println("我是一名大数据库开发工程师");
}
}
}
4.方法练习4(遍历数组)
需求:
在main方法中定义一个数组,将数组传递到方法中,在此方法中遍历数组
public class Test04 {
public static void main(String[] args) {
//定义数组
int[] arr = {1,2,3,4};
method(arr);//0x001
}
public static void method(int[] arr){//int[] arr1 = arr 0x001
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
5.方法练习5(求数组最大值)
需求:
在main方法中定义数组,传递到另外一个方法中,在此方法中实现获取数组最大值
public class Test05 {
public static void main(String[] args) {
int[] arr = {4,5,4,5,7,5,3};
int result = method(arr);//0x001
System.out.println(result);
}
public static int method(int[] arr) {//0x001
//1.定义一个变量max用于拿两个元素之间较大的元素
int max = arr[0];
//2.遍历数组,将每一个元素获取出来
for (int i = 1; i < arr.length; i++) {
/*3.循环比较
如果max的值小于遍历出来的元素,将较大的元素重新赋值给max*/
if (max<arr[i]){
max = arr[i];
}
}
//4.直接输出max
return max;
}
}
6.方法练习6(按照指定格式输出数组元素)
需求:
1.定义一个数组 int[] arr = {1,2,3,4}
2.遍历数组,输出元素按照[1,2,3,4]
public class Test06 {
public static void main(String[] args) {
int[] arr = {1,2,3,4};
method(arr);
}
public static void method(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
//判断如果i的值变化到最大索引了,证明要输出的是最后一个元素,最后一个元素输出之后,后面直接跟]
if (i==arr.length-1){
System.out.print(arr[i]+"]");
}else{
System.out.print(arr[i]+",");
}
}
}
}
7.练习7
数组作为返回值返回
public class Test07 {
public static void main(String[] args) {
int[] arr1 = method();
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
}
public static int[] method(){
int a = 10;
int b = 20;
int sum = a+b;
int multiply = a*b;
//将sum和multiply同时返回
int[] arr = {sum,multiply};
return arr;
}
}
总结:如果参数和返回值是基本类型,我们操作的是具体的数据
如果参数和返回值是引用类型,我们操作的是地址值
第五章.方法注意事项终极版
1.方法不调用不执行
2.方法之间不能互相嵌套
3.方法的执行顺序只和调用顺序有关
4.void 和 [return 结果]不能共存
void : 代表没有返回值
return 结果:将结果返回,然后结束方法
但是void 能和 return 共存
单纯的有一个return 仅仅代表结束方法
5.一个方法中不能连续return多个返回值(if...else除外)
6.写代码时,调用方法的时候要看看我们有没有定义此方法(调用方法时要完全匹配:方法名 参数个数 参数类型)
第六章.方法的重载
需求:定义方法,完成2个整数相加,3个整数相加,4个整数相加
public class Test01 {
public static void main(String[] args) {
sum(1,2);
sum(1,2,3);
sum(1,2,3,4);
}
public static void sum(int a,int b){
int sum = a+b;
System.out.println(sum);
}
public static void sum(int a,int b,int c){
int sum = a+b+c;
System.out.println(sum);
}
public static void sum(int a,int b,int c,int d){
int sum = a+b+c+d;
System.out.println(sum);
}
}
1.概述:
方法名相同,参数列表不同,叫做方法的重载
2.什么时候可以定义重载的方法?
功能一样,但是具体实现(细节)不一样
3.什么叫参数列表不同?
参数个数不同
参数类型不同
参数类型顺序不同
4.判断是否为重载的方法和什么无关:
和参数名无关
和返回值无关
5.总结:
想判断方法是否为重载方法,只看方法名和参数列表
public static void open(){}
public static void open(int a){}
static void open(int a,int b){}
public static void open(double a,int b){}
public static void open(int a,double b){}
public void open(int i,double d){}
public static void OPEN(){}
public static void open(int i,int j){}