java中的不能独立存在,必须定义在类里,逻辑上属于类或对象,因此必须使用类(static修饰的方法)或对象(非static修饰的方法或static修饰的方法)调用(不能独立执行)。
参数传递机制
java中只有一种参数传递机制:值传递,即将实际参数值的副本传入方法,而参数本身不受方法影响。当参数是基本数据类型时,这种机制很好理解,但是当参数是引用类型时,往往会造成误解。直接上例子:
class Data{
public int i;
public int j;
public Data(int i, int j){
this.i = i;
this.j = j;
}
}
public class TransferTest{
public void swap(int i,int j){
int temp = 0;
temp = i;
i = j;
j =temp;
}
public void swap(Data d){
int temp = 0;
temp = d.i;
d.i = d.j;
d.j = temp;
}
public static void main(String[] args){
int a = 2;
int b = 3;
TransferTest tt = new TransferTest();
tt.swap(a,b);
System.out.println("a改变之后为:" + a);
System.out.println("b改变之后为:" + b);
Data d = new Data(4,5);
tt.swap(d);
System.out.println("d的成员变量i改变之后为:" + d.i);
System.out.println("d的成员变量j改变之后为:" + d.j);
}
}
结果为:
可以看到a和b没有变化,d.i和d.j发生了对换。a和b符合值传递,不再解释。那么为啥d的成员变量互换了?
我们知道值传递传的是副本,而对于类的对象来说也相当于副本(d是引用变量,d在栈中,指向堆中的实际对象)。那么通过值传递,传递的应该是是副本的一个副本,仍然指向堆中的实际对象,因此在方法中操作的是实际对象。上图说明(有点搓,凑合看吧):
可以在swap()中设置d=null(方法中的d指向null),结果没变,即说明了是值传递。
形参个数可变的方法
从JDK1.5开始,java允许定义形参个数可变的方法,有两种方法定义:
在定义方法时,在最后一个参数的类型后增加三个点,则表示该方法可接受多个参数,以数组形式传入。代码如下:
public class Var{ public static void test(int i,int ... a){ //a被当做数组处理 for(int temp : a){ System.out.println(temp); } } public static void main(String[] args){ test(1,2,3,4,5); System.out.println("----华丽的分割线1----"); test(1,2,3,4,5,6,7,8,9); System.out.println("----华丽的分割线2----"); //直接用数组做实参 int[] a = {2,3,4}; test(1,a); } }
需注意的是:这种方式的参数只能在形参列表的最后给出,因此一个方法中只能有一个可变的形参,可以用数组赋值。
在定义方法时,可以在任意位置采用数组形式作为参数:
public class Var{ public static void test(int i,int[] a){ for(int temp : a){ System.out.println(temp); } } public static void main(String[] args){ int[] a = {2,3,4}; //实参只能是数组 test(1,a); } }
重载(Overload)
重载含义:同一个类中,形参列表不同(个数,类型,顺序)的多个方法,即两同一不同:同类,同名,不同形参列表。至于返回值类型、修饰符不能作为方法重载的依据。如下代码:
public class Overload{
public void test(){
;
}
public int test(){
int i = 0;
return i;
}
}
提示错误为:
即例子中两个test()方法只有返回值类型不同,不能称之为重载。举个简单的例子若例子中某个方法调用test()方法:
test();
这种情况人都不能区分调用的是哪个更何况机器!
还有不怎么建议重载形参长度可变的方法,