黑马程序员Java零基础视频教程笔记-方法

简介: 黑马程序员Java零基础视频教程笔记-方法

一、什么是方法

1. 定义

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

2. 需求

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

3. 好处

① 可以提高代码的复用性

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

二、最简单的方法定义和调用

1. 方法的格式

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

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

2. 最简单的方法定义和调用

① 格式:

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

② 范例

public static void playGame(){
    七个打印语句;
}

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

3. 样例

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");
    }
}
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岁");
    }
}
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);
    }
}

三、带参数的方法定义和调用

1. 带参数方法的定义

① 单个参数

格式

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

范例

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

② 多个参数

格式

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

范例

public static void getSum(int number1,int number2){……}

2. 带参数方法的调用

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

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

② 多个参数:方法名(参数1,参数2,……);

范例1:getSum(10,20);
范例2:getSum(变量1,变量2);

3. 样例

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);
    }
}

4. 形参和实参

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

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

③ 注意:方法调用时,形参和实参必须一一对应,否则程序将报错

5. 练习

package com.itheima.test;
public class Test1{
    public static void main(String[] args){
        //需求:定义一个方法,求长方形的周长,将结果在方法中进行打印
        //目标:根据不同的需求,选择定义无参的方法,还是带参的方法
        getLength(5.2,1.3);
    }
    //1.我要干嘛?求长方形的周长
    //2.我干这件事情,需要什么才能完成?长 宽
    public static void getLength(double len, double width){
        double result = (len + width) * 2;
        System.out.println(result);
    }
}
package com.itheima.test;
public class Test2{
    public static void main(String[] args){
        //需求:定义一个方法,求圆的面积,将结果在方法中进行打印
        //目标:根据不同的需求,选择定义无参的方法,还是带参的方法
        getArea(1.5);
    }
    //1.我要干嘛?求圆的面积
    //2.我干这件事情,需要什么才能完成?半径的平方
    public static void getArea(double radius){
        double result = radius * radius * 3.14;
        System.out.println(result);
    }
}

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

1. 带返回值方法的定义

① 格式

public static 返回值类型 方法名(参数){
    方法体;
    return 返回值;
}

② 范例

public static int getSum(int a,int b){
    int c = a + b;
    return c;
}

2. 带返回值方法的调用

① 直接调用:方法名(实参);

② 赋值调用:整数类型 变量名 = 方法名(实参);

③ 输出调用:System.out.println(方法名(实参));

3. 样例

package com.itheima.methoddemo;
public class MethodDemo5{
    public static void main(String[] args){
        //目标:掌握带返回值方法的定义和调用格式
        //直接调用
        getSum(10,20,30);
        //赋值调用
        int sum = getSum(10,20,30);
        System.out.println(sum);
        //输出调用
        System.out.println(getSum(10,20,30));
        //先计算第一个季度的营业额
        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 void getSum(int num1,int num2,int num3){
        int result = num1 + num2 + num3;
        return result;//返回给方法的调用处
    }
}

4. 总结

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

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

② 有返回值方法的定义格式

public static 返回值类型 方法名(参数){
    方法体;
    return 返回值;
}

③ 有返回值方法的调用格式

直接调用,赋值调用,输出调用

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

5. 练习

package com.itheima.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{
            System.out.println("第二个长方形更大");
        }
    }
    //定义一个方法来求长方形的面积
    //1.我要干嘛?求长方形的面积
    //2.需要什么?长 和 宽
    //3.方法的调用处,是否需要继续使用方法的结果
    //如果要用,那么方法必须有返回值
    //如果不要用,方法可以写返回值,也可以不写返回值
    public static double getArea(double len, double width){
        double area = len * width;
        return area;
    }
    //在以后实际开发当中,我们一般是把重复的代码或者具有独立功能的代码抽取到方法当中
    //以后我们直接调用就可以了
    //1.我要干嘛?比较两个长方形的面积
    //2.需要什么?两个长 两个宽
    public static void compare(double len1, double width1, double len2, double width2){
        double area1 = len1 * width1;
        double area2 = len2 * width2;
        if(area1 > area2){
            System.out.println("第一个长方形更大");
        }else{
            System.out.println("第二个长方形更大");
        }
    }
}

五、方法的小结

1. 方法的注意事项

① 方法不调用就不执行

② 方法与方法之间是平级关系,不能互相嵌套定义

③ 方法的编写顺序和执行顺序无关

④ 方法的返回类型为void,表示该方法没有返回值

没有返回值的方法可以省略return语句不写

如果要编写return,后面不能跟具体的数据

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

2. return 关键字

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

② 方法有返回值:必须要写。表示结束方法和返回结果

六、方法的重载

1. 方法的重载

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

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

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

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

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

2. 练习

