java系列:搞定了类与对象,那方法也不能落下!

125 阅读7分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

成员方法

基本介绍

在某些情况下,我们需要定义成员方法(简称方法),比如人类:除了有一些属性外(年龄,姓名)我们人类还有以下行为,比如:可以说话,跑步,通过学习还可以做算术题,这时就要用成员方法才能完成。现在要求堆Person类完善

成员方法快速入门

Method01.Java

  1. 添加speak成员方法,输出,我是一个好人
  2. 添加cal01成员方法,可以计算从一到一千的结果
  3. 添加cal01成员方法,该方法可以接收一个数 n,计算从一到n的结果
  4. 添加getSum成员方法,可以计算两个数的和
import org.w3c.dom.ls.LSOutput;
​
import java.util.MissingFormatArgumentException;
import java.util.Scanner;
public class Method01 {
    public static void main(String[] args) {
​
​
        Scanner scanner = new Scanner(System.in);
​
        //方法使用
        //1.方法写好之后,如果不去调用,就不会输出
        Person p1 = new Person();
//        p1.speak();//调用方法
//        p1.cal01();//调用方法
//        System.out.println("请输入需要加到的数:");
//        int n = scanner.nextInt();
//        p1.cal02(n);
        System.out.println("请输入第一个数:");
        int i = scanner.nextInt();
        System.out.println("请输入第二个数:");
        int j = scanner.nextInt();
​
        //把方法getSum返回的值赋给变量sum
        int sum = p1.getSum(i,j);
        System.out.println("和为" + sum);
​
​
​
    }
}
​
class Person{//创建一个人的类
​
​
    String name;//人的属性
    int age;
    //方法(成员方法)
    //添加speak成员方法,输出“我是一个好人”
    //public 表示方法是公开
    //void 表示方法没有返回值
    //speak() 方法名,()小括号是形参列表
    //{}方法体,可以写我们要执行的代码
    //System.out.println();输出一句话
​
​
    public void speak(){//输出一句话
        System.out.println("我我是一个好人");
​
    }
    public void cal01(){
        //计算1-1000的值
        int sum = 0;
        for (int i = 1; i <= 1000; i++){
            sum += i;
        }
        System.out.println(sum);
    }
​
    //(int n) 形参列表,表示当前有一个形参n,可以接收用户输入
​
    public void cal02(int n){//计算从1到n的和
        int sum = 0;
        for (int i = 1; i <= n; i++){
            sum += i;
        }
        System.out.println("从1到" + n + "的和为" + sum);
​
    }
​
​
    //传入多个形参
​
​
    //表示方法执行后,返回一个int值
    //形参列表(int i,int j)两个形参,可以接收用户传入的两个数
    public int getSum(int i,int j){//计算两个数的和
​
        //
        return i + j;
​
    }
​
}

成员方法的调用机制原理(重要!示意图)

提示:画出程序执行过程[getSum]+说明

1.png 为什么需要成员方法

Method02.java

public class Method02 {
    public static void main(String[] args) {
        //定义原始数组
        int[][] map = {{0,0,1},{1,1,1},{1,1,3}};
        MyTools tools = new MyTools();

        while(true){
            for (int i = 0; i < 5; i++){
                tools.tool(map);

            }
            break;
        }

    }
}

class MyTools{
    public void tool(int[][] map){
        //用for循环嵌套,遍历二维数组
        for (int i = 0; i < map.length; i++){//外层表示二维数组内一维数组的个数
            for (int j = 0; j < map[i].length; j++){//每个一维数组的个数
                //输出每个元素
                System.out.print(map[i][j] + " ");
            }
            //打印换行
            System.out.println();
        }
    }
}

看一个需求

请遍历一个数组,输出数组的各个元素值

int[][] map = {{0,0,1},{1,1,1},{1,1,3}};

解决思路一:传统的方法,就是使用for循环,将数组输出

解决思路二:定义一个类MyTools,然后写一个成员方法,调用方法实现,看看效果如何

