码迷,mamicode.com
首页 > 编程语言 > 详细

Java的值传递说明

时间:2015-03-28 18:51:10      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:java值传递

只有在方法调用的时候才涉及到值传递的概念! 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对象,由于没有任何引用指向他们了,就会被垃圾收集器回收 累死我了..

Java的值传递说明

标签:java值传递

原文地址:http://zhunixingfu.blog.51cto.com/7430537/1625996

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!