方法由函数发展而来,有点相似但是不同。系统是由类组成的,方法不能独立存在,必须属于类或对象。
属性:
--方法不能独立定义,方法只能在类体里定义。
--在逻辑意义上看,方法属于类本身,或者该类的一个对象
--不能独立执行方法,必须使用类或者对象作为调度者。
使用static修饰的方法属于类本身,可以使用类作为调度者来使用,也可以使用对象作为调度者使用。使用不同对象调用这个方法会得到相同的结果。
没有static修饰的方法,属于类的对象,不属于类本省,只能使用其他对象调用,并且使用不同对象作为调度者可能得到不同的结果。
方法的参数传递
调用方法必须使用类或其他对象作为调度者,如果声明方法包含了形参声明,调用方法时必须给指定参数值,调用方法时实际传给形参的参数值称为实参。
public class PrimitiveTransferTest
{
public static void swap(int a , int b)
{
// 下面三行代码实现a、b变量的值交换。
// 定义一个临时变量来保存a变量的值
int tmp = a;
// 把b的值赋给a
a = b;
// 把临时变量tmp的值赋给a
b = tmp;
System.out.println("swap方法里,a的值是"
+ a + ";b的值是" + b);
}
public static void main(String[] args)
{
int a = 6;
int b = 9;
swap(a , b);
System.out.println("交换结束后,变量a的值是"
+ a + ";变量b的值是" + b);
}
}
结果:swap方法里,a的值是9;b的值是6
交换结束后,变量a的值是6;变量b的值是9
class DataWrap
{
int a;
int b;
}
public class ReferenceTransferTest
{
public static void swap(DataWrap dw)
{
// 下面三行代码实现dw的a、b两个成员变量的值交换。
// 定义一个临时变量来保存dw对象的a成员变量的值
int tmp = dw.a;
// 把dw对象的b成员变量值赋给a成员变量
dw.a = dw.b;
// 把临时变量tmp的值赋给dw对象的b成员变量
dw.b = tmp;
System.out.println("swap方法里,a成员变量的值是"
+ dw.a + ";b成员变量的值是" + dw.b);
// 把dw直接赋为null,让它不再指向任何有效地址。
dw = null;
}
public static void main(String[] args)
{
DataWrap dw = new DataWrap();
dw.a = 6;
dw.b = 9;
swap(dw);
System.out.println("交换结束后,a成员变量的值是"
+ dw.a + ";b成员变量的值是" + dw.b);
}
}
结果:swap方法里,a成员变量的值是9;b成员变量的值是6
交换结束后,a成员变量的值是9;b成员变量的值是6
为什么2个程序结果不一样呢,在第一个程序中:
a,b是在main中定义的,在swap中交换后,其实在内存中的值并没有交换,交换的a和b
但是在第二个程序中,swap在操作dw时,它只是引用变量,main和swap操作的dw都是DataWrap里面的,所以在swap中变幻后main也变了。
形参个数可变
个数可变的形参只能处于形参列表的最后,也就是说,一个方法最多只能有一个参数可变的形参。
public class Varargs
{
// 定义了形参个数可变的方法
public static void test(int a , String... books)
{
// books被当成数组处理
for (String tmp : books)
{
System.out.println(tmp);
}
// 输出整数变量a的值
System.out.println(a);
}
public static void main(String[] args)
{
// 调用test方法
test(5 , "疯狂Java讲义" , "轻量级Java EE企业应用实战");
}
}
或者直接定义形参为数组
public static voidtest(int a,String[] books);
test(5,String[] {"疯狂Java讲义" , "轻量级Java EE企业应用实战"})