[从0开始学Java|第六天]Java方法

方法

什么是方法?

方法(method)是程序中最小的执行单元.

实际开发中,什么时候用到方法?

重复的代码,具有独立功能的代码可以抽取到方法中.

例如:

**需求:**用输出语句描述,如何打一局游戏?

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

-可以提高代码的复用性.

-可以提高代码的可维护性

方法的格式

方法的定义格式

-最简单的方法定义

-带参数的方法定义

-带返回值方法的定义

最简单的方法定义和调用

方法定义

格式:

public static void 方法名(){

方法体(就是打包起来的代码);

}

范例:

public static void playGame(){

七个打印语句;

}

方式调用

格式:

方法名();

范例:

playGame();

**注意:**方法必须先定义后调用,否则程序将报错

练习:打一局游戏

**目标:**掌握最简单的方法定义和调用的格式

(源代码)

java 复制代码
package com.itheima.methoddemo;

public class MethodDemo1 {
    public static void main(String[] args) {
        //目标:掌握最简单的方法定义和调用的格式

        //调用方法
        playGame();
    }

    //定义一个方法
    public static void playGame(){
        System.out.println("选人物");
        System.out.println("准备开局");
        System.out.println("对线");
        System.out.println("崩盘");
        System.out.println("骂队友");
        System.out.println("送人头");
        System.out.println("GG");
    }
}

(运行结果截图)

练习:展示女朋友的信息

需求: 定义一个方法,在方法内部打印你女朋友的所有信息

(源代码)

java 复制代码
package com.itheima.methoddemo;

public class MethodDemo2 {
    public static void main(String[] args) {
        //目标:利用方法最简单的格式完成当前练习

        //调用方法
        printGFInfo();
    }
    //定义方法
    public static void printGFInfo(){
        System.out.println("小惠惠");
        System.out.println("萌妹子");
        System.out.println("18岁");
    }
}

(运行结果截图)

练习:看代码说结果1

**目标:**能说出方法调用时的执行过程

两个核心:

1.看到方法进入方法

2.执行完毕回到调用处

练习:看代码说结果2

**目标:**能说出方法调用时的执行过程

练习:人肉计算器

**需求:**定义一个方法,在方法内部定义两个变量,求出他们的和并进行打印.

(源代码)

java 复制代码
package com.itheima.methoddemo;

public class MethodDemo3 {
    public static void main(String[] args) {
        //目标:利用方法最简单的格式完成当前练习
        //需求:定义一个方法,在方法内部定义两个变量,求出他们的和并进行打印.
        getSum();
    }
    public static void getSum(){
        int num1 = 10;
        int num2 = 20;
        int result = num1 + num2;
        System.out.println(result);
    }
}

(运行结果截图)

带参数的方法定义和调用

带参数方法定义

单个参数定义

格式:

public static void 方法名(参数){... ...}

范例:

public static void method(int number){... ...}

多个参数定义

格式:

public static void 方法名(参数1,参数2,... ...){... ...}

范例:

public static void method(int number1,int number2){... ...}

带参数方法调用

单个参数调用

单个参数: 方法名(参数);

**范例1:**method(10);

范例2: method(变量);

多个参数调用

单个参数: 方法名(参数1,参数2,... ...);

**范例1:**method(10,20);

范例2: method(变量1,变量2);

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

练习

**目标:**掌握带参数方法定义的格式和调用的格式

(源代码)

java 复制代码
package com.itheima.methoddemo;

