方法是类或对象的行为特征的抽象,方法是类或对象最重要的组成成分。但从功能上看,方法完全类似于传统结构化程序设计里的函数。值得指出的是,Java里的方法不能独立存在,所有的方法必须定义在类里。方法在逻辑上要么属于类,要么属于对象。
1.方法的所属性
永远不要把方法当成独立存在的实体,正如现实世界由类和对象组成,而方法只能作为类和对象的附属,Java语言里的方法也是一样。Java语言里方法的所属性主要体现在以下几个方面。
>方法不能独立定义,方法只能在类体内定义。
>从逻辑意义上来看,方法要么属于该类本身,要么属于该类的一个对象。
>永远不能独立执行方法,执行方法必须使用类或对象作为调用者。
使用static修饰的方法属于类本身,既可以使用类本身调用也可以使用对象调用。但值得注意的是,因为使用static修饰的方法还是属于这个类的,因此使用该类的任何对象来调用这个方法时将会得到相同的执行结果,因为实际上还是使用这些实例所属的类作为调用者。
没有使用static修饰的方法则属于该类的对象,不属于类本身。因此没有static修饰的方法只能用对象作为调用者调用,不能使用类作为调用者调用。使用不同对象调用同一个普通方法,可能得到不同的结果。
一句话,有static修饰的方法属于类本身,可以用类以及对象调用;反之只能使用对象调用。
2.方法的参数传递机制
Java里的参数传递方式只有一种:值传递。所谓值传递,就是将实际参数的副本(复制品)传入方法内,而参数本身不会受到任何影响。
(1)基本类型的参数传递
public class PrimitiveTransferTest {
public static void swap(int a , int b){
//下面三行代码实现a.b变量的值变换
//定义一个临时变量来保存a变量的值
int tmp = a;
//把b的值赋给a
a = b;
//把临时变量tmp的值赋给b
b = tmp;
System.out.println("swap方法里,a的值是" + a + ";b的值是" + b);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 6;
int b = 9;
swap(a , b);
System.out.println("交换结束后,变量a的值是" + a + ";变量b的值是" + b);
}
}
程序的结果如下:
解释:在main方法调用swap方法时,系统为二者分配两个栈区同时用于保存a.b变量,并将main方法中的a,b参数的值分别赋给swap方法中a,b参数,这时候实际上系统存在两个a,两个b,只是存在两个不同的栈区。因而当调用swap方法时 ,实际上操作的是swap方法中a,b两个参数,与main方法中的a,b参数无关。这同时反映了值传递的实质:当系统开始执行方法时,系统为形参执行初始化,就是把实参变量的值赋给方法的形参变量,方法里操作的并不是实际的实参变量。
(2)引用类型的参数传递