Java方法详解

发布于:2025-03-05 ⋅ 阅读:(89) ⋅ 点赞:(0)

方法

1.方法的概念

(1).什么是方法

方法类似于C语言中的函数,我们重在体会与理解,不必去强硬地去背
1. 是能够模块化的组织代码(当代码规模比较复杂的时候).
2. 做到代码被重复使用, 一份代码可以在多个位置使用.
3. 让代码更好理解更简单.
4. 直接调用现有方法开发, 不必重复造轮子.

(2).方法的定义

我们最早见过的是main方法,我们可以把它作为C语言中的函数去理解
例如: 定义个main方法:

    public static void main(Sting[] args){

    }
    //public static(这两个东西不能省略掉) 
    //void是指的是无类型的返回值, main是方法名,其后的括号中是形式参数列表
    所以我们应定义一个:
    public static 返回值 方法名(参数类型 形参){
        方法体代码
        return(返回值)
     }

在这里:我要先就关于大驼峰与小驼峰的命名方式先说一下
大驼峰:每个单词的首字母大写: 例如 DemoTest,MyClass
小驼峰:只有第一个单词的首字母大写,后续每个单词的首字母都大写,其余小写 例如:myFunction,userProfile等

示例:判断某年是不是闰年

public static boolean isLeapYear1(int year){
        if(0 == year % 4 && 0 != year % 100 || 0 == year %400){
            System.out.println(year + "是闰年");
            return true;//由于boolean类型,所以需要返回两个值
        }else{
            System.out.println(year + "不是闰年");
            return false;
        }
}

    public static void main(String[] args) {
        Scanner sc = new Scanner (System.in);
        int year = sc.nextInt();
        isLeapYear1(year);
        sc.close();
    }

注意事项:
1. 修饰符:现阶段直接使用public static 固定搭配
2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成
void
3. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
4. 方法体:方法内部要执行的语句
5. 在java当中,方法必须写在类当中,不能嵌套定义
6. 在java当中,没有方法声明一说,声明必须要在主函数之前,所以我们可以不用在意
7. 一个方法可以多次去调用
示例:

public static void main9(String[] args) {
         boolean flg1 = isLeapYear3(2025);//2025是实际参数
        System.out.println(flg1);
         boolean flg2 = isLeapYear3(2024);//2025是实际参数
        System.out.println(flg2);
}

    public static boolean isLeapYear3(int year) {//int year是形式参数
        if (0 == year % 4 && 0 != year % 100 || 0 == year % 400) {
            return true;//由于boolean类型,所以需要返回两个值
        } else {
            return false;
        }
    }  
(3).实参与形参的关系
import  java.util.Scanner;
public static int func1(int x) {
        int ret = 1;
        for (int j = 1; j <= x; j++) {
            ret *= j;
        }
        return ret;
}

public static void main1(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int ret = func1(a);
        System.out.ptrintln(ret);
}        

在Java中,实参的值永远都是拷贝到形参之中,形参和实参本质是两个实体。
但是两者的栈帧并不一样,都是在一个栈空间(虚拟机栈)中,但是所处的区域不同

//老生常谈的例子
//交换变量
//正常版:
    public static void main2(String[] args){
        int a = 10;
        int b = 20;
        int temp = 0;
        temp = a;
        a = b;
        b =temp;
        System.out.println(a + " " + b);
    }
    //方法版
    public static void swap4(int x ,int y) {
        int temp = 0;
        temp = x;
        x = y;
        y =temp;
    }
    //当这个方法走完,那么也就是把x和y的变量的值进行交换完成。
    //但是也只是把它们被赋予的值进行交换完成
    //对于a和b的本身没有任何影响
    public static void main3(String[] args){
        int a = 10;
        int b = 20;
        //a和b的局部变量
        //作用域:在方法中
        //生命周期:调用方法的创建,方法调用结束的时候来销毁
        //内存:储存在栈上
        //Java中由于其安全性,不会让你拿到局部变量的地址
        System.out.println("交换前"+ a + " " + b);
        //swap(a,b);
        System.out.println("交换后"+ a + " " + b);
    }

就目前来看,学完类和对象才能知道怎么交换,Java中没有指针这一个概念;
但是有引用这一个概念,“引用”叫做引用变量;引用变量中存入的是地址。
数组就是一个引用变量
当一个方法没有返回值,所以我们就要用void类型来接收

2.方法重载

(1).方法重载的概念

在Java中如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。

//    public static int addInt(int x,int y){
//        return x + y;
//    }
//
//    public static double addDouble (double x,double y){
//        return x + y;
//    }

    //这时候方法里的名字不一样,所以我们可以创建新的方法名从而计算。
    //当然这不是方法重载
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
//        System.out.println(addInt(a, b));
        //System.out.println(add(a, b));
        double c1 = sc.nextDouble();
        double c2 = sc.nextDouble();
//        System.out.println(addDouble(c1,c2));
        //System.out.println(add(c1,c2));
        sc.close();
    }
    public static int add(int x,int y){
        return x + y;
    }
    public static double add(double x,double y){
        return (int)(x + y);
        //这么做强制转化,如果仅仅是返回值不同,这种仅有返回值改变,那么这就不叫做方法重载
    }
    //这部分方法的操作叫做重载,只有一个名字都是add

方法重载:
1.方法名相同
2.参数列表不同【数据类型,变量个数,顺序】
3.返回值不影响重载

3.递归(C语言详细讲过)

必要条件:
1.将原问题转为多个子问题,(子问题必须要与原问题解法相同)
2.递归出口

public static int func(int n){
        if(n == 1 || n == 0){
            return 1;
        }
        int ret = n * func(n-1);
        return ret;
    }
    public static void main5(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        System.out.println(func(5));
    }    

调用栈:
方法调用的时候,会有一个“栈”这样的内存空间描述当前的调用关系,称为调用栈.
每一次的方法调用就称为一个 “栈帧”, 每个栈帧中包含了这次调用的参数是哪些, 返回到哪里继续执行等信息.

按顺序打印1 2 3 4

public static void print (int n){
       if(n > 9){
           print(n / 10);
       }
       //当n为一个数时,那么可以直接打印
       System.out.print(n % 10 + " ");
   }

   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int n = sc.nextInt();
       print(n);
   }

求斐波那契数列第N项数

public static int funca(int n) {
        /*if(n <= 2)*/if(n == 1 || n == 2){
            return 1;
            //这两种写法均可以
        }else {
            return  funca(n - 1) + funca(n - 2);
        }
}

    public static void main8(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(funca(n));
    }

这个代码不适合用递归去写,程序执行速度极慢. 原因是进行了大量的重复运算.

//迭代写法
public static long funcaA(long n){
        long a = 1;
        long b = 1;
        long c = 1;
        while(n > 2){
            c = a + b;
            a = b;
            b = c;
            n--;
        }
        return c;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = sc.nextInt();
        System.out.println(funcaA(n));
    }
    //后续:在二叉树我们经常需要使用递归去解决问题
    ```
好了,今天我们就分享到这里了,如果有什么不足,劳烦大家帮忙在评论区指出,谢谢大家了!让我们下一次见!

网站公告

今日签到

点亮在社区的每一天
去签到