
4.2 方法的声明及使用
方法(函数)是程序的重要组成部分,利用方法可以更好地实现代码的重用操作,本节将为读者讲解方法的定义以及相关的使用。
4.2.1 方法的定义
方法就是一段可重复调用的代码段,例如,有某段长度约100行的代码,要在多个地方使用此段代码,如果在各个地方都重复编写此部分代码的话,则肯定会比较麻烦,而且此部分代码如果修改的话也比较困难,所以此时可以将此部分代码定义成一个方法,以供程序反复调用。
提示
方法与函数的关系。
有些书中把方法(method)称为函数(function),这两者是同样的概念。只是在面向对象的语言中常称为方法,在面向过程的语言中常称为函数。
方法的定义在Java中可以使用多种方式,格式4-8定义的方法可以直接使用主方法(main())调用,是因为将方法声明处加上了public static关键字,这两个关键字的作用将在后面的章节进行详细的介绍。方法暂时使用如下的语句进行定义:
【格式4-8 方法的定义格式】

要特别注意的是,如果不需要传递参数到方法中,只要将括号写出,不必填入任何内容。此外,如果方法没有返回值,则在返回值类型处要明确地写出void,此时,在方法中的return语句可以省略。方法执行完后无论是否存在返回值都将返回到方法的调用处并向下继续执行。
【例4.11】定义一个方法,在主方法中进行调用

程序执行结果:

从上面的程序中可以发现,因为printInfo()方法本身不需要任何的返回值声明,所以使用了void关键字进行声明,表示此方法不需要任何的返回值,所以不需要编写return语句。
上述范例的执行流程图,如图4-11所示。

图4-11 printInfo()方法执行流程图
从图4-11中读者可以清楚地看出,当调用printInfo()方法时,程序会跳转到printInfo()方法中执行,当printInfo()方法全部执行完之后就会返回调用处向下继续执行。
注意
方法命名规范要求。
在定义类时,要求全部单词的首字母必须大写,那么在定义方法时也是有命名规范要求,即第一个单词的字母小写,之后每个单词的首字母大写,如printInfo()方法。希望读者在日后的开发中一定要养成好的习惯。
前面已经为读者介绍了没有返回值的方法,下面来看一个有返回值的方法,此方法的功能就是计算两个数字相加后的结果,代码如下。
【例4.12】有返回值的方法

程序执行结果:

另外,在方法中可以定义多个变量,这些变量只在方法的内部起作用,所以也可以把这些变量称为局部变量。
4.2.2 方法的重载
方法的重载就是方法名称相同,但参数的类型和参数的个数不同,通过传递参数的个数及类型不同以完成不同功能的方法调用。如下面代码所示:
【例4.13】验证方法的重载

程序执行结果:

从上面的程序中可以发现add()方法被重载了3次,而且每次重载时的参数类型或个数都有不同,所以在调用时,会根据参数的类型和个数自动进行区分,如图4-12所示。

图4-12 方法重载的调用
提示
System.out.println()方法也属于重载方法。
从前面的内容中可以知道屏幕打印语句System.out.print()方法可以打印任何的数据,如:

可以发现程序可以打印数字、小数、字符、布尔类型等各种各样的数据,也就是说println()方法被重载了。
提示
重载的注意事项。
另外方法的重载一定只是在参数上的类型或个数不同,下面的代码不是方法重载的运用。
实例:错误的方法重载

上面的程序中可以发现,方法的接收参数类型和个数完全一样,但只是方法的返回值类型不一样,上面的程序也是不可能编译通过的,所以不是方法重载。
从语法定义上来讲,重载的方法可以有不同的返回值类型,但是从开发的标准来讲,还是建议读者对于同一方法要统一返回值类型。
4.2.3 使用return结束一个方法
在Java的方法定义中,可以使用return语句直接结束方法。但是此类操作形式与continue、break语句类似,往往都要结合if分支语句一起使用,具体代码如下所示。
【例4.14】使用return结束方法

程序执行结果:

从上面程序运行结果中发现,虽然在return中没有返回任何的内容,但是一旦执行到了return语句之后,方法将不再执行,而返回到被调用处继续向下执行。
4.2.4 方法的递归调用
递归调用是一种特殊的调用形式,是方法自己调用自己,如图4-13所示。

图4-13 方法的递归调用
例如,要完成一个数字的累加操作,除了可以使用之前的循环方式外,还可以使用递归调用。
【例4.15】递归调用

程序执行结果:

上面程序完成了递归方法的调用,就相当于sum(100)+sum(99)+sum(98)+…+sum(1),从程序的sum()方法中可以发现,递归调用时必须有一个明确的结束条件,然后不断改变传入的数据,才可以实现递归调用。
注意
尽量避免使用递归调用。
递归调用在操作的时候如果处理不好,则有可能出现内存的溢出,所以对于这种方法调用形式使用时要谨慎。