【Java方法笔记】3-6 方法小结
§3-6 方法小结
这一章节重点学习了方法。现在,我们来做个简单的回顾。
3-6.1 方法定义
Java 中,方法定义遵循以下语法:
修饰符 返回值类型 方法名(形参列表) {
//方法体
return 返回值;
}
修饰符:修饰符主要为方法的访问修饰符,有 public
,private
和 protected
,这在后面的章节中(类)有所提及。
方法名:方法名的命名应当为英文,见名知意,以方便调试和维护。同时,明明也应当符合规范,为 首字母小写 + 驼峰原则。
值传递:一般情况下,方法被调用时,实际参数就会被复制一份,在内存中开辟一份新的内存空间给被调用的方法用于执行。当遇到 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
的值并没有发生改变。这是值传递的结果。
方法结束和返回值类型:同时,return
语句相当于方法的结束语句,当遇到该语句后,方法执行完毕并退出,并腾出相应的内存空间。因此,若尝试在 return
语句后添加任何语句,都会被判定为 unreachable
从而报错。
方法的返回值应当要与其返回值类型相匹配。
当方法的返回值类型为 void
时,return
语句可以省略,也可以人工补全,但由于该方法无返回值类型,因此 return
关键字后不能够添加任何字段。
同时,也应当注意 return
关键字和 break
,continue
的区别。
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"
得到以下结果:
异常抛出:一个完整的方法通常还要考虑异常情况,即异常抛出。有关异常抛出的更多内容,请见后文。这里仅仅举一个例子:
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)
}
运行程序,结果如图:
this
关键字:this
是自身的一个对象,代表对象本身。可以简单理解为:指向对象本身的一个指针。详见继承章节。