Java有关方法的总结
1. 方法概述
2. 不同类型的方法
3. 方法的调用形式
1. 方法概述
在C、C++中用函数这个术语来描述命名子程序,而在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.
这里所说的不同类型是指返回类型
基本类型:int、double、float、boolean、char、byte、long、short
无返回型: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仍然指向原来的区域,所以会出现值被修改了的结果。
在以这种方式调用方法的时候依然是值调用,上述拷贝被称之为浅拷贝。