前面已经提到过方法的定义与调用方法,现在我们深入的理解一下方法。Java中的方法表达实体的动作或者行为,类似于结构化语言中的函数,但是还是有极大的区别的,Java中的方法必须依赖于类定义,不能单独定义、运行,必须定义在类中,且在逻辑上,方法要不属于类所有,要不属于对象所有。
一句一句理解,方法必须依赖于类定义,前面也提到过,Java中的最小单位是类,因此,方法只能作为类的一部分存在,不能够单独的存在,也是因为这样,方法的调用也要依赖于类或者对象,这在前面也提到过了,这里也许有疑问,在同一个类当中,方法之间不就是直接调用的?这一点,一部分已经在前一更新中提到了,在同一个类之间调用,静态方法之间的调用是省略了类名的,而成员方法之间调用是省略了this关键字的。
class Test{
static void fun1(){}
static void fun2(){
fun1(); //其实是Test.fun1();
}
void fun3(){}
void fun4(){
fun3();//其实是this.fun3();
}
}
静态方法是不能调用非静态方法的,原因在上一节已经提到了,这是没有显示的把这个概念罗列出来。
继续,了解Java方法的参数列表部分,先声明一个概念:Java的方法参数传递方法只有 【值传递】,就是将值复制一份传递过去,看代码:
class Test {
public void fun01() {
int i = 20;
System.out.println(i);//20
fun02(i);
System.out.println(i);//20
}
public void fun02(int i) {
i = 100;
}
}
在上面的代码中,fun01中定义了i=20,输出一遍后,传值给fun02,fun02将i=100,随后在fun01中输出i还是20,这就印证了Java中的参数传递方法是值传递这一点,那么在内存中是怎么样的呢?看一下:
所以,两个方法中操作的是两个值。 有时候我们也许会遇到这样的情况,迷惑我们:
class Test{
int x = 20;
}
class Test01 {
Test test = new Test();
public void fun01() {
System.out.println(test.x);//20
fun02(test);
System.out.println(test.x);//100
}
public void fun02(Test test) {
test.x = 100;
}
}
这两个test.x的值不一样,显然是被修改了,为什么呢?细心一点会发现,fun02(test)传递的是一个对象,是引用类型,我们知道对象存的是一个地址,那么值传递传递过去的是一个地址:
这样,还是证明了我们说的值传递的说法。