方法封装和数组
1.方法封装
1.1秘籍
一匡 二看 三封装
一匡
找核心代码
二看
上看找参数
核心代码中是否存在变量并非在和核心代码中定义,这就是外来数据/参数变量
下看找返回
找出当前代码继续运行,是否有需要核心代码中数据内容
删除核心代码, 代码如果可以正常编译,没有返回值,如果不行,有返回
三封装
完成代码封装操作,完成方法声明,完成文档注释
1.2 案例-1
1.2.1 未封装代码功能实现
/*
3. 完成30位以内的斐波那契数列
1 1 2 3 5 8 13 21 34 55 89 144 ...
*/
public class HomeWork5 {
public static void main(String[] args) {
int count = 50;
int n1 = 1;
int n2 = 1;
System.out.println(1);
System.out.println(1);
// count 是目标所需的数据总个数 。- 2是因为斐波那契数列前两位确定
for (int i = 1; i <= count - 2; i++) {
int temp = n2;
n2 += n1;
n1 = temp;
System.out.println(n2);
}
}
}
1.2.2 方法封装分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qb7PNTVI-1666791362752)(E:/千峰教育/Day08/img/01-方法封装三部曲.png)]
1.2.3 封装之后代码结果
public class HomeWork5 {
public static void main(String[] args) {
int count = 50;
fibonacci(count);
}
/**
* 根据用户指定数据个数展示,展示对应个数斐波那契数列
*
* @param count 用户指定的斐波那契数列数据个数
*/
public static void fibonacci(int count) {
int n1 = 1;
int n2 = 1;
System.out.println(1);
System.out.println(1);
// count 是目标所需的数据总个数 。- 2是因为斐波那契数列前两位确定
for (int i = 1; i <= count - 2; i++) {
int temp = n2;
n2 += n1;
n1 = temp;
System.out.println(n2);
}
}
}
1.3 案例-2
1.3.1 未封装代码功能实现
/*
6. 例如:
输入 5 8;
计算 5 + 6 + 7 + 8;
输出 26.
*/
public class HomeWork6 {
public static void main(String[] args) {
int num1 = 15;
int num2 = 8;
int sum = 0;
if (num1 > num2) {
/* 1 好懂
temp 临时变量
int temp = num1;
num1 = num2;
num2 = temp;
*/
// 2 省空间
num1 += num2; // num1 = 23 num2 = 8
num2 = num1 - num2; // num1 = 23 num2 = 15
num1 = num1 - num2; // num1 = 8 num2 = 15
}
for (int i = num1; i <= num2; i++) {
sum += i;
}
System.out.println(sum);
}
}
1.3.2 方法封装分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFJPGNFm-1666791362753)(E:/千峰教育/Day08/img/02-方法封装三部曲.png)]
1.3.3 封装之后代码结果
/*
6. 例如:
输入 5 8;
计算 5 + 6 + 7 + 8;
输出 26.
*/
public class Demo1 {
public static void main(String[] args) {
int num1 = 15;
int num2 = 8;
int sum = getSumBetweenTwoNumber(num1, num2);
System.out.println(sum);
}
/**
* 计算用户指定的两个整数之间所有数据之和
*
* @param num1 用户指定的第一个数据,建议 num1 < num2
* @param num2 用户指定的第二个数据
* @return 两个数据之间的所有整数之和
*/
public static int getSumBetweenTwoNumber(int num1, int num2) {
int sum = 0;
if (num1 > num2) {
// 2 省空间
num1 += num2; // num1 = 23 num2 = 8
num2 = num1 - num2; // num1 = 23 num2 = 15
num1 = num1 - num2; // num1 = 8 num2 = 15
}
for (int i = num1; i <= num2; i++) {
sum += i;
}
// 复制粘贴代码,需要补充返回值操作
return sum;
}
}
1.4 案例-3
1.4.1 未封装代码功能实现
public class HomeWork4 {
public static void main(String[] args) {
int num1 = 10;
int num2 = 5;
// 【思路 B】
int ret = num1 - num2;
// 数据处理模块
if (ret < 0) {
ret = -ret;
}
// 数据结果展示模块
System.out.println(ret);
}
}
1.4.2 方法封装分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ajMG0oCJ-1666791362754)(E:/千峰教育/Day08/img/03-方法封装三部曲.png)]
1.4.3 封装之后代码结果
public class HomeWork4 {
public static void main(String[] args) {
int num1 = 10;
int num2 = 5;
int ret = getAbs(num1, num2);
// 数据结果展示模块
System.out.println(ret);
}
/**
* 获取两数之差的绝对值
*
* @param num1 int 类型数据
* @param num2 int 类型数据
* @return 两个整数之差的绝对值
*/
public static int getAbs(int num1, int num2) {
int ret = num1 - num2;
return ret >= 0 ? ret : -ret;
}
}
2.数组
2.1生活中的数组案例
停车场
2.2 Java开发中需要利用数组方式解决的的问题
如果每一个数据对应一个单独变量,会导致
1. 代码冗余!!阿里巴巴 Java 开发规约中要求。单一方法最多 80 行
2. 针对于变量的操作相当麻烦。几乎不可能!!
3. 代码阅读性极差!!
4. 代码维护性极差!!!
2.3 Java 中定义数组的格式
格式:
数据类型[] 数组名 = new 数据类型[容量];
赋值号左侧:
数据类型:
明确当前数组存储的数据类型,而且严格遵守数据类型一致化要求,有且只能存储目前数据类型。
例如:
停车场 ==> 停车!!!
停车场 ==> 放养 不合适!!!
衣柜 ==> 放衣服
衣柜 ==> 停车 不合适!!!!
[]:
1. 表明当前定义的类型为数组类型
2. 数组名是一个【引用数据】类型
【名词解释,引用数据类型】
引用数据类型,类似与文章中的标记/引用,具备条转型和指向性,指向另一个空间,另一个数据。
数组名:
1. 当前数组数据的整体名称,对应当时数组空间内容,操作数组【非常重要的名称】
2. 数组名是一个【引用数据类型】的变量
赋值号右侧:
new:
1. 在内存【堆区】,申请当前数组所需的内存空间,内存空间的计算方式是【数据类型 * 容量】
【名称解释,内存堆区】
仓库,内存的仓库,程序可以在内存中申请一块空间用于存储开发所需的数据内容。
2. new 关键字会清空申请内存空间中的所有参与数据内容,打扫卫生
【清理数据】
计算机为例降低对于硬件的损坏,所有使用硬件的程序,不会清理原本在影片,内 存留有的数据内容,需要下一个使用者在使用之前打扫。
数据类型:
前后呼应,要求和赋值号左侧的数据类型必须一致,严格遵守从数据类型一致化要求,明 确当前数组有且只能存储指定类型。
[容量]:
1. 明确当前数组可以存储对应数据类型的总个数
2. 【重点】数组的容量一旦确定,无法修改。
2.4 Java 数组案例
/*
格式 :
数据类型 [] 数组名 = new 数据类型[容量];
定义一个 int 类型是数据, 数组容量为 10 ;
数组名 arr array 简拼
*/
int [] arr = new int[10];
操作数组必须有下表!! 需要明确有效小标的范围和使用
【有效下标】
1. 数组的下标从 0 开始
2. 数组的容量 -1 结束
例如 :
int [] arr = new int[10];
使用格式
数组名【有效下标】
例如:
arr[5] == > 可以操作数组名为 arr 数组中小标为 5 的元素, 支持赋值和取值操作。
数组代码展示:
int [] arr = new int[10];
/*
操作使用数组中的元素,
格式
数组名【下标】
目前数组的有效下标范围是 0 - 9
*/
//给予 int 类型数组 arr 下标为0 的元素赋值 10
arr[0] = 10;
arr[5] = 20;
//取值 int 类型数组 arr 下标为 0 和 5 的元素存储数据内容
System.out.println(arr[0]);
System.out.println(arr[5]);
2.5 数组和循环之间关系
1. 数组的下标是一个等差数列,同时数组的空间存在[连续性]
2. for 循环小括号中有三个条件,可以和数组的下标完美配合
利用循环给予 int 类型数组赋值操作
int[] arr = new int[10];
/*
补充知识点:
数组名.length == > 获取当前数组的容量
.表示的
length 是数组的属性
循环从 0 开始, 小于数组的容量结束,目前情况下有执行循环过程
进行赋值 操作
*/
for (int i= 0;i < arr.length; i++) {
arr[i] = i * 5;
}
利用循环 给予 int 类型数组取值操作
//利用循环进行取值操作
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
2.6 数组内存分析图【重点】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EF0YXOCW-1666791362756)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20221026163359451.png)]
-
数组操作和算法【重点】
3.1 指定数组所有数据求和
指定数组: int[] arr = {1,3,5,4,2,6,8,9}; //大括号里面的数据内容就是当前数组的数据内容,不同的数据之间使用,逗号隔开; //数组的容量由目前的数据个数来决定.
int[] arr1 ={1,5,4,6,9,8,15}; int sum = 0; //利用循环遍历数组 for (int i = 0; i < arr1.length; i++) { sum += arr[i]; } System.out.println("数组的元素之和:" + sum);
3.2 找出指定数组中所有元素最大值下标位置
指定数组: int[] arr = {1,5,6,4,8,9,10}; 假设: 找出一参照物, 以数组中下标为 0 的元素对应数据假设为最大值。 两两比较,如果发现存在下标对应数据大于当前存储下标数据,存储较大值下标。
//定义一个变量初始化为 0 假设下标为 0 的元素为最大值【参照物】 int[] arr1 ={1,5,4,6,9,8,15}; int index = 0; for (int i = 1;i < arr1.length; i++) { // 利用 if 判断如果发现index 下表对应元素小于当前 i 元素 if (arr1[index] < arr[i]) { index = i; } } //展示数组中的最大值下标位置 System.out.println("数组中最大值下标位置:" + index);
3.3 数组元素内容逆序
目标数组: int[] arr1 ={1,5,4,6,9,8,15}; ==> 逆序操作: {15,8,9,6,4,5,1}; 数据交换次数是数组容量 / 2 ==> arr1.length / 2
//数组元素内容逆序 //循环控制数据交换的次数, 数据容量 / 2 int[] arr2 = {1, 3 , 5 , 7 , 9 , 2 , 4 , 6 , 8 , 10}; for (int i = 0;i < arr2.length / 2; i++) { int temp = arr2[i]; arr2[i] = arr2[arr2.length - 1 - i]; arr2[arr2.length - 1 - i] = temp; } for (int i = 0; i < arr2.length; i++) { System.out.print(arr2[i] + " "); }
次数是数组容量 / 2 ==> arr1.length / 2
```java
//数组元素内容逆序
//循环控制数据交换的次数, 数据容量 / 2
int[] arr2 = {1, 3 , 5 , 7 , 9 , 2 , 4 , 6 , 8 , 10};
for (int i = 0;i < arr2.length / 2; i++) {
int temp = arr2[i];
arr2[i] = arr2[arr2.length - 1 - i];
arr2[arr2.length - 1 - i] = temp;
}
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i] + " ");
}