04-静态方法

95 阅读7分钟

静态方法

1. 方法的概念

概念:实现特定功能的一段代码,可反复使用。

2. 方法的定义格式

public static void 方法名称( ){ //方法主体 }

3.方法的定义位置

定义在类中,与main方法并列。

4. 方法的调用

在需要调用方法的位置直接书写方法名即可。

5. 编写方法优化诗句打印

package com.xxx.test4;

/**
 *  使用方法优化诗句打印1
 */
public class TestMethod1 {
    public static void main(String[] args) {
        System.out.println("床前明月光");
        printSign();

        System.out.println("疑是地上霜");
        printSign();

        System.out.println("举头望明月");
        printSign();

        System.out.println("低头思故乡");
        printSign();
    }

    public static void printSign(){
        for(int i = 1;i <= 10;i++){
            System.out.print("-");
        }
        System.out.println();
    }
}

6. 单个参数

使用方法优化诗句打印2 : 使用单个参数让用户灵活的控制横线的个数

package com.xxx.test4;

/**
 *  使用方法优化诗句打印2 : 使用单个参数让用户灵活的控制横线的个数
 */
public class TestMethod2 {
    public static void main(String[] args) {
        System.out.println("床前明月光");
        int a = 10;
        printSign(a); // 局部变量的赋值

        System.out.println("疑是地上霜");
        printSign(5);


        System.out.println("举头望明月");
        int b = 3;
        int c = 5;
        printSign(b + c); // 这种方式也可以 但是不推荐 因为可读性较差 很容易会误认为传入两个参数

        System.out.println("低头思故乡");
        printSign(10 * 2);
    }

    /**
     *
     * @param num 为形参 形参规定了参数的:个数、类型、顺序
     */
    public static void printSign(int num){ // 局部变量的声明
        for(int i = 1;i <= num;i++){
            System.out.print("-");
        }
        System.out.println();
    }
}

7. 多个参数

使用方法优化诗句打印3 : 使用多个参数让用户灵活的控制符号的个数 以及 符号的类型

package com.xxx.test4;

/**
 *  使用方法优化诗句打印3 : 使用多个参数让用户灵活的控制符号的个数  以及 符号的类型
 */
public class TestMethod3 {
    public static void main(String[] args) {
        System.out.println("床前明月光");
        int num = 4;
        String s1 = "%";
        printSign(num,s1); // num s1 实参 实际参数 调用方法实际传入的参数  必须遵循形参的规定

        System.out.println("疑是地上霜");
        printSign(10, "$"); // 10  $ 实参 实际参数 调用方法实际传入的参数   必须遵循形参的规定

        System.out.println("举头望明月");
        String s2 = "&";
        printSign(5,s2); // 5  s2 实参 实际参数 调用方法实际传入的参数   必须遵循形参的规定

        System.out.println("低头思故乡");
        int number = 10;
        printSign(number,"&");// // number &  实参 实际参数 调用方法实际传入的参数   必须遵循形参的规定
    }

    /**
     *  形参:形式参数 表示方法定义的时候书写的参数 规定了参数的个数、类型、顺序
     * @param count
     * @param sign
     */
    public static void printSign(int count , String sign){
        for(int i = 1;i <= count;i++){
            System.out.print(sign);
        }
        System.out.println();
    }
}

8. 返回值和返回值类型

返回值引入 :为什么需要返回值?

需求:编写方法计算两个int类型整数之和 并且在main方法判断最终的和是奇数还是偶数

package com.xxx.test5;

/**
 *  返回值引入 :为什么需要返回值?
 *
 *  需求:编写方法计算两个int类型整数之和 并且在main方法判断最终的和是奇数还是偶数
 */
public class TestReturnedValue1 {

    public static void add(int a,int b){
        System.out.println("a与b之和为:" + (a + b));
    }

    /**
     *  返回值类型不是void 那么必须在方法体内 通过return关键字返回对应类型的数据 否则编译报错
     *  return 关键字表示 :结束方法 并且 返回数据
     * @param a
     * @param b
     * @return
     */
    public static int addition(int a,int b){
        System.out.println("a与b之和为:" + (a + b));
        int sum = a + b;
        return sum;
    }


    public static void main(String[] args) {
        add(10, 20);
        int sum = addition(13331, 22220);

        if(sum % 2 == 0){
            System.out.println("偶数");
        }else{
            System.out.println("奇数");
        }
    }
}

在分支结构中返回数据,必须保证每一条分支语句都有正确的返回值

需求:根据用户传入整数 判断是奇数还是偶数

package com.xxx.test5;

/**
 *  在分支结构中返回数据,必须保证每一条分支语句都有正确的返回值
 *
 *  需求:根据用户传入整数 判断是奇数还是偶数
 */
public class TestReturnedValue2 {

    public static String isEven1(int num){
        if(num % 2 == 0){
            return "偶数";
        }else{
            return "奇数";
        }
    }

    public static String isEven4(int num){
        if(num % 2 == 0){
            return "偶数";
        }
        return "奇数";
    }

    public static String isEven7(int num){
        return num % 2 == 0 ? "偶数" : "奇数";
    }

    public static boolean isEven2(int num){
        if(num % 2 == 0){
            return true;
        }else{
            return false;
        }
    }

    public static boolean isEven5(int num){
        if(num % 2 == 0){
            return true;
        }
        return false;

    }

    public static boolean isEven8(int num){
        return num % 2 == 0 ;

    }


    public static int isEven3(int num){
        if(num % 2 == 0){
            return 0;
        }else{
            return 1;
        }
    }

    public static int isEven6(int num){
        if(num % 2 == 0){
            return 0;
        }
        return 1;
    }

    public static int isEven9(int num){
        return num % 2;
    }
}

在返回值类型为void的方法中 也可以使用return 只表示结束方法

不能返回任何内容

package com.xxx.test5;

/**
 *  在返回值类型为void的方法中 也可以使用return 只表示结束方法
 *  不能返回任何内容
 */
public class TestReturnedValue3 {
    public static void show(){
        for(int i = 1;i <= 10;i++){
            if(i == 5){
                return; // 注意和break的区别
            }
            System.out.println(i);
        }
        System.out.println("show方法执行完毕");
    }

    public static void main(String[] args) {
        show();
    }
}

9. 方法多级调用

多级调用:我们自定义的方法也可以互相调用 直接书写方法名即可

方法要进栈,栈遵循先进后出的顺序

package com.xxx.test6;

/**
 *  多级调用:我们自定义的方法也可以互相调用 直接书写方法名即可
 *
 *  方法要进栈,栈遵循先进后出的顺序
 *
 */
public class TestNestInvoke {
    public static void main(String[] args) {
        System.out.println("main方法开始执行");

        m1();

        System.out.println("main方法执行完毕");
    }

    public static void m1() {
        System.out.println("m1 method start");
        m2();
        System.out.println("m1 method end");
    }

    public static void m2() {
        System.out.println("m2 method start");
        System.out.println("m2 method end");
    }
}

10. 方法重载(method overload)

方法重载:同一个类中的方法 名称相同 参数列表(个数、类型、顺序)不同 这种现象即可称之为方法重载

跟返回值类型 访问权限修饰符 无关

方法重载属于静态多态

方法重载的优点:屏蔽使用差异 统一程序结构 灵活 方便

package com.xxx.test6;

/**
 * 方法重载:同一个类中的方法 名称相同 参数列表(个数、类型、顺序)不同 这种现象即可称之为方法重载
 * 跟返回值类型 访问权限修饰符 无关
 * 
 * 方法重载属于静态多态
 *
 *  方法重载的优点:屏蔽使用差异 统一程序结构 灵活 方便
 */
public class TestMethodOverload {
    public static int add(int a, int b) {
        System.out.println(a + b);
        return a + b;
    }

    public static double add(int c, String d) {
        System.out.println(c + d);
        return 2.5;
    }

    public static boolean add(String c, int d) {
        System.out.println(c + d);
        return true;
    }

    public static void add(int a, int b, int c) {
        System.out.println(a + b + c);
    }

    public static void add(int a, int b, int d, int c) {
        System.out.println(a + b + c + d);
    }

    public static void add(int a, int b, int c, int d, int e) {
        System.out.println(a + b + c + d + e);
    }

    public static void add(int a, int b, int c, int d, int e, int f) {
        System.out.println(a + b + c + d + e + f);
    }


    public static void main(String[] args) {
        add(20, 30);
    }
}

11. 递归

递归.png

递归.png

递归:递进和回归

递归可以简单的理解为:方法自己调用自己

递归

1.一个大的问题拆分为若干个小的问题

2.必须有结束的条件 否则将造成无穷递归(死循环)

举例:

赵四 刘能 大拿 小宝 广坤

需求:

1.实现 1 ~ n之和

2.阶乘

3.打印斐波那契数列

4.八皇后

5.汉诺塔问题

6.文件遍历

package com.xxx.test1;

/**
 *  递归:递进和回归
 *  递归可以简单的理解为:方法自己调用自己
 *
 *  递归
 *      1.一个大的问题拆分为若干个小的问题
 *      2.必须有结束的条件  否则将造成无穷递归(死循环)
 *
 *  举例:
 *      赵四    刘能    大拿   小宝   广坤
 *
 *
 *  需求:
 *      1.实现 1 ~ n之和
 *      2.阶乘
 *      3.打印斐波那契数列
 *      4.八皇后
 *      5.汉诺塔问题
 *      6.文件遍历
 *
 */
public class TestRecursive {
    public static void m1(){
        m1();
    }


    public static int getSum5(){
        return 5 + getSum4();
    }

    public static int getSum4(){
        return 4 + getSum3();
    }

    public static int getSum3(){
        return 3 + getSum2();
    }

    public static int getSum2(){
       return 2 + getSum1();
    }

    public static int getSum1(){
        return 1;
    }


    public static int getSum(int num){
        if(num == 1){
            return 1;
        }
       return num + getSum(num - 1);
    }


    public static int getFactorial(int num){
        if(num == 1 ){
            return 1;
        }
        return num * getFactorial( num - 1);
    }


    public static void main(String[] args) {
        int sum5 = getSum5();

        System.out.println("sum5 = " + sum5);

        System.out.println(getSum(100));


        System.out.println(getFactorial(5));

    }
}