这篇文章,我们来讲一下java中的方法

目录

1.什么是方法

2.方法的格式

2.1 方法的定义格式

2.1.1最简单的定义方法

2.1.2带参数的方法定义

2.1.3带返回值方法的定义

2.1.4方法定义的总结

2.2 方法的调用

2.3 方法的小结

3.方法的重载

4.方法的小练习

4.1数组遍历

 4.2 数组最大值

4.3判断是否存在

4.4复制数组

5.方法的内存

5.1方法调用的基本原理内存

5.2方法传递基本数据类型的内存原理

5.3方法传递引用数据类型的内存原理

6.小结


1.什么是方法

方法:是程序中的最小的执行单元

怎么理解?我们看下面的例子:

在程序运行时,主方法中的输出语句我能只执行一条吗?显然是不可以的,必须全部执行。那么也就是说,当程序运行时,方法是最小的执行单元,不可再分。 

问:什么时候用到方法?

答:重复的代码、具有独立功能的代码可以抽取到方法中

问:实际开发中,方法有什么好处?

答:可以提高代码的复用性,提高代码的可维护性

2.方法的格式

下面我们来学习一下方法的格式。

方法就是把一些代码打包在一起,用的时候进行调用。所以,我们要从方法的打包和方法的调用两方面来学习

方法的定义:把一些代码打包在一起,该过程称为方法的定义

方法的调用:方法定义后并不是直接运行的,需要手动调用才行,该过程称为方法的调用。

2.1 方法的定义格式

下面,我们来看一下方法的定义

2.1.1最简单的定义方法

最简单的定义格式如下:

public static void 方法名() {
    方法体(就是打包起来的代码)
}

范例:

public static void playGame(){
        System.out.println("打游戏");
}

方法的调用

public class Method1 {
    public static void main(String[] args) {
//        直接调用方法名就行
        playGame();
    }
    public static void playGame(){
        System.out.println("打游戏");
    }
}

注意:方法要写在类里面,main方法的外面!!! 

2.1.2带参数的方法定义

问:为什么要有带参数的方法?

答:为了代码的更灵活的使用

带参数的方法定义格式如下:

public static void 方法名(参数类型 参数名,参数类型 参数名……) {
    方法体(就是打包起来的代码)
}

范例:

public static void getSum(int num1,int num2){
        int result = num1 + num2;
        System.out.println(result);
    }

方法的调用

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

//        写方法名并写入参数
        getSum(10,20);
    }

    public static void getSum(int num1,int num2){
        int result = num1 + num2;
        System.out.println(result);
    }
}

注意:方法调用时,参数的数量和类型必须和方法定义中小括号里面的变量一一对应,否则程序将报错

这里说两个概念:

形参:全称形式参数,是指方法定义中的参数

实参:全称实际参数,是方法调用中的参数

定义方法的技巧

  1. 我要干什么?
  2. 我干这件事需要什么才能完成?

每次定义方法时,我们都可以问自己这些问题

2.1.3带返回值方法的定义

问:为什么要带返回值?

答:有时候我们需要方法的计算结果,所以就需要返回值

带返回值方法的定义格式如下:

public (static) 返回值类型 方法名(参数类型 参数名,参数类型 参数名……) {
    方法体(就是打包起来的代码)
    return 返回值;
}

调用方式:

  1. 直接调用:方法名(实参)
  2. 复制调用:整数类型 变量名 = 方法名(实参)
  3. 输出调用:System.out.println( 方法名(实参) )

范例:

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

//        赋值调用
        int a = getSum1(10,20);
//        输出调用
        System.out.println(getSum1(10,20));
        
    }

    public static int getSum1(int num1, int num2){
        int result = num1 + num2;
        return result;
    }
}

2.1.4方法定义的总结

上面是方法定义的具体分类,下面总结一下:

方法定义的格式:

public static 返回值类型 方法名(参数类型 参数名,参数类型 参数名……) {
    方法体(就是打包起来的代码)
    return 返回值;
}

这就是标准格式,然后我们可以根据具体的情况来更改返回值类型,参数,返回语句等 

2.2 方法的调用

上面讲方法的定义的时候已经讲了方法的调用,可以回看上面的内容

2.3 方法的小结

下面对方法进行一下小结

方法的定义格式(再次重复):

public static 返回值类型 方法名(参数类型 参数名,参数类型 参数名……) {
    方法体(就是打包起来的代码)
    return 返回值;
}

