Java基础学习笔记(三)—— 方法

1 方法的概念

方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集

2 方法的定义和调用

(1)无参方法的定义和调用

// 定义方法
修饰符 返回值类型 方法名 (参数列表){ 
	 方法体...// 调用方法
方法名();

例如:

// 定义方法
public static void methodName() {
    
     
	System.out.println("这是一个无参方法"); 
}

// 调用方法
methodName();

(2)有参方法的定义和调用

参数:由数据类型和变量名组成 - 数据类型 变量名

 // 定义方法
public static void 方法名 (参数1) {
    
    
	方法体;
}
public static void 方法名 (参数1, 参数2, 参数3...) {
    
    
	方法体;
}

// 调用方法
方法名(参数);
方法名(参数1,参数2);

(3)带返回值方法的定义和调用

我们经常会根据一个方法产出的结果,来去组织另一段代码逻辑,为了拿到这个方法产生得到结果,就需要定义带有返回值的方法。

// 定义方法
public static 数据类型 方法名(参数) {
    
     
	return 数据 ;
}

// 调用方法1
方法名 ( 参数 ) ; // 【无结果】

// 调用方法2.1,输出方法返回值
数据类型 变量名 = 方法名(参数);
System.out.println(变量名);
// 调用方法2.2,输出方法返回值,也叫输出调用
System.out.println(方法名(参数));

注意:

  • 方法不可以嵌套
  • 不能用输出语句调用void 类型的方法。因为方法执行后没有结果,也就打印不出任何内容
  • void表示无返回值,可以省略return,也可以单独的书写return,后面不加数据,此时代表结束一个方法
  • 在一个方法中,return下面不能编写代码,因为永远执行不到,属于无效代码
  • 有参方法调用时,参数的数量与类型必须与方法定义中的设置相匹配
  • 每个方法在被调用执行的时候,都会进入栈内存,并且拥有自己独立的内存空间,方法内部代码调用完毕之后,会从栈内存中弹栈消失
  • 方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
  • 方法的返回值通常会使用变量接收,否则该返回值将无意义
  • 方法定义中的参数为形参,方法调用中的参数为实参

案例:打印n-m之间所有的奇数

public static void main(String[] args) {
    
    
    // 5:main方法中调用print方法,传入两个实际参数
    print(20,10);
   }

//1:定义方法,名称为print
// 2:为方法添加两个int类型的形参,准备接受调用者传递过来的实参
public static void print(int n, int m){
    
    
	if(m < n){
    
    
		System.out.println("您传入的数据有误, 请检查");
		// return; 可以用于结束方法, 也就是将方法从栈内存中弹出去, 该过程称之为方法的弹栈
		return;
		// System.out.println();  直接跟在return后,无法执行的代码, 无效代码
		// 问题: return语句下面, 不是不能写代码吗?
		// 因为return在if语句中,if语句有可能不执行,那么下面的代码就有可能执行
	}
    System.out.println(n + "到" + m + "之间的奇数为:");
    // 3:方法中设计for循环,循环从n开始,到m结束
    for(int i = 20; i <= 10; i++){
    
    
        // 4:循环中加入if判断,是奇数,则打印
        if(i % 2 == 1){
    
    
            System.out.println(i);
        }
    }
}

3 方法的通用格式

public static 返回值类型 方法名(参数) {
    
    
   方法体; 
   return 数据 ;
}

在这里插入图片描述
权限修饰符

Java中有四种权限修饰符:
public > protected > (default) > private
同一个类(我自己) YES YES YES YES
同一个包(我邻居) YES YES YES NO
不同包子类(我儿子) YES YES NO NO
不同包非子类(陌生人) YES NO NO NO

注意:
(default)并不是关键字“default”,而是根本不写。

编写代码时,如果没有特殊的考虑,建议这样使用权限:

  • 成员变量使用 private ,隐藏细节
  • 构造方法使用 public ,方便创建对象
  • 成员方法使用 public ,方便调用方法

4 方法重载

方法名相同,参数也完全相同,称为方法的重复定义,是一种冲突性的错误。

方法重载:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返 回值类型无关。

参数列表

  • 个数不同
  • 数据类型不同
  • 顺序不同

注意:
识别方法之间是否是重载关系,只看方法名和参数,跟返回值无关。

重载方法调用:JVM通过方法的参数列表,调用不同的方法

5 方法的参数传递

(1)方法参数传递基本类型

传入方法中的是具体的数值

public static void main(String[] args) {
    
    
    int number = 100;
    System.out.println("调用change方法前:" + number); // 100
    change(number);
    System.out.println("调用change方法后:" + number); // 100
}

public static void change(int number) {
    
    
    number = 200;
}

在这里插入图片描述
结论:
基本数据类型的参数,形式参数的改变,不影响实际参数

结论依据:
每个方法在栈内存中,都会有独立的栈空间,方法运行结束后就会弹栈消失

(2)方法参数传递引用类型

传入方法中的是地址值

public static void main(String[] args) {
    
    
	int[] arr = {
    
    10, 20, 30};
	System.out.println("调用change方法前:" + arr[1]); // 20
	change(arr);
	System.out.println("调用change方法后:" + arr[1]); // 200
}

public static void change(int[] arr) {
    
    
	arr[1] = 200;
}

在这里插入图片描述
结论:
对于引用类型的参数,形式参数的改变,影响实际参数的值

结论依据:
引用数据类型的传参,传入的是地址值,内存中会造成两个引用指向同一个内存的效果,所以即使方法弹栈,堆内存中的数据也已经是改变后的结果

6 方法的应用

(1)数组遍历

需求:设计一个方法用于数组遍历,要求遍历的结果是在一行上的。例如:[11, 22, 33, 44, 55]

public static void main(String[] args) {
    
    
    // 1.定义一个数组,用静态初始化完成数组元素初始化
    int[] arr = {
    
    11, 22, 33, 44, 55};
    // 4.调用遍历方法
    printArray(arr);

    System.out.println("另外一段代码逻辑 ");
}

/*
    2.定义一个方法,对数组进行遍历

    1, 参数           int[] arr
    2, 返回值类型      void
 */
public static void printArray(int[] arr){
    
    

    System.out.print("[");

    for (int i = 0; i < arr.length; i++) {
    
    

        if(i == arr.length -1){
    
    
            // 如果满足条件, 说明是最后一个元素, 最后一个元素, 特殊处理
            System.out.println(arr[i] + "]");
        }else{
    
    
            // 3.遍历打印的时候,数据不换行
            System.out.print(arr[i] + ", ");
        }

    }
}

(2)获取数组最大值

需求:设计一个方法用于获取数组中元素的最大值

public static void main(String[] args) {
    
    
    // 1.定义一个数组,用静态初始化完成数组元素初始化
    int[] arr = {
    
    11, 55, 22, 44, 33};
    // 3.调用获取最大值方法,用变量接收返回结果
    int max = getMax(arr);
    //  4.把结果输出在控制台
    System.out.println(max);
}

/*
    2.定义一个方法,用来获取数组中的最大值

    1, 参数       int[] arr
    2, 返回值类型  int
 */
public static int getMax(int[] arr){
    
    
    int max = arr[0];
    for (int i = 1; i < arr.length; i++) {
    
    
        if(max < arr[i]){
    
    
            max = arr[i];
        }
    }
    return max;
}

(3)同时获取数组的最大值、最小值

需求:设计一个方法,该方法能够同时获取数组的最大值,和最小值
注意: return语句, 只能带回一个结果

public static void main(String[] args) {
    
    

    int[] arr = {
    
    11,55,33,22,44};

    int[] maxAndMin = getMaxAndMin(arr);

    System.out.println(maxAndMin[0]);
    System.out.println(maxAndMin[1]);

}

public static int[] getMaxAndMin(int[] arr){
    
    
    int max = arr[0];
    for (int i = 1; i < arr.length; i++) {
    
    
        if(max < arr[i]){
    
    
            max = arr[i];
        }
    }

    int min = arr[0];
    for (int i = 1; i < arr.length; i++) {
    
    
        if(min > arr[i]){
    
    
            min = arr[i];
        }
    }

    int[] maxAndMin = {
    
    min, max}; // 当需要返回多个结果时,可以考虑将其放入数组中返回
    return maxAndMin;
}

猜你喜欢

转载自blog.csdn.net/hu_wei123/article/details/124910798