【Java方法笔记】3-6 方法小结

§3-6 方法小结

这一章节重点学习了方法。现在,我们来做个简单的回顾。

3-6.1 方法定义

Java 中,方法定义遵循以下语法:

修饰符 返回值类型 方法名(形参列表) {
    //方法体
    return 返回值;
}

修饰符:修饰符主要为方法的访问修饰符,有 publicprivateprotected ,这在后面的章节中(类)有所提及。

方法名:方法名的命名应当为英文,见名知意,以方便调试和维护。同时,明明也应当符合规范,为 首字母小写 + 驼峰原则

值传递:一般情况下,方法被调用时,实际参数就会被复制一份,在内存中开辟一份新的内存空间给被调用的方法用于执行。当遇到 return 语句后,按照方法的返回值类型和返回内容向调用方法返回内容。这一过程遵循值传递,即无法通过被调用的方法操作该方法之外的内容。

例如,我们来看这个例子:

public class Example{
    public static void main(String[] args) {
        int a = 1;
        System.out.println(a);
        
        Example.change(a);
        System.out.println(a);
    }
    
    public static void change(int a) {
        a = 10;		//在方法中改变参数 a 的值;
    }
}

运行上述程序,可以发现,a的值并没有发生改变。这是值传递的结果。

image

方法结束和返回值类型:同时,return 语句相当于方法的结束语句,当遇到该语句后,方法执行完毕并退出,并腾出相应的内存空间。因此,若尝试在 return 语句后添加任何语句,都会被判定为 unreachable 从而报错。

方法的返回值应当要与其返回值类型相匹配。

当方法的返回值类型为 void 时,return 语句可以省略,也可以人工补全,但由于该方法无返回值类型,因此 return 关键字后不能够添加任何字段。

同时,也应当注意 return 关键字和 breakcontinue 的区别。

main 方法:每一份 .java 文件都是一个一该文件为名的类,且该文件中有且只有该类被 public 修饰。但可以根据需要在文件中加入更多的类。一般来说,一个项目里只需有一个类含有 main 方法即可,通过调用其它类中所定义的方法即可。但为了调试方便,每一个类中都可以添加 main 方法方便调试。且值得注意的是,一个程序有且只有一个 main 方法,程序运行时,main 方法总是最先被 JVM 调用。

参数列表:方法可以不接收参数,也可以接受一个或多个参数。调用方法时,实际参数必须和形式参数一一对应。若需要可变参数,可变参数必须放在方法形参列表中的最后一位,且注意,可变参数是一个数组。

方法重载:方法的重载方便了相同功能针对不同参数数量和类型的方法调用。方法重载的规则为,方法名和返回值类型必须相同,形参列表中形参数量和形参类型可以不同。

*命令行传参:不难发现,方法在结束时向调用者返回内容,但 main 方法的调用者是 JVM,向它返回内容毫无意义,因此 main 方法的返回值为 void 。但 main 方法中还包含了一个形式参数 args[] ,秉着 “谁调用,谁赋值” 的原则,这个形参的赋值应该由 JVM 完成。那么,我们尝试在终端中运行以下程序:

public class CommandLineCalling{
    public static void main(String[] args) {
        System.out.println(args.length);	//args 数组长度
        for (String arg: args) {
            System.out.println(arg);
        }
    }
}

在终端中键入以下命令:

java .\CommandLineCalling.java "Hello, world" "Hello, Java"

得到以下结果:

image

异常抛出:一个完整的方法通常还要考虑异常情况,即异常抛出。有关异常抛出的更多内容,请见后文。这里仅仅举一个例子:

public void readFile(String file) throws IOExceoption {
    ...
}

其实,在学习数组时,我们就已经提及过可能会遇到的数组下标越界异常ArrayIndexOutOfBoundsException

3-6.2 方法调用

静态方法:含有修饰符 static 的方法称为静态方法,属于类。静态方法会随着类的定义而被分配和装载至内存中(随类一起加载)。静态方法调用时,遵循以下语法:

类名.方法名(实参列表);
对象名.方法名(实参列表);

值得注意的是,静态方法只可以访问静态数据或成员,但是非静态方法既可以访问非静态数据和成员又可以访问静态数据和成员。同样地,静态方法只能访问静态数据方法,但非静态方法可以访问非静态和静态的方法。由于 main() 方法为静态方法,遵循这个原则。

可以联系变量的作用域加深理解。

非静态方法:不含 static 修饰符的方法称为非静态方法。与静态方法不同,非静态方法属于对象的具体实例(实例化),只有在类的对象创建时,在对象的内存中才有这个方法的代码段(随对象加载)。调用时,遵循语法:

new 类名().方法名(实参列表);

类名 对象名 = new 类名();	//对象类型 对象名 = new 对象值();
对象名.方法名(实参列表);

一般来说,我们优先选择第二种调用方法。首先把类实例化为对象,然后通过对象调用方法。

例如,我们定义两份文件:

//MethodCalling.java
public class MethodCalling {
    public static void main(String[] args) {
        Student student = new Student();
        student.say();
    }
}

//Student.java
public class Student {
    public void say() {
        System.out.println("有人在说悄悄话。");
    }
}

引用传递:与值传递不同,引用传递可以实际操作传入的参数。在调用过程中,实际上实际参数也产生了一个副本,但由于指向对象的地址相同,因此引用传递可以实际操作传入的参数。例如:

public class MethodCalling {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.name);    //null

        MethodCalling.change(person);
        System.out.println(person.name);
    }

    public static void change(Person person) {
        person.name = "Zebt";
    }
}

class Person {
    String name;    //类变量:具有初值(null)
}

运行程序,结果如图:

image

this 关键字this 是自身的一个对象,代表对象本身。可以简单理解为:指向对象本身的一个指针。详见继承章节。

posted @ 2023-02-25 21:35  Zebt  阅读(31)  评论(0)    收藏  举报