Java方法的调用分析

来自CloudWiki
跳转至: 导航搜索

方法的调用过程

Java2020-5-15.png

运用调试工具 演示下列方法的执行过程

 <nowiki>
package task5;


public class TestMax {
	
 /** 返回两个整数变量较大的值 */
  public static int max(int num1, int num2) {
	      int result;
	      if (num1 > num2)
	         result = num1;
	      else
	         result = num2;
	 
	      return result; 
	   }
	   
   /** 主方法 */
   public static void main(String[] args) {
      int i = 5;
      int j = 2;
      int k = max(i, j);
      System.out.println( i + " 和 " + j + " 比较,最大值是:" + k);
   }
 
   
}


</nowiki>

结论1:方法调用时程序原有的逻辑中断,跳转到方法处去执行方法,结束之后再跳回。

参数值的传递

<修饰符><返回值类型> 方法名  (参数类型 参数名) {

 //方法体代码

}

参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法既可以不包含任何参数,也可以包含多个参数。

下面的例子演示Java方法参数值传递的效果。

该程序创建一个方法,该方法用于交换两个变量。

TestPassByValue.java 文件代码:

  /** 交换两个变量的方法 */
  public static void swap(int n1, int n2) {
    System.out.println("\t进入 swap 方法");
    System.out.println("\t\t交换前 n1 的值为:" + n1
                         + ",n2 的值:" + n2);
    // 交换 n1 与 n2的值
    int temp = n1;
    n1 = n2;
    n2 = temp;
 
    System.out.println("\t\t交换后 n1 的值为 " + n1
                         + ",n2 的值:" + n2);
  }

方法调用:

  public static void main(String[] args) {
    int num1 = 1;
    int num2 = 2;
 
    System.out.println("交换前 num1 的值为:" +
                        num1 + " ,num2 的值为:" + num2);
 
    // 调用swap方法
    swap(num1, num2);
    System.out.println("交换后 num1 的值为:" +
                       num1 + " ,num2 的值为:" + num2);
  }


以上实例编译运行结果如下:

交换前 num1 的值为:1 ,num2 的值为:2
    进入 swap 方法
        交换前 n1 的值为:1,n2 的值:2
        交换后 n1 的值为 2,n2 的值:1
交换后 num1 的值为:1 ,num2 的值为:2

思考:swap函数的作用是什么 ?

思考:num1 和num2分别对应哪个变量

思考:经过函数的运算后,num1和num2两个变量的值改变了吗 ?

结论2:传递两个参数调用swap方法。有趣的是,方法被调用后,实参的值并没有改变。

变量的作用域

变量作用域是变量可以使用的范围,取决于变量声明的位置,一般Java方法内部定义的变量不能在方法外使用。

Java 变量的范围有四个级别:类级、对象实例级、方法级、块级。

思考:在方法内部定义的变量在方法外部还能使用吗 ?

  • 类级变量又称全局级变量,在对象产生之前就已经存在,即用static修饰的属性。
  • 对象实例级,就是属性变量。
  • 方法级:就是在方法内部定义的变量,就是局部变量。
  • 块级:就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如if、for语句的块。


结论3:在方法内部定义的变量在方法外部不能使用

【实例3-7】变量作用域演示程序设计。

public class TestVariable {
	private static String name = "类级";// 类级
	private int i; // 对象实例级
	
        public TestVariable(int i){
             this.i = i;
        }
	public void test1() {
		int j = 4;// 方法级
		if (j == 4) {
			int k = 5;// 块级
		}
		// 这里不能访问块级的变量,块级变量只能在块内部访问
		System.out.println("name=" + name + ",i=" + i + ",j=" + j);
	}
	public static void main(String[] args) {
		TestVariable t = new TestVariable(2);
		t.test1();
                // 这里不能访问方法内部的变量,方法内部变量只能在方法内部访问
		//System.out.println("name=" + t.name + ",i=" + t.i + ",j=" + t.j);
		TestVariable t2 = new TestVariable(3);
                t2.test1();
	}
}

