day05_方法
1. 方法概述
1.1. 什么是方法
- 方法是完成某一个特定功能的代码块
1.2. 方法基本使用
-
把一些重复代码进行抽取(封闭)思想
-
调用格式:
方法名();
注:
- 方法必须先创建才可以使用,该过程称为方法定义
- 方法创建后需手动调用才执行,该过程称为方法调用
1.3. 定义方法格式
修饰符 返回值类型 方法名(参数列表){
//代码(略)
return 结果;
}
-
格式解析:
- 修饰符:目前为止,固定写
public static
即可 - 返回值类型:表示方法运行结果的数据类型
- 参数列表:方法在运算过程中的未知数据,调用者调用方法时传递
return
:将方法执行后的结果带给调用者,结束方法
注:
return
结束,这里的结束在开发中,我们正确的叫法称为方法的返回值 - 修饰符:目前为止,固定写
2. 方法案例
2.1. 定义方法的两个明确
-
明确参数列表
该方法完成一个功能需要的参数个数与参数类型,要明确给出
-
明确返回值类型
方法的功能完成后,确定是否有结果返回,如果有,用
return
将结果返回给调用者;如果没有,返回值类型用void
注:除了返回值类型为
void
时,其他情况下都要有return
2.2. 案例与练习
2.2.1. 求两个数的最值
package cn.zhuo_02;
import java.util.Scanner;
/**
* @Auther: 不学无墅
* @Date: 2023/7/11 10:32
* @Desc: 需求:求两个数的最值(方法实现)
*/
public class Demo1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入需要比较的两个数");
//输入两个数
int x = sc.nextInt();
int y = sc.nextInt();
//方法的调用
int max = max(x,y);
int min = min(x,y);
//得出结果后输出最值
System.out.println("最大值为:"+max);
System.out.println("最小值为:"+min);
}
/**
* 求最大值的方法
*/
public static int max(int a, int b){
//比较
if (a > b){
return a;
}
return b;
}
/**
* 求最小值的方法
*/
public static int min(int a,int b){
if (a > b){
return b;
}
return a;
}
}
2.2.2. 一维数组元素反转
package cn.zhuo_02;
/**
* @Auther: 不学无墅
* @Date: 2023/7/11 10:33
* @Desc: 需求:把一维数组的元素反转(方法实现)
*/
public class Demo2 {
public static void main(String[] args) {
//定义一个一维数组
int[] arr ={11,22,33,44,55};
//方法的调用
change(arr);
}
/**
* 反转数组元素的方法
*/
public static void change(int[] arr){
//数组中元素的反转代码实现
for (int i = 0; i < arr.length/2; i++) {
int temp = arr[i];
arr[i] =arr[arr.length-1-i];
arr[arr.length-1-i] = temp;
}
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length-1){
System.out.print(arr[i]+"]");
}else{
System.out.print(arr[i] + ",");
}
}
}
}
2.2.3. 冒泡排序(方法实现)
package cn.zhuo_02;
/**
* @Auther: 不学无墅
* @Date: 2023/7/11 10:56
* @Desc: 需求:冒泡排序(方法实现)
*/
public class Demo3 {
public static void main(String[] args) {
//定义一个一维数组
int[] arr ={15,22,66,10,82,46};
//方法的调用
maoPao(arr);
}
/**
* 冒泡排序方法
*/
public static void maoPao(int[] arr){
//冒泡排序实现代码
for (int i = 0; i < arr.length -1; i++) {
for(int x = 0; x< arr.length -1- i; x++){
if(arr[x] > arr[x+1]){
int temp = arr[x];
arr[x] = arr[x+1];
arr[x+1] = temp;
}
}
}
//遍历经过冒泡排序之后的数组
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length-1){
System.out.print(arr[i]+"]");
}else{
System.out.print(arr[i] + ",");
}
}
}
}
2.2.4. 选择排序(方法实现)
package cn.zhuo_02;
/**
* @Auther: 不学无墅
* @Date: 2023/7/11 11:22
* @Desc: 需求:选择排序(方法实现)
*/
public class Demo4 {
public static void main(String[] args) {
//定义一个一维数组
int[] arr ={15,22,66,10,82,46};
//方法的调用
xuanZe(arr);
}
/**
* 选择排序方法实现
*/
public static void xuanZe(int[] arr){
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if (arr[j]< arr[i]){
int temp =arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
//遍历经过选择排序之后的数组
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length-1){
System.out.print(arr[i]+"]");
}else{
System.out.print(arr[i] + ",");
}
}
}
}
2.2.5. 二分查找(方法实现)
package cn.zhuo_02;
/**
* @Auther: 不学无墅
* @Date: 2023/7/11 11:28
* @Desc: 需求:二分查找(方法实现)
*/
public class Demo5 {
public static void main(String[] args) {
//定义一个有序的一维数组
int[] arr = {11,22,33,44,55,66};
int value = 55;
//方法的调用
erFenChaZhao(arr,value);
}
/**
* 二分查找的方法
*/
public static void erFenChaZhao(int[] arr ,int value){
//定义最大最小索引
int max = arr.length-1;
int min = 0;
//计算中间索引
int mid = (max + min )/2;
while(value != arr[mid]) {
if (value < arr[mid]) {
max = mid - 1;
}else{
min = mid + 1;
}
mid = (max + min)/2;
}
System.out.println("查找的值的索引是:"+mid);
}
}
2.2.6. 比较三个数的大小
package cn.zhuo_02;
import java.util.Scanner;
/**
* @Auther: 不学无墅
* @Date: 2023/7/11 11:38
* @Desc: 需求:比较三个数大小(方法实现)
*/
public class Demo6 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//提示输入三个数
System.out.println("请输入三个数:");
//数据接收
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
//方法的调用
max(a,b,c);
}
/**
* 比较三个数的大小
*/
public static void max(int a, int b,int c){
//比较过程
int m = a > b ? a : b;
int n = m > c ? m : c;
System.out.println("最大值为:"+n);
}
}
2.2.7. 计算1~100的求和方法
package cn.zhuo_02;
/**
* @Auther: 不学无墅
* @Date: 2023/7/11 12:12
* @Desc: 需求:定义计算1-100的求和方法
*/
public class Demo7 {
public static void main(String[] args) {
//方法的调用,和返回值的接收
int n = getHe();
System.out.println(n);
}
/**
*计算1~100的求和方法
*/
public static int getHe(){
int num = 0;
for (int i = 1; i <= 100; i++) {
num += i;
}
return num;
}
}
2.2.8. 求三个数的和
package cn.zhuo_02;
import java.util.Scanner;
/**
* @Auther: 不学无墅
* @Date: 2023/7/11 12:13
* @Desc: 需求:求三个数的和(方法实现)
*/
public class Demo8 {
public static void main(String[] args) {
//输入三个数
System.out.println("请输入三个数:");
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = sc.nextInt();
//方法的调用
int num = getNum(a, b, c);
System.out.println(num);
}
public static int getNum(int a,int b,int c) {
//三个数相加实现
int num = a+b+c;
return num;
}
}
2.2.9. 根据要求打印99乘法表
package cn.zhuo_02;
import java.util.Scanner;
/**
* @Auther: 不学无墅
* @Date: 2023/7/11 12:14
* @Desc: 需求:根据用户输入,打印99乘法表(方法实现)
*/
public class Demo9 {
public static void main(String[] args) {
//用户输入
Scanner sc = new Scanner(System.in);
System.out.println("打印乘法表的前几行?");
int number = sc.nextInt();
//调用方法并输出
Jiu(number);
}
/**
* 打印九九乘法表的方法
*/
public static void Jiu(int num){
for (int i = 1; i <= num; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + i * j + "\t");
}
System.out.println();
}
}
}
3. 方法小结
3.1. 定义方法注意事项
-
定义位置:类中方法外,不能嵌套定义
-
方法必须先定义,再使用
-
void表示无返回值,不需要书写return
-
不能在return后面写代码,return意味着方法结束,所有后面的代码记永远都不会执行,属于无效代码
-
定义方法时()中的参数,我们称之为:形式参数,在调用该方法时传递的参数,我们称之为:实际参数
-
你可以不接收返回的值,但你必须给出参数
3.2. 调用方法的三种形式
- 直接调用:直接写方法名进行调用
public static void main(String[] args){
print();
}
public static void print(){
System.out.println("方法被调用");
}
- 赋值调用:调用方法,在方法前面定义变量,接收方法返回值
public static void main(String[] args) {
int sum = getSum(5,6);
System.out.println(sum);
}
public static int getSum(int a,int b) {
return a + b;
}
- 输出语句调用:在输出语句中调用方法
public static void main(String[] args) {
System.out.println(getSum(5,6));
}
public static int getSum(int a,int b) {
return a + b;
}
注:不能用输出语句调用返回值类型为void
类型的方法,因为方法执行后没有返回结果,也就打印不出任何内容
4. 方法重载
4.1. 方法重载概述
- 在同一个类中,具有相同的方法名,参数列表不同,与返回值无关
- 注:参数列表不同——个数不同、数据类型不同、顺序不同
- 重载仅对应方法的定义,与方法的调用无关
5. 方法的参数传递
5.1. 方法参数传递基本类型
- 基本数据类型的参数,形参改变不影响实参
- 结论依据:每个方法在栈内存中,都会有独立的栈空间,方法运行结束后就会弹栈消失
5.2. 方法参数传递引用类型
- 对于引用类型的参数,形参的改变会影响实参的值(如:数组)
- 引用数据类型的传参,传入的是地址值,内存中会造成两个引用指向同一个内存的效果,所以即使方法弹栈,堆内存中的数据也已经是改变后的结果