public class MethodDemo4 {
    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.我干这件事情需要什么才能完成? 形参

(定义无参的方法)

(定义带参的方法)

练习:人肉计算机1

**需求:**定义一个方法,求长方形的周长,将结果在方法中进行打印.

(源代码)

java 复制代码
package test;

public class Test1 {
    public static void main(String[] args) {
        //需求:定义一个方法,求长方形的周长,将结果在方法中进行打印.
        getLength(5.2,1.3);        
    }
    public static void getLength(double len,double width) {
        double result = (len + width) * 2;
        System.out.println(result);
    }
}

(运行结果截图)

练习:人肉计算机2

**需求:**定义一个方法,求圆的面积,将结果在方法中进行打印.

(源代码)

java 复制代码
package test;

public class Test2 {
    public static void main(String[] args) {
        //需求:定义一个方法,求圆的面积,将结果在方法中进行打印.
        getArea(1.5);
    }
    public static void getArea(double radius) {
        double area = 3.14 * radius * radius;
        System.out.println(area);
    }
}

(运行结果截图)

带返回值方法的定义和调用

为什么要有带返回值的方法呢?

调用处拿到方法的结果之后,才能根据结果进行下一步操作

.

方法的返回值其实就是方法运行的最终结果.

-如果在调用处要根据方法的结果,去编写另一段代码逻辑

-为了在调用处拿到方法的结果,就需要定义带有返回值的方法

什么时候用到带返回值的方法?

在调用处要根据方法的结果,去编写另一段代码逻辑

带返回值方法定义

格式:

public static 返回值类型 方法名(参数){

方法体;

return 返回值;

}

范例:

public static int getSum(int a,int b){

int c = a + b;

return c;

}

带返回值方法的调用

1.直接调用

方法名(实参);

2.赋值调用

整数类型 变量名 = 方法名(实参);

3.输出调用

System.out.println(方法名(实参));

练习:人肉计算机

**需求:**定义一个方法,求一家商场每个季度的营业额.根据方法结果再计算出全年营业额.

(源代码)

java 复制代码
package com.itheima.methoddemo;

public class MethodDemo5 {
    public static void main(String[] args) {
        //需求:定义一个方法,求一家商场每个季度的营业额.根据方法结果再计算出全年营业额.

        //先计算第一个季度的营业额
        int sum1 = getSum(10, 20, 30);
        //再计算第二个季度的营业额
        int sum2 = getSum(20, 30, 40);
        //再计算第三个季度的营业额
        int sum3 = getSum(20, 30, 40);
        //再计算第四个季度的营业额
        int sum4 = getSum(20, 30, 40);

        //计算全年营业额
        int sum = sum1 + sum2 + sum3 + sum4;
        System.out.println(sum);
    }
    public static int getSum(int num1, int num2, int num3) {
        int result = num1 + num2 + num3;
        return result;//将结果返回给调用处
    }
}

(运行结果截图)

带返回值方法中参数的运行过程

**第一步:**调用getSum方法,把10赋值给num1,20赋值给num2,30赋值num3

**第二步:**在方法体里面计算,计算得到结果60,返回给调用处,再把60赋值给变量sum

练习:比较大小

**需求:**定义方法,比较两个长方形的面积.

(源代码)

java 复制代码
package test;

public class Test3 {
    public static void main(String[] args) {
        //需求:定义方法,比较两个长方形的面积.

        //调用方法获取长方形的面积,再进行比较
        double area1 = getArea(5.3,1.7);
        double area2 = getArea(2.4,2.7);

        if(area1 > area2){
            System.out.println("第一个长方形的面积大");
        }else if(area1 < area2){
            System.out.println("第二个长方形的面积大");
        }else{
            System.out.println("第一个长方形的面积等于第二个长方形的面积");
        }
    }
    //定义一个方法求长方形的面积
    public static double getArea(double length,double width){
        double area = length * width;
        return area;
    }
}

(运行结果截图)

方法的小结

方法的完整定义格式

格式:

public static 返回值类型 方法名(参数){

方法体;

return 返回值;

}

方法的注意事项

-方法不调用就不执行.

-方法与方法之间是平行关系,不能相互嵌套定义.

-方法的编写顺序与执行顺序无关.

-方法的返回值类型为void,表示该方法没有返回值,没有返回值的方法可以省略return语句不写,如果要编写return,后面不能跟具体的数据.

-return语句下面,不能编写代码,因为永远执行不到,属于无效的代码.

return关键字

-方法没有返回值 :可以省略不写.如果书写,表示结束方法.

-方法有返回值: 表示结束方法和返回结果.

方法的重载

什么是方法的重载?

-在同一个类中,定义了多个同名的方法,这些同名的方法具有同样的功能

-每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系

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

参数不同:个数不同,类型不同,顺序不同

例如:

Java虚拟机会通过参数的不同来区分同名的方法

要掌握的两个能力:

-会判断方法之间是否构成重载

-会定义重载的方法

练习:区分一下方法是否构成重载

会判断方法之间是否构成重载关系

1.不构成重载关系,形参一样

2.构成重载关系

3.不构成重载关系,这两个方法不在一个类里

4.构成重载关系

5.构成重载关系(顺序不同可以构成重载,但是不建议)

练习:方法重载

**需求:**使用方法重载的思想,设计比较两个整数是否相同的方法

**要求:**兼容全整数类型(byte,short,int,long)

把相同功能的方法名起成一样的名字的好处:

1.定义方法的时候可以不用那么多的单词了

2.调用方法的时候也不需要那么麻烦了

(源代码)

java 复制代码
package test;

public class Test4 {
    public static void main(String[] args) {
        compare((byte)10,(byte)20);
    }
    public static void compare(byte b1,byte b2) {
        System.out.println("byte类型");
        System.out.println(b1 == b2);
    }
    public static void compare(short s1,short s2) {
        System.out.println("short类型");
        System.out.println(s1 == s2);
    }
    public static void compare(int i1,int i2) {
        System.out.println("int类型");
        System.out.println(i1 == i2);
    }
    public static void compare(long l1,long l2) {
        System.out.println("long类型");
        System.out.println(l1 == l2);
    }
}

(运行结果截图)

方法的三个练习:遍历求最大值和判断是否存在

练习:数组遍历

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

System.out.println("abc");//先打印abc,再进行换行

System.out.print("abc");//只打印abc,不换行

System.out.print();//不打印任何数据,只做换行处理

(源代码)

java 复制代码
package test;

public class Test5 {
    public static void main(String[] args) {
        //1.定义数组
        int[] arr = {11,22,33,44,55};
        //2.调用方法
        printArr(arr);
    }
    public static void printArr(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                System.out.print(arr[i]);
            } else {
                System.out.print(arr[i] + ",");
            }
        }
        System.out.println("]");
    }
}

