一.单元概述
方法是程序的重要组成部分,在面向对象的程序设计语言中,方法是类的组成部分,用来实现程序功能的,通过本章的学习应该能够了解Java语言中方法编写的语法,掌握方法的调用和重载。
二、教学重点与难点
重点:
(1) 方法的定义
(2) 方法的调用
(3) 方法的值传递和引用传值
(4) 方法的重载
难点:
(1) 方法的值传递和引用传值
(2) 方法的重载  

5.1方法的定义

方法是程序设计语言中重要的组成部分,可以说程序的功能都是通过方法和方法间的调用来实现的,在面向对象程序设计中,类的方法用来描述类的动作或活动,比如图书的增加、修改或删除。下面我们通过一个例子来看一下不使用方法的缺点。

例5.1 打印多个矩形-不使用方法的编写方式

  1. class Func_sample1 {
  2. public static void main(String args[]) {
  3. /*
  4. * 打印一个3行,3列的矩形
  5. */
  6. for (int row = 0; row < 3; row++) {
  7. for (int col = 0; col < 3; col++) {
  8. System.out.print("*");
  9. }
  10. System.out.println();
  11. }
  12. System.out.println();
  13. /*
  14. * 打印一个5行,6列的矩形
  15. */
  16. for (inti = 0; i< 5; i++) {
  17. for (int j = 0; j < 6; j++) {
  18. System.out.print("*");
  19. }
  20. System.out.println();
  21. }
  22. System.out.println();
  23. /*
  24. * 打印一个7行,8列的矩形
  25. */
  26. for (inti = 0; i< 7; i++) {
  27. for (int j = 0; j < 8; j++) {
  28. System.out.print("*");
  29. }
  30. System.out.println();
  31. }
  32. }
  33. }

运行结果如下图5.1所示。
05.方法的定义和调用 - 图1

图5.1 Func_sample1的运行结果

上面的例子是打印多个矩形,可以看出打印不同行数和列数的矩形基本语句是相同的,只有行数和列数变量的取值不同,而代码却写了多遍,不够简化,那么有什么办法可以简化程序的编写呢,方法就可以解决这样的问题,下面我们来学习方法的定义。

定义方法就是编写一段有特定功能的代码,在程序中使用同样功能的地方,没有必要重复编写同样的代码,只要调用定义好的方法就可以。可以实现代码的重用。简化了程序的编写和维护工作。

方法声明的语法结构为:

  1. [访问控制符] [修饰符] 返回值类型 方法名( 参数类型 形式参数,参数类型 形式参数,…)
  2. {
  3. 方法体
  4. }

例5.2 一个求两数最大值的例子:

  1. public static int getBigger(int num1, int num2){
  2. if (num1 > num2)
  3. return num1;
  4. else
  5. return num2;
  6. }
  7. }

这个方法的功能为求两个参数num1和num2的最大值,修饰符包含两个,分别为public和static,返回值类型为int,方法名为getBigger,包含两个参数,都是int类型的,方法体为一组if-else语句。

下面我们对方法的结构进行详细介绍:
1. 修饰符:修饰符是可选的,它指定了方法的属性并且告诉编译器该方法可以如何调用,public 、static 被称为修饰符(后续会详细讲解它们)。
2. 返回值类型:返回值类型是方法要返回的值的数据类型,例如可以是int,若方法不返回值,则返回值类型为关键字void。
3. 方法名:它作为调用时引用方法的标识。
4. 参数列表:方法可以有一个参数列表,按方法的规范称为形式参数。当方法被调用时,形式参数用变量或数据替换,这些变量或数据称为实际参数。参数是可选的,方法的参数个数可以是0个到多个,每个参数前面要声明参数的数据类型;每个参数要用逗号分开。
5. 方法体:它是一个语句块,执行特定的功能操作。对于有返回值类型的方法,方法体当中最后一个语句是return关键字,它的作用是把方法的执行(运算)结果返回到方法外部。
6 return 表达式:这里,进一步分析,return后面的表达式就是方法的返回值。需要注意表达式的类型,必须与方法头中声明的“返回类型”相匹配。

掌握了方法的基本语法,前面没有使用方法的例题就可以写成如下的方式。
例5.3 使用方法来打印多个矩形

  1. class Func_sample2 {
  2. /*
  3. * 打印一个n行,m列的矩形
  4. */
  5. public static void printRectangle(int row,int col){
  6. for (int i = 0; i< row; i++) {
  7. for (int j = 0; j < col; j++) {
  8. System.out.print("*");
  9. }
  10. System.out.println();
  11. }
  12. }
  13. public static void main(String args[]) {
  14. printRectangle(3,3);
  15. printRectangle(5, 6);
  16. printRectangle(6, 7);
  17. }
  18. }

运行结果如下图5.2所示。
05.方法的定义和调用 - 图2

图5.2 Func_sample2的运行结果 由上面的例题可见,打印矩形的代码只写了一遍,用一个方法封装起来,当需要使用的时候,用方法名调用即可,这样大大简化了程序。

5.2 方法的分类

方法的编写和应用都比较灵活,主要是从参数和返回值两个方面去变化,那么可以对方法进行两种分类。
根据参数个数:

  • 无参方法
  • 有参方法

根据返回值类型:

  • 有返回值的方法:
    • 根据返回值的类型细分为:
      • 基本数据类型
      • 引用数据类型
    • 无返回值的方法
      • void

例5.4 无返回值,无入参的方法

  1. public static void drawRect()
  2. {
  3. int width=10;
  4. int height=5;
  5. for(int i=0;i<height;i++)
  6. {
  7. for(int j=0; j<width;j++)
  8. {
  9. System.out.println("#");
  10. }
  11. System.out.println();
  12. }
  13. }

