标签:
先了解
值传递和地址传递的问题
引用类型和基本类型的问题.
基本类型就是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 variable
40 //n2是一个局部变量,出了类方法的范围就不能够在使用了.
41
42 }
43
44 }
运行结果:_________________
n1=9
n=8 age=19
标签:
原文地址:http://www.cnblogs.com/Ansonrelovisa/p/5950383.html