学习007---Java方法method

method

注:本系列学习自狂神说(Java):

点击跳转至狂神说视频(bilbili)

点击跳转至狂神说网页

当前的目标是建造自己的网页!

俺的博客:startsmaple

方法类似于其他语言里的函数

语法

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

public class Demo01 {
    //main 方法
    public static void main(String[] args) {
        int sum = add(1,2);//调用
        System.out.println(sum);
        test();
    }
    //加法
    public static int add(int a,int b){
        return a+b;
    }

    public static void test(){
        for (int i = 0; i < 1000; i++) {
            if (i%5 == 0) {
                System.out.print(i + "\t");
            }
            if (i%(5*3) == 0){
                System.out.println();
            }
        }
    }
}
package com.starsmaple.method;

public class Demo02 {
    public static void main(String[] args){
        int max1 = max(10,20);//返回值int
        double max2 = max(10,30);//返回值double
        System.out.println(max1);
        System.out.println(max2);
    }


    //方法重载:相同函数名称,参数不同(个数,类型,排列顺序
    //比大小
    public static int max(int num1,int num2){
        int result = 0;
        if(num1==num2)
        {
            System.out.println("num1 = num2");
            return 0;//终止方法
        }

        if(num1>num2){
            result = num1;
        }else{
            return num2;
        }
        return result;
    }
    public static double max(double num1,double num2){
        double result = 0;
        if(num1==num2)
        {
            System.out.println("num1 = num2");
            return 0;//终止方法
        }

        if(num1>num2){
            result = num1;
        }else{
            return num2;
        }
        return result;
    }
}

java是值传递

  • 对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
  • (引用传递)对非基本类型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
int a = 10;
String str = "helloworld"

image

package com.starsmaple.method;

import java.util.Arrays;

public class test {
    public static void main(String[] args) {
        int i = 10;
        int[] arr ={10,20,30};
        String str = "helloworld";
        change(i,arr,str);
        System.out.println(i);//10
        System.out.println(Arrays.oString(arr));//[10 20 30]
        System.out.println(str);//helloworld
    }
    public static void change(int i,int[] arr,String str){
        i = 100;
        arr = new int[]{100,200,300};
        str = "rnmmsr";
    }
}

Java中在方法里的赋值都是对副本的修改,即方法新定义了一个变量,用来接收你传进去的值,而你修改时都是修改这个新定义的变量

可以使用StringBuilder.append()直接修改地址里的值

    public class test {
        private static final Logger logger = LoggerFactory.getLogger(test.class);
        public static void main(String[] args) {
            StringBuilder number = new StringBuilder("111");
            StringBuilder number01 = new StringBuilder("111");
            change(number, number01);
            System.out.println("number:" + number); // 改变
            System.out.println("number01:" + number01); // 不变
        }
        public static void change(StringBuilder number, StringBuilder number01) {
            number.append("222"); // 对象的地址值不变,但是会在原地址值上改变对应的内容
            number01 = new StringBuilder("222"); // 创建了新的对象
        }
    }

方法重载

目的:相同名称可以放入不同类型的数据处理

如:相同的比较大小函数max(),传入int类型数值和传入double类型时调用的函数不一样

ge com.starsmaple.method;

public class Demo02 {
    public static void main(String[] args){
        int max1 = max(10,20);//返回值int
        double max2 = max(10,30);//返回值double
        System.out.println(max1);
        System.out.println(max2);
    }


    //方法重载:相同函数名称,参数不同(个数,类型,排列顺序
    //比大小
    public static int max(int num1,int num2){
        int result = 0;
        if(num1==num2)
        {
            System.out.println("num1 = num2");
            return 0;//终止方法
        }

        if(num1>num2){
            result = num1;
        }else{
            return num2;
        }
        return result;
    }
    public static double max(double num1,double num2){
        double result = 0;
        if(num1==num2)
        {
            System.out.println("num1 = num2");
            return 0;//终止方法
        }

        if(num1>num2){
            result = num1;
        }else{
            return num2;
        }
        return result;
    }
}

命令行传参

package com.starsmaple.method;

public class Demo03 {
    //命令行传参
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            System.out.println("args[" + i + "]: "+ args[i]);
        }
    }
}

  1. 打开当前文件夹
  2. 退到src目录
  3. 运行并传递参数!image

可变参数

本质即数组

也叫不定项参数(从JDK1.5)

package com.starsmaple.method;

public class Demo04 {
    //可变参数
    public static void main(String[] args) {
        Demo04 demo04 = new Demo04();
        demo04.test(1,2,3,4,5,25);
        printMax(32,23,5,6,7);
    }

    public void test(int... i){
        System.out.println(i[0]);
        System.out.println(i[1]);
        System.out.println(i[2]);
        System.out.println(i[3]);
        System.out.println(i[4]);
    }
    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);
    }
}

递归

A方法内部调用 A方法

  • 递归头:什么时候不调用自身方法,如果没有头,会进入死循环
  • 递归体:什么时候需要调用自身方法
package com.starsmaple.method;

public class Demo05 {
    //递归
    //递归头:什么时候不调用自身方法,如果没有头,会进入死循环
    //递归体:什么时候需要调用自身方法

    //死循环,千万别这么做
    public static void main(String[] args) {
        Demo05 test = new Demo05();
        test.test();
    }
    public void test(){
        test();
    }
}

应用:计算阶乘

package com.starsmaple.method;

public class Demo06 {
    //计算阶乘
    public static void main(String[] args) {
        int x = f(7);
        System.out.println(x);
    }

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

图解

image

posted @ 2021-07-26 16:34  星楓  阅读(153)  评论(0)    收藏  举报