成员方法的好处

  1. 提高代码的复用性
  2. 可以将实现的细节封装起来,然后供其他用户来调用即可

成员方法的定义

访问修饰符 返回数据类型 方法名(参数列表){
    //方法体
    语句;
    return 返回值;
}
  1. 形参列表:表示成员方法输入 cal(int n)
  2. 数据类型(返回类型):表示成员方法输出,void表示没有返回值
  3. 方法主体:表示为了实现某一功能代码块
  4. return 语句不是必须的
  5. 结合示意图来理解

成员方法细节

MethodDetail.java

public class MethodDetail {
    public static void main(String[] args) {
        AA aa =  new AA();
        int[] res =  aa.getSumAndSub(1,4);
        System.out.println("和 = " + res[0]);
        System.out.println("差 = " + res[1]);
        

    }
}

class AA{
    public int[] getSumAndSub(int n1,int n2){

        int[] resArr = new int[2];//创建一个数组
        resArr[0] = n1 + n2;
        resArr[1] = n1 - n2;
        return resArr;


    }
}

修饰符 (作用是控制方法的使用范围)

有四种可选【public protected 默认 private】

返回数据类型细节

  1. 一个方法最多有一个返回值【思考,如何返回多个结果】//返回
  2. 数组
  3. 返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
  4. 如果方法要求有返回数据类型,则方法中最后的执行语句必须为return 值;而且要求返回值类型必须和return的值类型一致或兼容
  5. 如果方法是void,则方法体中可以没有return语句,或者只写return;
  6. 方法名遵循驼峰命名法,最好见名知义,表达出该功能的意思即可,比如得到两个数的和getSum,开发中按照规范

参数列表细节

  1. 一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,比如getSum(int n1,int n2)
  2. 参数类型可以为任意类型,包含基本类型或引用类型,比如printArr(int map)
  3. 调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数【getSum】
  4. 方法定义时的参数称为形式参数,简称形参:方法调用时用的传入参数称为实际参数,简称实参,实参和形参的类型要一致或兼容,个数,顺序必须一致【演示】
  5. 方法体

里面写完成功能的具体的语句,可以为输入,输出,变量,运算,分支,循环,方法调用,但里面不能再定义方法!即:方法不能嵌套定义

方法调用细节

  1. 同一个类中的方法调用:直接调用即可,不用创建对象。比如print(参数);案例演示:MethodDetail02

    A类sayOk调用print()

  2. 跨类中的方法A类调用B类方法:需要通过对象名调用。比如 对象名.方法名(参数);案例演示:B类sayOk调用print()

  3. 特别说明:跨类的方法调用和方法的访问修饰符相关,先暂时提一下,后面讲访问修饰符会讲到

课堂练习题

1.编写类AA,有一个方法:判断一个数是奇数还是偶数,返回boolean

MethodExercise01.java

2.根据行,列字符打印对应行数和列数的字符#,比如:行:4,列:4,字符#,则打印相应结果

成员方法传参机制

方法的传参机制对以后的学习非常重要,一定要搞清楚,我们通过案例来学习

基本类型的传参机制

MethodParamenter01.java

看一个案例,分析结果是什么

2.png 结论:基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参

引用数据类型的传参机制

看一个案例MethodParameter02.java

B类中编写一个方法test100,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?

image-20221103234657646.png B类中编写一个方法test200,可以接收一个Person(age sal)对象,在方法中修改该对象属性,看看原来的对象是否变化

image-20221103234640626.png

结论:引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参

在看一个案例,下面的方法会对原来的对象有影响吗

p = null 和 p = new Person();

image-20221103234612969.png

成员方法返回类型是引用类型的实例

MethodExercise02.java

  1. 编写一类MyTools类,编写一个方法可以打印二维数组的数据
  2. 编写方法copyPerson 可以复制一个Person对象,返回复制的对象。克隆对象,注意要求得到的新对象和原来的对象是两个独立的对象,只是他们的属性相同