package com.itheima.test;
public class Test4{
    public static void main(String[] args){
        /*
        需求:
        使用方法重载的思想,设计比较两个整数是否相同的方法
        要求:
        兼容全整数类型(byte,short,int,long)
        */
        //调用
        //compare(10,20);
        //compare((byte)10,(byte)20);
        byte b1 = 10;
        byte b2 = 20;
        compare(b1,b2);
    }
    //会把相同功能的方法名起成一样的名字
    //好处1:定义方法的时候可以不用那么多的单词了
    //好处2:调用方法的时候也不需要那么麻烦了
    public static void compare(byte b1,byte b2){
        System.out.println("byte");
        System.out.println(b1 == b2);
    }
    public static void compare(short s1,byte 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 n1,long n2){
        System.out.println("long");
        System.out.println(n1 == n2);
    }    
}

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

1. 数组遍历

package com.itheima.test;
public class Test5{
    public static void main(String[] args){
        //1.定义数组
        int[] arr = {11, 22, 33, 44, 55};
        //2.调用方法遍历数组
        printArr(arr);
        /*
        System.out.println("abc");//先打印abc,再进行换行
        System.out.print("abc");//只打印abc,不换行
        System.out.print("bcd");
        System.out.println();//不打印任何数据,只做换行处理
    }
        */
    //定义方法用于数组的遍历
    //1.我要干嘛?   遍历数组
    //2.我干这件事情需要什么才能完成?   数组
    //3.方法的调用处是否需要继续使用结果?  不需要返回值
    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.println(arr[i]+", ");
            }
        }
        System.out.println("]");
    }
}

2. 数组最大值

package com.itheima.test;
public class Test6{
    public static void main(String[] args){
        //1.定义数组
        int[] arr = {1, 5, 7, 3, 8, 10};
        //2.调用方法求最大值
        int max = getMax(arr);
        //3.打印
        System.out.println(max);
    }
    //1.我要干嘛?   求最大值
    //2.我干这件事情,需要什么才能完成? 数组
    //3.是否返回?   返回
    public static int getMax(int[] arr){
        int max = arr[0];
        for(int i = 1; i < arr.length; i++){
            if(arr[i] > max){
                max = arr[i];
            }
        }
        return max;
    }
}

3. 判断是否存在

package com.itheima.test;
public class Test7{
    public static void main(String[] args){
        //1.定义数组
        int[] arr = {1, 5, 8, 12, 56, 89, 34, 67};
        //2.判断一个数字在数组中是否存在了
        boolean flag = contains(arr, 89);
        System.out.println(flag);        
    }
    //1.我要干嘛?判断数字在数组中是否存在
    //2.我干这件事情,需要什么才能完成? 数组  数字
    //3.调用处是否需要继续使用结果? 返回 true false
    public static boolean contains(int[] arr, int number){
        for (int i = 0; i < arr.length; i++){
            if(arr[i] == number){
                return true;
            }
            //什么时候才能断定89,在数字中是不存在的
            //当数组里面所有的数据全部比较完毕之后,才能断定
            return false;
        }
    }
}
//return break关键字的区别
//return:其实跟循环没有什么关系,跟方法有关,表示1结束方法 2返回结果
//       如果方法执行到了return,那么整个方法全部结束,里面的循环也会随之结束了
//break关键字
//其实跟方法没有什么关系,结束循环或者switch的

八、方法练习-拷贝数据

package com.itheima.test;
public class Test8{
    public static void main(String[] args){
        /*
        需求:
            定义一个方法copyOfRange(int[] arr,int from,int to)
        功能:
            到数组arr中从索引from(包含from)开始
            到索引to结束(不包含to)的元素复制到新数组中
            将新数组返回
        */
        //1.定义原始数组
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        //2.调用方法拷贝数据
        int[] copyArr = copyOfRange(arr, 3, 7);
        //3.遍历copyArr
        for(int i = 0; i < copyArr.lenght; i++){
            System.out.print(copyArr[i] + " ");
        }
    }
    public static int[] copyOfRange(int[] arr,int from,int to){
        //1.定义数组
        int[] newArr = new int[to - from];
        //2.把原始数组arr中的from到to上对应的元素,直接拷贝到newArr中
        //伪造索引的思想
        int index = 0;
        for(int i = from; i < to; i++){
            //格式:数组名[索引] = 数据值;
            newArr[index] = arr[i];
            index++;
        }
        //3.把新数组返回
        return newArr;
    }
}

九、方法的基本内存原理

1. 方法调用的基本内存原理

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

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

十、什么是基本数据类型和引用数据类型

1. 基本数据类型

① 整数类型

② 浮点数类型

③ 布尔类型

④ 字符类型

2. 引用数据类型

除了上边的其他所有类型

3. 从内存的角度去解释

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

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

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

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

十一、方法的值传递

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

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

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

2. 练习

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


目录
相关文章
|
17天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
17天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
23天前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
37 4
|
23天前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
24 4
|
21天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
24 1
|
24天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
27 2
|
16天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
34 0
|
Java
JAVA方法的定义
JAVA方法的定义
95 0
|
6月前
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
43 1
|
7月前
|
存储 Java
Java数组与带参数方法:定义、调用及实践
Java数组与带参数方法:定义、调用及实践
79 1