参数传递

先了解

值传递和地址传递的问题

引用类型和基本类型的问题.
基本类型就是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

 

 

posted @ 2016-10-11 18:43  NewAnken  阅读(157)  评论(0编辑  收藏  举报