例5.5 无返回值,有入参的方法

  1. public class FunctionDemo{
  2. public void getBigger(int x, int y ) {
  3. if( x>=y ) {
  4. System.out.println( x );
  5. }
  6. else{
  7. System.out.println( y );
  8. }
  9. return; //没有返回值,return可以省略
  10. }
  11. }

例5.6 有返回值,无入参的方法

  1. public static int add()
  2. {
  3. int x=100;
  4. int y=200;
  5. int z =x+y;
  6. return z;
  7. }

例5.7 有返回值,有入参的方法

  1. public class FunctionDemo {
  2. public int absolut(int x){
  3. if(x>=0){
  4. return x;
  5. } else{
  6. return -x;
  7. }
  8. }
  9. }

5.3方法的调用

创建方法就是为了要使用的,那么如何使用一个方法呢,这就是调用。方法只有在被调用后才生效,那么有返回值的方法和无返回值的方法调用方式是否相同呢,参数如何处理呢,下面就来学习方法的调用方式。

调用方法的格式为:

  1. 方法名(实际参数表);

根据方法是否有返回值,通常有两种途径调用方法:

  1. 如果方法返回一个值,对方法的调用通常就当做一个值处理。
  2. 如果方法返回void,对方法的调用应是当做语句处理。

所谓调用方法,其实就是给方法的入口传入一些值(参数),然后在出口得到方法执行的结果(返回值)。给方法传入参数的过程,称为“传参”。实际上,方法传参的过程就是把实参赋值给对应的形参的过程,并且实参和形参的数量、类型必须匹配。

  • 形参必须注明数据类型
  • 实参直接写,不需要类型声明
  • return只能返回一次
  • 遇到return语句,方法结束执行,后续语句不执行
  • 方法的返回值,必须与方法声明中的返回值类型匹配
  • 方法定义,不能写在main()中
  • 方法是不能嵌套的

下图是参数传递的例子,在FunctionDemo中有add和main两个方法,add方法有两个形式参数,在main方法中对add方法进行调用,调用时带两个实参,分别10和20两个值传递给x和y,又调用时带两个实参,分别100和200两个值传递给x和y,如下图5.4所示。
05.方法的定义和调用 - 图3

图5.4 FunctionDemo

5.4 方法的值传递和引用传递

学习完方法的调用,掌握了如何把简单类型参数传递给方法。也可将对象传递给方法,把对象类型的变量传递给方法和把简单类型传递给方法是有区别的,简单类型和数组类型做形参的对比如下图5.6所示。
05.方法的定义和调用 - 图4

图5.6简单类型和数组类型做形参的对比

5.5方法的重载

在同一个类中,允许同时存在一个以上同名的方法的现象就叫做方法的重载,也就是说,两个或者两个以上的方法,具有相同的名称和不同的参数列表。Java编译器根据方法名和参数情况共同决定调用哪个方法。

方法重载的规则:

  • 1.方法名称相同
  • 2.方法的参数必须不同,参数个数不同或参数类型不同
  • 3.方法的返回值类型可以相同,也可以不同

重载的例子如下图5.8所示。

  1. public static int getSum(int end)
  2. {
  3. int sum=0;
  4. for(int i=1; i<=end;i++)
  5. {
  6. sum+=i;
  7. }
  8. return sum;
  9. }
  10. public static int getSum(int start, int end)
  11. {
  12. int sum=0;
  13. for(int i=start;i<=end;i++)
  14. {
  15. sum+=i;
  16. }
  17. return sum;
  18. }


例5.9 计算参数之和。

  1. class MethodAdd {
  2. /*
  3. * 计算两个整数的和
  4. */
  5. int add(int x, int y) {
  6. int sum;
  7. sum = x + y;
  8. return sum;
  9. }
  10. /*
  11. * 计算三个整数的和
  12. */
  13. int add(int x, int y, int z) {
  14. return x+y+z;
  15. }
  16. /*
  17. * 计算两个双精度浮点数的和
  18. */
  19. double add(double x, double y) {
  20. return x + y;
  21. }
  22. }

5.6课后作业

(一) 选择题
1. 有以下方法的定义,请选择该方法的返回类型?

  1. ReturnType method(byte x, float y){
  2. return (short)x/y*2;
  3. }
  1. A.byte<br /> B.short<br /> C.int<br /> D.float<br /> <br />2. 下列方法定义中,方法头不正确的是 <br />A.double m( int m){ } <br />B.void m( int m){ } <br />C.public int m(int m, int n){ } <br />D.m( int h,int m,int n){ }<br /> <br />3. Java中,一个类可同时定义许多同名的方法,这些方法的形式参数的个数、类型或顺序各不相同,返回的值也可以不相同。这种特性称为 <br />A.隐藏 <br />B.覆盖 <br />C.重载 <br />D.Java不支持此特性<br /> <br />4. 下列选项中,哪些可以与void setAge(int year,int month,int day)方法在同一个类中定义 <br />A. public void setAge() { } <br />B. void setAge(int age) { } <br />C. void setAge(int y,int m,int d){ } <br />D. int setAge(Date d) { } <br />E. int setAge(int year,int month,int day){} <br />F. void setage(int year,int month,int dat){}

(二)编程题
1. 编写一个方法,求整数n的阶乘,例如5的阶乘是12345。
2. 编写一个方法,判断该年份是平年还是闰年。
3. 编写一个方法,输出大于200的最小的质数。
4. 写一个方法,功能:定义一个一维的int 数组,长度任意,然后将它们按从小到大的顺序输出(使用冒泡排序)。
[

](https://null_688_6639.gitee.io/javase/01JavaSE/%E7%AC%AC4%E7%AB%A0%E6%95%B0%E7%BB%84.html)