只有在方法调用的时候才涉及到值传递的概念!
Java中进行方法调用的时候传递参数时,遵循值传递的原则:
1)基本数据类型,传递的是数据的拷贝
2)引用数据类型,传递的是传递的引用地址的拷贝,而不是该对象本身
楼主的问题涉及到的内容太多,首先理解以下概念
形参:方法声明时的参数变量,用于接收调用方法时传过来的实参
如:void f(int i){} 或 void f(String s){}
实参:方法调用时实际传过去的内容,用于给形参赋值
如:f(1) 或 f("abc")
变量按不同的数据类型分为2类:
1)基本数据类型变量:4类8种基本类型,byte,short,char,int,long,float,double,boolean
如:int i = 0;
2)引用数据类型变量: 类,接口,数组
如:String s = "abc";
注意:Java中除了4类8种基本数据类型以外全部是引用数据类型
变量按声明的位置不同分为2类:
1)成员变量:方法外部,类内部声明的变量
2)局部变量:方法内部声明的变量,形参属于局部变量
变量的初始化:
1)成员变量:如果不显示对其初始化,那么Java采用默认值对其进行初始化
2)局部变量:不赋值,就不能使用
看来楼主对引用和对象的概念还不是特别了解,执行中的内存管理:
不同的操作系统不太一样,但一般内存都分为4个区域:
1)heap(堆):存放new出来的对象
2)stack(栈):存放局部变量
3)data segment(数据区):静态变量 和 字符串常量
4)code segment(代码区):存放代码
例子:
public class Test {
void f(int j) {
System.out.println(j);
}
void ff(String ss) {
System.out.println(ss);
}
public static void main(Stirng[] args) {
int i = 100;
String s = "hello";
Test t = new Test();
t.f(i);
t.ff(s);
}
}
当mian方法开始执行的时候
int i = 100; 栈中分配一块空间,存放变量i,值为100,基本数据类型只占一块空间
String s = "hello"; "hello"是字符串常量,分配在data区,字符串常量为String类的一个对象,
s指向了这个"hello"对象,这就是引用数据类型,在内存中占两块空间,
有点形象思维:一提引用类型,就是一块内存指向另一块内存
s可以被叫做:引用、引用变量、引用地址,其实s就是一个指针,在这里不用钻牛角尖,你就知道
s是一个引用,s的值是一个地址,根据这个地址就可以找到一个对象就ok了,
Test t = new Test(); 同理,栈中的引用t指向了堆中new出来的这个Test对象
Java中进行方法调用的时候传递参数时,遵循值传递的原则:
1)基本数据类型,传递的是数据的拷贝
2)引用数据类型,传递的是传递的引用地址的拷贝,而不是该对象本身
t.f(i);
方法的形参属于局部变量,所以在调用f方法的时候,栈内存分配一个int型的变量j,将i的值当做
实参传递过去,i的值是100,现在将100拷贝给了j,那么j的值就是100,这就是楼主说的“值传递
”,接着打印,最后方法结束,为该方法分配的局部变量立刻全部清空,那么Stack中这个j消失了
t.ff(s);
调用ff方法的时候,栈内存分配一个String型的变量ss,将s的值当做实参传递过去,s指向
了"hello"对象,s的值是一个地址,现在将这个地址拷贝给了ss,那么ss也就指向这个"hello"了
这就是楼主说的"引用传递",现在s 和 ss 两个引用 同时指向了"hello"对象,然后打印ss,最后方
法结束,栈中这个ss被清除
现在main方法执行结束,为main方法分类的局部变量清除,i,s,t全部消失,data区的符串常
量"hello"和堆内存的Test对象,由于没有任何引用指向他们了,就会被垃圾收集器回收
累死我了..