Java中有关方法的简单总结

Java有关方法的总结

1.      方法概述

2.      不同类型的方法

3.      方法的调用形式

1.      方法概述

CC++中用函数这个术语来描述命名子程序,而在Java中用方法这个术语来表示“做某些事情的方式”。Java中的方法决定了一个对象能够接受什么样的消息,方法的基本组成包括:名称、参数、返回值和方法体

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

        方法体;

}

例如:

	public static int max(int num1,int num2){
		int result;
		if(num1 > num2)
			result = num1;
		else
			result = num2;
		return result;
	}

num1,num2被称之为形式参数(formal parameter),当调用该方法是传递的参数被称之为实际参数(actual parameter)

Java中的方法是基于对象的,只能作为类的一部分来创建,且只能通过对象来被调用,除了静态(static ,针对于类)方法>

2.      不同类型的方法

这里所说的不同类型是指返回类型

基本类型:intdoublefloatbooleancharbytelongshort

无返回型:void

用户自定义类型:用户创建的类型

3.     方法调用,这里主要总结方法调用过程以及Java在方法调用时参数的传递形式

  • 方法的调用过程
public class TestMax {

	/**
	 * 演示方法调用过程
	 * @author LiMing
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i=1;
		int j=2;
		int k=max(i,j);
		System.out.println("Max is:"+k);

	}
	public static int max(int num1,int num2){
		int result;
		if(num1 > num2)
			result = num1;
		else
			result = num2;
		return result;
	}
}


当程序调用一个方法时,程序控制语句就会转移到被调用的方法中,当执行完return语句或者执行到表示方法结束的右括号时,被调用方法把控制权还给调用者。我们来看看在系统内部是如何实现方法的调用的:

每当调用一个方法时系统都会将参数、变量存储在一个称之为堆栈(Stack)的内存区域,他以后进先出的形式存储数据,当一个方法调用令另一个方法时,调用者的堆栈空间保持不动,新开辟的空间处理新方法的调用。当一个方法结束返回到调用者的时候,其相应的空间也就会被释放

该图演示了上述程序执行过程。

  • 参数传递

    在程序设计语言中有关参数传递的一些术语,值调用(call by value)表示方法接收到的是调用者提供的值。引用调用(call by reference)表示方法接收到的是调用者提供的变量的地址。Java总是采用值调用的。

    public class TestMax {
    
    	/**
    	 * 演示Java方法参数传递形式
    	 * @author LiMing
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int num=0;
    		raise(num);
    		System.out.println("After funtction raise(),num is :"+num);
    	}
    	public static void raise(int x){
    		x = x+1;
    		System.out.println("In the Method,x is :"+x);
    	}
    }

    讨论上述代码执行过程:


方法在调用时传递的其实是num的一个拷贝,raise方法调用结束后,x变量便不再使用

 然而,方法参数共有两种类型:

  • 基本数据类型
  • 对象引用

已经可以看到,一个方法不能修改一个基本类型数据的参数,下面我们来看对于对象引用是否如此:

public class TestMax {

	/**
	 * 演示Java方法参数传递形式
	 * @author LiMing
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p1=new Person(100);
		Person p2=new Person(200);
		swap(p1,p2);
		System.out.println("After function swap(): p1'money:"+p1.getMoney()+"  p2'money:"+p2.getMoney());
	}
	public static void swap(Person p1,Person p2){
		double temp=p2.getMoney();
		p2.setMoney(p1.getMoney());
		p1.setMoney(temp);
		System.out.println("In The method: p1'money:"+p1.getMoney()+"  p2'money:"+p2.getMoney());
	}
}
class Person{
	public Person(double m){
		money=m;	
	}
	public double getMoney(){
		return money;
	}
	public void setMoney(double m){
		money=m;
	}
	private double money;
}

下面是程序的输出:

我们惊奇的发现值被改变了,其实内部的运行情况是这样的:

调用方法时首先拷贝出p1和p2的引用,并且拷贝出来的指向相同的区域,通过swap方法交换money后,原来的p1以及p2仍然指向原来的区域,所以会出现值被修改了的结果。

在以这种方式调用方法的时候依然是值调用,上述拷贝被称之为浅拷贝。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章