首页 > 代码库 > 参数传递
参数传递
先了解
值传递和地址传递的问题
引用类型和基本类型的问题.
基本类型就是java数据的那8种基本类型 ,引用类型字面意思就是把原来的对象引用了,比如字符串、类、方法就是引用类型.
比如:
一个类BOOK;
BOOK book;
BOOK book=new BOOK();
可以这么理解:
引用是放对象的一个内存地址,不是放一个对象
简单说book是BOOK类一个对象
事实上应该说book是包含BOOK对象的引用
其次是值传递和地址传递的问题.
以下面例子为例
int a=1;
String b="1";
a就是1,1就是a,当你修改a就是直接改堆栈里面的值. 就是上面说的地址传递 (用equal?)
b="1",就可以理解成是一个指向内存堆地址的指针,把1赋给变量b。
当你b的值,其实改的是内存堆里的内容,指针本身是没有改变的,也就是内存地址不变.
在java中,变量的存放的位置主要还是取决于它声明的位置.
比如:
在方法参数中的声明或者是局部变量就是放在栈.
对于new出来的对象和类声明的局部变量,始终还是被JVM放在堆里面.
例子:
String str = "abc";
String str = new String("abc");
例如String str = new String("abc");
new出的new String("abc")是放在内存堆里面的,内容还是abc,跟上面的String str = "abc"一样.
但是很显然两者存放的位置是不一样的. 这一点要清楚。
解释引用变量存放位置的原理:
对象在创建时将为所有的成员变量分配内存
对象会在创建时被分配到堆中的空间,因此成员变量就会被分配在堆中
方法在调用时被JVM线程加载至栈中,局部参数或变量临时分配内存空间,
局部变量及参数的所在位置存在与栈中,这些局部变量及参数所占空间是临时的,一旦方法调用结束其临时空间就会被释放。
参数传递栗子如下:
1 class studentsev{ 2 3 String name; 4 int age; 5 6 } 7 8 9 public class parapass2 {10 11 public void calc1(int n2)12 13 {14 n2=n2+1;15 System.out.println("n1="+n2);16 17 //传递是内存地址.18 19 }20 21 public void calc2(studentsev student){22 student.age=student.age+1;23 }24 //定义在方法里面的变量.都是存放在堆中.传递的只是student的值.方法调用结束后就释放掉.25 26 public static void main(String[] args){27 parapass2 ps2=new parapass2();28 int n1=8;29 ps2.calc1(n1);30 31 studentsev stu=new studentsev();32 stu.age=18;33 ps2.calc2(stu);34 System.out.println("n="+n1+" age="+stu.age);35 36 //最后出来的n=9,n1是全局变量.在方法里面修改了内容之后,就结束了.在内存里面的还是原来的.37 //System.out.println("n1="+n2+" age="+stu.age);38 39 //n2处会出现一个提示信息 :n2 cannot be resolved to a variable40 //n2是一个局部变量,出了类方法的范围就不能够在使用了.41 42 }43 44 }
运行结果:_________________
n1=9
n=8 age=19
参数传递