注意事项:

  1. 方法不调用就不执行
  2. 方法与方法之间是平级关系,不能互相嵌套定义
  3. 方法的编写顺序与其执行顺序无关
  4.  注意方法的返回值与return语句
  5. return语句下面,不能编写代码,因为永远执行不到,属于无效方法

return关键字:

  1. 方法没有返回值:可以省略不写。如果书写,表示结束方法
  2. 方法有返回值:必须要写。表示结束方法和返回结果

3.方法的重载

方法重载的定义:在同一个类中,定义多个同名的方法,这些同名的方法具有同种的功能。每个方法具有不同的参数类型和参数个数,这些同名的方法,就构成重载关系。

简单记忆:同一个类中,方法名相同,参数不同的方法。与返回值无关

参数不同:包括数量不同,类型不同,顺序不同

问:当我们调用一个同名的方法时,JVM是怎么判断我们到底是调用的哪个呢?

答:依靠参数来判定

4.方法的小练习

下面,我们来写几个方法的小练习

4.1数组遍历

需求:定义一个方法用于数组遍历,要求遍历的结果是在一行上的。例如:[11,22,33,44,55]

代码如下:

public class Test1 {
    public static void main(String[] args) {
        int[] arr = new int[]{11,22,33,44,55};
        show(arr);
    }
    public static void show(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+",");
        }
    }
}

 截图如下:

 4.2 数组最大值

需求:设计一个方法求数组的最大值,并将最大值返回

代码如下:

public class Test1 {

    public static void main(String[] args) {
        int[] arr = {65,45,2,31,56,24,96};
        System.out.println("数组的最大值为:"+TheMax(arr));
    }
    public static int TheMax(int[] arr){
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max)
                max = arr[i];
        }
        return max;
    }
}

结果如下:

 

4.3判断是否存在

需求:定义一个方法判断数组中的某一个数是否存在,将结果返回给调用处

代码如下:

public class Test1 {

    public static void main(String[] args) {
        int[] arr = {65,45,2,31,56,24,96};
        System.out.println("30在数组中存在吗?"+contains(30,arr));
    }

    public static boolean contains(int number ,int[] arr ){
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == number )
                return true;
        }
        return false;
    }
}

截图如下:

4.4复制数组

需求:定义一个方法,将数组arr中从索引from(包含form)开始,到索引to(不包含to)的元素复制到新数组中,将新数组返回。

代码如下:

public class Test1 {

    public static void main(String[] args) {
        int[] arr = {65,45,2,31,56,24,96};
        int[] arr1 = copyOfRange(2,6,arr);
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
    }
    public static int[] copyOfRange(int from,int to,int[] arr){
        int[] arr1 = new int[to - from];
        int index = 0;
        for (int i = from; i <to ; i++) {
            arr1[index] = arr[i];
            index++;
        }
        return arr1;
    }
}

截图如下:

 

5.方法的内存

下面,我们来讲一讲方法的内存

5.1方法调用的基本原理内存

在讲数组的内存时,我们讲过java的内存,下面回顾一下:

栈:方法运行时使用的内存,方法进栈运行,运行完毕出栈

堆:new出来的,都在堆内存中开辟了一个小空间

下面,我们根据具体的代码来讲解一下:

 内存图如下:

分析:

当程序运行时,方法入栈,即main方法入栈,方法入栈之后,然后依次执行方法内部的内容,即创建和打印数组arr

下面,我们来看一下复杂的:

内存图如下:

 

分析:

程序开始运行,首先main方法入栈,然后执行eat方法eat方法入栈,入栈之后执行study方法,所以study方法入栈,study放打印输出完成之后,study方法出栈,然后eat方法执行打印输出语句,执行完成之后,执行sleep方法,所以sleep方法入栈,sleep方法打印输出完成之后,sleep方法出栈,此时eat方法执行完毕,eat方法出栈,此时main方法执行完毕,main方法出栈,程序执行结束。

5.2方法传递基本数据类型的内存原理

基本数据类型:就是变量中存的是真实的数据

内存图如下图所示:

引用数据类型:变量中存储的是地址值

内存图如下图所示:

5.3方法传递引用数据类型的内存原理

下面,我们来看一个代码:

看下运行结果:

 

这个其实很简单,就直接说结论了

结论:传递基本数据类型时,传递的是真实的数据,不是地址,形参的改变,不会影响实际参数的值 

下面,看一下另一个代码:

看下结果:

 

结论:传递引用数据类型时,传递的是地址,不是地址中的值,形参的改变,会影响实际参数的值 

6.小结

这篇文章,我们学习了java的方法。怎么说呢,这部分内容不算难,是基础,多练习就好。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