类的成员:方法(method)(一)

方法的引入

《街霸》游戏中,每次人物出拳、出脚或跳跃等动作都需要编写50-80行的代码,在每次出拳、出脚或跳跃的地方都需要重复地编写这50-80行代码,这样程序会变得很臃肿,可读性也非常差。为了解决代码重复编写的问题,可以将出拳、出脚或跳跃的代码提取出来放在一个{}中,并为这段代码起个名字,这样在每次的出拳、出脚或跳跃的地方通过这个名字来调用这个{}的代码就可以了。

上述过程中,所提取出来的代码可以被看作是程序中定义的一个方法,程序在需要出拳、出脚或跳跃时调用该方法即可。

方法(method、函数)的理解

方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。

将功能封装为方法的目的是,可以实现代码重用,减少冗余,简化代码

Java里的方法不能独立存在,所有的方法必须定义在类里。

举例1:

–           Math.random()的random()方法

–           Math.sqrt(x)的sqrt(x)方法

–           System.out.println(x)的println(x)方法

–           new Scanner(System.in).nextInt()的nextInt()方法

–           Arrays类中的binarySearch()方法、sort()方法、equals()方法

举例2:

  public class Person{
    private int age;
    public int getAge()  {  //声明方法getAge()
        return age; 
    }
    public void setAge(int i) {  //声明方法setAge
        age = i;        //将参数i的值赋给类的成员变量age
    }
}

如何声明方法

1、声明方法的语法格式

[修饰符] 返回值类型 方法名([形参列表])[throws 异常列表]{
        方法体的功能代码
}

(1)一个完整的方法 = 方法头 + 方法体。

方法头就是[修饰符] 返回值类型 方法名([形参列表])[throws 异常列表],也称为方法签名。通常调用方法时只需要关注方法头就可以,从方法头可以看出这个方法的功能和调用格式。

方法体就是方法被调用后要执行的代码。对于调用者来说,不了解方法体如何实现的,并不影响方法的使用。

(2)方法头可能包含5个部分

修饰符:可选的。方法的修饰符也有很多,例如:public、protected、private、static、abstract、native、final、synchronized等,后面会一一学习。

           其中,权限修饰符有public、protected、private。在讲封装性之前,我们先默认使用pulbic修饰方法。

           其中,根据是否有static,可以将方法分为静态方法和非静态方法。其中静态方法又称为类方法,非静态方法又称为实例方法。咱们在讲static前先学习实例方法。

返回值类型: 表示方法运行的结果的数据类型,方法执行后将结果返回到调用者。

           无返回值,则声明:void

           有返回值,则声明出返回值类型(可以是任意类型)。与方法体中“return 返回值”搭配使用

方法名:属于标识符,命名时遵循标识符命名规则和规范,“见名知意”

形参列表:表示完成方法体功能时需要外部提供的数据列表。可以包含零个,一个或多个参数。

           无论是否有参数,()不能省略

           如果有参数,每一个参数都要指定数据类型和参数名,多个参数之间使用逗号分隔,例如:

  • 一个参数: (数据类型 参数名)
  • 二个参数: (数据类型1 参数1, 数据类型2 参数2)

           参数的类型可以是基本数据类型、引用数据类型

throws 异常列表:可选,在【第09章-异常处理】章节再讲

(3)方法体:方法体必须有{}括起来,在{}中编写完成方法功能的代码

(4)关于方法体中return语句的说明:

return语句的作用是结束方法的执行,并将方法的结果返回去

如果返回值类型不是void,方法体中必须保证一定有 return 返回值; 语句,并且要求该返回值结果的类型与声明的返回值类型一致或兼容。

如果返回值类型为void时,方法体中可以没有return语句,如果要用return语句提前结束方法的执行,那么return后面不能跟返回值,直接写return ; 就可以。

return语句后面就不能再写其他代码了,否则会报错:Unreachable code

补充:方法的分类:按照是否有形参及返回值

2、类比举例

3、代码示例:

/**
 * 方法定义案例演示
 */
public class MethodDefineDemo {
    /**
     * 无参无返回值方法的演示
     */
    public void sayHello(){
        System.out.println("hello");
    }

    /**
     * 有参无返回值方法的演示
     * @param length int 第一个参数,表示矩形的长
     * @param width int 第二个参数,表示矩形的宽
     * @param sign char 第三个参数,表示填充矩形图形的符号
     */
    public void printRectangle(int length, int width, char sign){
        for (int i = 1; i <= length ; i++) {
            for(int j=1; j <= width; j++){
                System.out.print(sign);
            }
            System.out.println();
        }
    }

    /**
     * 无参有返回值方法的演示
     * @return
     */
    public int getIntBetweenOneToHundred(){
        return (int)(Math.random()*100+1);
    }
    
    /**
     * 有参有返回值方法的演示
     * @param a int 第一个参数,要比较大小的整数之一
     * @param b int 第二个参数,要比较大小的整数之二
     * @return int 比较大小的两个整数中较大者的值
     */
    public int max(int a, int b){
        return a > b ? a : b;
    }
}

方法调用内存分析

方法没有被调用的时候,都在方法区中的字节码文件(.class)中存储。

方法被调用的时候,需要进入到栈内存中运行。方法每调用一次就会在栈中有一个入栈动作,即给当前方法开辟一块独立的内存区域,用于存储当前方法的局部变量的值。

当方法执行结束后,会释放该内存,称为出栈,如果方法有返回值,就会把结果返回调用处,如果没有返回值,就直接结束,回到调用处继续执行下一条指令。

栈结构:先进后出,后进先出。

举例分析:

public class Person {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.eat();

    }
    public static void eat() {
        sleep();
        System.out.println("人:吃饭");
    }
    public static void sleep(){
        System.out.println("人:睡觉");
        doSport();
    }
    public static void doSport(){
        System.out.println("人:运动");
    }
}

内存分析:

posted @ 2023-04-21 06:27  晓枫的春天  阅读(80)  评论(0编辑  收藏  举报