(运行结果截图)

练习:数组最大值

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

(源代码)

java 复制代码
package test;

public class Test6 {
    public static void main(String[] args) {
        int[] arr = {1,5,7,3,8,10};
        int max = printArr(arr);
        System.out.println(max);
    }
    public static int printArr(int[] arr){
       int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]>max){
                max = arr[i];
            }
        }
        return max;
    }
}

(运行结果截图)

练习:判断是否存在

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

java 复制代码
package test;

public class Test7 {
    public static void main(String[] args) {
        int[] arr = {1,5,8,12,56,89,34,67};
        boolean contains = contains(arr, 89);
        System.out.println(contains);
    }
    public static boolean contains(int[] arr, int number) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == number) {
                return true;
            }
        }
        return false;
    }
}

(运行结果截图)

方法练习:拷贝数组

**需求:**定义一个方法copyOfRange(int[] arr,int from,int to)

**功能:**将数组arr中从索引from(包含from)开始,到索引to结束(不包含to)的元素复制到新数组中,将新数组返回

(源代码)

java 复制代码
package test;

public class Test8 {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9};
        int[] copyArr = copyOfRange(arr, 3, 7);
        for(int i = 0;i < copyArr.length;i++)
        {
            System.out.print(copyArr[i] + " ");
        }
    }
    public static int[] copyOfRange(int[] arr,int from,int to)
    {
        int[] newArr = new int[to - from];
        int index = 0;
        for(int i = from;i < to;i++)
        {
            newArr[index] = arr[i];
            index++;
        }
        return newArr;
    }
}

(运行结果截图)

方法的基本内存原理

方法调用的基本内存原理

例1:

**第一步:**方法被调用之后就会进栈执行

**第二步:**方法中所有代码执行完之后就要出栈

例2:

第一步

第二步

第三步

第四步

第五步

第六步

第七步

基本数据类型和引用数据类型

基本数据类型

-整数类型

-浮点数类型

-布尔类型

-字符类型

变量中存储的是真实的数据

引用数据类型

变量中存储的是地址值

引用:使用了其他空间中的数据

从内存的角度解释

**基本数据类型:**数据值是存储在自己的空间中.

**特点:**赋值给其他变量,也是赋的真实的值.


**引用数据类型:**数据值是存储在其他空间中,自己空间中存储的是地址值.

**特点:**赋值给其他变量,赋的是地址值.

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

传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值.

第一步

第二步

第三步

第四步

思考:如何使调用change方法后的值为200?

(源代码)

java 复制代码
package test;

public class Test9 {
    public static void main(String[] args) {
        int number = 100;
        System.out.println("调用change方法前:" + number);//100
        number = change(number);
        System.out.println("调用change方法后:" + number);//200
    }
    public static int change(int number) {
        number = 200;
        return number;
    }
}

(运行结果截图)

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

传递引用数据类型时,传递的是地址值,形参的改变,影响实际参数的值

第一步

第二步

第三步

[代码实现]

(源代码)

java 复制代码
package test;

public class Test10 {
    public static void main(String[] args) {
        int[] arr = {10,20,30};
        System.out.println("调用change方法前:" + arr[1]);
        change(arr);
        System.out.println("调用change方法后:" + arr[1]);
    }
    public static void change(int[] arr) {
        arr[1] = 200;
    }
}

(运行结果截图)

方法传递参数的结论

本博客是B站黑马程序员Java零基础视频教程_上部day06的课后笔记

相关推荐
u0109272712 小时前
模板编译期排序算法
开发语言·c++·算法
一点技术2 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
datalover2 小时前
CompletableFuture 使用示例
java·开发语言
m0_686041612 小时前
C++中的适配器模式变体
开发语言·c++·算法
清风~徐~来2 小时前
【视频点播系统】WebSocketpp 介绍及使用
开发语言
爱吃大芒果2 小时前
Flutter for OpenHarmony 实战:mango_shop 路由系统的配置与页面跳转逻辑
开发语言·javascript·flutter
学***54232 小时前
如何轻松避免网络负载过大
开发语言·网络·php
RANCE_atttackkk2 小时前
Springboot+langchain4j的RAG检索增强生成
java·开发语言·spring boot·后端·spring·ai·ai编程
梵刹古音2 小时前
【C语言】 格式控制符与输入输出函数
c语言·开发语言·嵌入式