04-JavaSE:方法

一、方法

  • System.out.println(),在之前的章节中,我们总是在用此代码,此代码有三部分组成:

    • System是系统类

    • out是标准输出对象

    • println()是一个方法

  • 什么是方法?

    • Java方法是语句的集合,它们在一起执行一个功能
    • 方法是解决一类问题的步骤的有序集合
    • 方法包含与类或对象中
    • 方法在程序中被创建,在其他地方被引用
  • 设计方法的原则:

    • 在设计方法的时候最好保持方法的原子性,一个方法只能完成一个功能。
  • 方法的优点:

    • 使程序变得更简短而清晰
    • 有利于程序的维护
    • 可以提高程序的开发效率
    • 提高了代码的复用性

二、方法的定义

修饰符 返回值类型 方法名(参数类型 参数名){
    ...
    方法体
    ...
    return 返回值;
}

方法包含一个方法头和一个方法体

  • 修饰符:修饰符可选,告诉编译器如何调用该方法。定义方法的访问类型

  • 返回值类型:方法可能会存在返回值,returnValueType是返回值的数据类型,有的方法存在没有返回值的情况,在没有返回值的情况下,returnValueType是关键字void

  • 方法名:方法的实际名称,方法名和参数表共同构成方法签名

  • 参数类型:当方法被调用时,传递值给参数,这个值被称为实参或者变量

    • 形式参数:在方法被调用的时候,接收调用者传递值的参数。
    • 实参:调用方法时实际传给方法的值。
  • 方法体:方法体包含具体的语句,定义该方法的功能。

// 计算返回的两个整型变量数据的较大值
public class Demo16 {
    
    public static void main(String[] args){
        //10,20为实参
        int reault = max(10, 20);
        System.out.println(result);
    }
    /*
    	如下的方法声明中,max为方法名,int为返回值为int类型,public static为修饰符
    	num1和num2为形参
    */
    public static int max(int num1, int num2){
        int result;
        if (num1 > num2){
            result = num1;
        }else{
            result = num2;
        }
        return result;
    }
}

三、方法的调用

当程序调用一个方法时,程序的控制权交给了被调用的方法,当调用的方式执行结束后,控制权交还给程序。

  • 当方法返回一个值的时候,方法调用通常被当做一个值
int larger = max(30, 40);
  • 如果返回值是void,方法调用一定是一条语句,例如,方法println返回void
System.out.println("Hello, kuangshen!");

【方法的调用举例】

public class Demo16 {
    public static void main(String[] args){
        int i = 5;
        int j = 2;
        int k = max(i, j);
        System.out.println(i + " 和 " + j + " 比较,最大值是: " + k);
    }
    
    public static int max(int num1, int num2) {
        int result;
        if (num1 > num2){
            result = num1;
        }else{
            result = num2;
        }
        return result;
    }
}

​ 此程序中包含main和max方法,main方法是被JVM调用的,除此之外,main方法和其他方法没什么区别。

​ Java中只有值传递!!!

四、方法的重载

​ 有时我们一个方法中形参的类型有多种类型,像上面的取最大值的函数,只能传递int类型的数,对比int的数,但是如果需要对比的是浮点数,这就需要对上面的方法进行重载。

public static double max(double num1, double num2) {
    if (num1 > num2){
        return num1;
    }else{
        return num2;
    }
}

public static int max(int num1, int num2){
    int result;
    if (num1 > num2) {
        result = num1;
    }else{
        result = num2;
    }
    return result;
}

当调用max函数时,传递的是int类型的实参,那么就会调用形参是int的函数,如果传递的实参是浮点数,那么会调用形参是double的方法。

一个类拥有两个同名的方法,但是由于形参的类型不同,方法的签名也就不同,Java是根据方法的签名来判断那个方法被调用的。

  • 方法重载的规则:
    • 方法名称必须相同
    • 参数列表必须不同(个数相同、或类型不同、参数列表顺序不同)
    • 方法的返回类型可以相同也可以不同
    • 仅仅返回类型不同不足以成为方法的重载

五、拓展命令行传参

有时希望运行程序的同时还传递给消息,这种要考传递命令行参数给main函数。

传递的消息在执行程序时紧跟在程序名字后面。

public class CommandLine {
    public static void main(String[] args[]) {
        for (int i = 0; i < args.length; i++){
            System.out.println("args[" + i +"]: " + args[i]);
        }
    }
}
javac CommandLine.java
java CommandLine this is a command line 200 -100
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100

六、可变参数

JDK1.5 开始,java支持传递同类型的可变参数。

typeName... parameterName

一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通的参数必须在它之前声明。
可变参数在编译为字节码后,在方法签名中是以数组形态出现的,如果两个方法签名编译后的是一致的话,是不能编译通过的,不可以作为方法重载。

public class Demo17 {
    public static void main(String args[]) {
        // 调用可变参数的方法
        printMax(34, 3, 3, 2, 56.5);
        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++){
    		if (numbers[i] > result) {
    			result = numbers[i];
    		}
    	}
    	System.out.println("The max value is " + result);
    }
}

七、递归

  • 递归包含两部分
    • 递归头:什么时候不需要调用自己的方法,如果没有头,将陷入死循环
    • 递归体:什么时候需要调用自身的方法
public static void main(String[] args){
    System.out.println(f(5));
}

public static int f(int n){
    if (1 == n){
        return 1;
    }else{
        return n*f(n-1);
    }
}

​ 递归其实是方便了程序员难为了机器,递归可以通过数学公式很方便的转换为程序。其优点就是易理解,容易编程。但递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。(会占用大量的内存空间)

能不用递归就不用递归,递归可以用来迭代或代替

posted @ 2023-01-11 22:15  Coilin  阅读(14)  评论(0编辑  收藏  举报