方法

方法的声明和定义

DEF

方法是一种语法结构,它可以把一段代码封装成一个功能,以方便重复调用

  • 提高了代码的复用性
  • 让程序的逻辑更清晰
// 例如:要计算两个数相加,计算两次
// 会发现代码重复的有很多,所以可以使用方法
int a = 10;
int b = 20;
int c = a+b;
System.out.println(c);
int a1 = 10;
int b1 = 20;
int c1 = a1 + b1;
System.out.println(c1);

可以发现使用方法可以减少很多代码冗余

public class Main {
    public static void main(String[] args) {

    int c2 =  sum(10,20);  // 直接调方法将值赋值给c2
   System.out.println(c2);
    int c3 =  sum(20,20);
    System.out.println(c3);
}
public static int sum(int a , int b){
    int c = a+b;
    return c;
}

}

方法的声明

方法分为方法头和方法体,一般情况每一个方法秉持只做一件事的原则

修饰符 返回值类型 方法名(形参列表){
    方法体代码(需要执行的功能代码);
    
return 返回值;

}

修饰符

  • public表示该方法是公共方法,可以被其他类访问
  • static表示该方法是静态方法,可以直接通过类名调用
  • void表示该方法没有返回值
  • main是方法名,是单个Java类型程序的入口方法,程序从这里开始执行
  • String[] args是参数列表,是命令行参数的字符串数组,可以用来向程序传递参数

注意:

  • 如果方法不需要返回结果,返回值类型必须申明成void (无返回值) , 此时方法内部不可以使用return 返回数据

  • 返回如果没有参数,或者返回值类型申明为void 可以称为无参数,无返回值的方法

定义方法时候有以下几个注意点:

  • 方法名称: 自己取名 , 有意义,英文小写,驼峰模式(有意义的名字)
  • 方法体代码: 完成自己需要写的功能代码即可
  • 真正需要关注的点:
  1. 分析方法是否需要申明返回值类型,
  2. 分析方法是否需要接收参数

方法的调用和参数:

调用方法,即执行该方法。发出调用的方法称为主调方法,被调用的方法称为被调用方法

int larger = max(30,40);
  1. 在main方法区调用方法,被调用的方法需要使用static修饰(静态)
  2. static方法调用使用同一个类中的方法,可以直接用方法名()调用
  3. static方法只能直接调用static方法
  4. 一个方法可以被多次调用
  5. 跨类调用static方法需要用类名.方法

注意,当:

  • 被调用方法所在的类如果和调用方法的类在同一个包下,不需要导包
  • java.lang包下的类都不需要导包

其他情况需要导包

调用

(可以理解为)调用方法的前提条件。

方法参数可以有多个参数,每个参数都需要声明类型

声明的参数是形参(形式参数)

public static int Text(int num1, int num2, int num3){
    num1++;
    ++num2;
    num3--;
    return num1+num2+num3;
}

调用方法时,必须按照参数列表的类型,顺序依次传入参数才可以调用。

传入的参数是实参(实际参数)

public static void main(String[] args){
    int num1 = 0;
    int num2 = 0;
    int num3 = 0;
    int sum =Text(num1,num2,num3);
    System.out.println(sum);
    
}

参数的传递

  • JDK1.5开始,Java支持传递同类型的可变参数给一个方法。
  • 在方法声明中,在指定参数类型后加一个省略号(…)。
  • 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数都必须在它之前声明。

public class Demo04 {
public static void main(String[] args) {
//调用可变参数的方法
printMax(12,213,421,512.4);
printMax(new double[]{1,2,3});
}

public static void printMax(double... numbers){
    if (numbers.length==0){//判断传递参数的长度
        System.out.println("No argument passed");
        return;
    }
    double result = numbers[0];//定义返回值为一个数组

    //排序
    for (int i = 1; i < numbers.length; i++) {//此处会比较numbers遍历的时候谁最大,会一直把最大的值赋值给result
        if (numbers[i]>result){
            result = numbers[i];
        }
    }
    System.out.println("The max value is"+result);
}
}

方法的重载

方法的重载
重载就是在一个类中,有相同的函数名称,但形参不同的函数。

方法的重载规则:

  • 方法名称必须相同。

  • 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。

  • 方法的返回类型可以相同也可以不相同。

  • 仅仅返回类型不同不足以称为方法的重载。

    重载中还需注意:

    可变长参数和数组的区别:

    1. 数组作为参数必须要传值,可变长参数则不一定
    2. 可变长参数只能用于参数列表的最后一个(并且长参数优先度低于其他类型);数组则不一定
    3. 可变长参数只能在参数列表出现,数组可以定义局部变量

    注:两者可以同时在同一个方法的参数列表中出现。但时参数列表只有数组和可变长度参数不同时不是重载方法(不能同时出现)

值传递中的内存原理

image-20230811212715921

基本类型的值传递当不调用方法时,或者没有接收值的时候,无法传递

例如

 public static void main(String[] args) {
int b =10;
test(b);
System.out.println(b);
此时输出依然是10
 }

 public static void test(int b){

     b=30;

 }

当有接收值的时候:此时会将两个局部变量将值传递

public static void main(String[] args) {
int b =10;
b=test(b);
System.out.println(b);

     }
public static void test(int b){
     b=30;
 }
此时输出是30

image-20230811212442527

但是当传递类型为引用类型的时候:方法指定的是堆中的同一个地址值,因此会改变数组中的大小(与基本类型的区别

,基本类型传递的是真实的值)

因此形参的改变会影响实际输出的值

所以此时的输出值为10和6;

是因为引用类型的值传递,传递的是物理地址,

    public static void main(String[] args) {
        int []a ={10};
        System.out.println(a[0]);
        int []arr = new int[]{b};
        test(a);
        System.out.println(a[0]);
    }

public static void test(int a[]){

        a[0] = 6;
        a = new int[]{4};

    }

image-20230811213505799