参数传递

先了解

值传递和地址传递的问题

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

 

 

转载于:https://www.cnblogs.com/Ansonrelovisa/p/5950383.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值