码迷,mamicode.com
首页 > 其他好文 > 详细

只有在方法调用的时候才涉及到值传递的概念!

时间:2015-09-04 17:00:32      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

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对象,由于没有任何引用指向他们了,就会被垃圾收集器回收

只有在方法调用的时候才涉及到值传递的概念!

标签:

原文地址:http://www.cnblogs.com/lxclqy/p/4781869.html

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