程序运行结果如下:

name=类别,i=0,j=4

若局部变量与类的成员变量同名,则类的成员变量被隐藏。下面的例子说明了局部变量z和类成员变量z的作用域是不同的。

【实例3-8】同名变量作用域测试程序设计。

package task5;

public class Variable {	
		int x = 0, y = 0, z = 0;// 类的成员变量
		void init(int x, int y) {
			this.x = x;
			this.y = y;
			int z = 3; // 局部变量
			System.out.println("** in init**" + "x=" + x + " y=" + y + " z=" + z);
		}
	
		public static void main(String args[]) {
			Variable v = new Variable();
			System.out.println("**before init**" + "x=" + v.x + " y=" + v.y + "z="+ v.z);
			v.init(10, 15);
			System.out.println("**after init**" + "x=" + v.x + " y=" + v.y + "z="+ v.z);
		}

}}

运行程序结果如下。

**before init**x=0 y=0 z=0
** in init **x=10 y=15 z=3
**after init**x=10 y=15 z=0

返回值的类型

Java 支持两种调用方法的方式,根据方法是否返回值来选择。

当程序调用一个方法时,程序的控制权交给了被调用的方法。当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序。

当方法返回一个值的时候,方法调用通常被当做一个值。例如:

int larger = max(30, 40);

如果方法返回值是void,方法调用一定是一条语句。例如,方法println返回void。下面的调用是个语句:

System.out.println("欢迎访问菜鸟教程!");

带返回值的方法

1. 函数名前标明返回值类型

2. 函数体内部要有return返回语句

3. 把函数作为一个值赋给外界

package task5;

public class TestMax {
	
 /** 返回两个整数变量较大的值 */
  public static int max(int num1, int num2) {
	      int result;
	      if (num1 > num2)
	         result = num1;
	      else
	         result = num2;
	 
	      return result; 
	   }
	   
   /** 主方法 */
   public static void main(String[] args) {
      int i = 5;
      int j = 2;
      int k = max(i, j);
      System.out.println( i + " 和 " + j + " 比较,最大值是:" + k);
   }
 
   
}

返回值为void的方法

例题: 学生成绩判定

这个方法体中就不带任何返回值,因此:

  • 方法定义时方法名前返回值类型写void即可
  • 方法调用时不需要将方法的计算结果赋值给一个变量。
public class TestVoidMethod {
  public static void main(String[] args) {
    printGrade(78.5);
  }
 
  public static void printGrade(double score) {
    if (score >= 90.0) {
       System.out.println('A');
    }
    else if (score >= 80.0) {
       System.out.println('B');
    }
    else if (score >= 70.0) {
       System.out.println('C');
    }
    else if (score >= 60.0) {
       System.out.println('D');
    }
    else {
       System.out.println('F');
    }
  }
}

如果方法返回值是void,方法调用一定是一条语句。例如,方法println返回void。下面的调用是个语句:

printGrade(78.5);


返回值为void的方法还可以用return 来结束方法。当一个方法执行到一个return语句时,这个方法将被结束。

  • Java程序中大部分循环都被放在方法中执行。一旦在循环体内执行到一个return语句,return语句就会结束该方法,循环自然也随之结束。例如:
public class Test {


  public static void firstOdd( ) {
	  for(int i = 0; i < 5; i++) {			
			if(i%2 != 0) {
				System.out.println("第1个奇数是" + i);
				return;
			}
			
	  }

  }
   /** 主方法 */
   public static void main(String[] args) {
	   firstOdd();
   }
       
 
   
}


  • 从上面运行结果来看,循return直接结束整个方法,不管这个return处于多少层循环之内。

结论5:当方法返回一个值的时候,方法调用通常被当做一个值。如果方法返回值是void,方法调用一定是一条语句。