Java中参数传递与内存存储

Java中参数传递与内存存储

无论是Java还是C++,我们都会在写函数的时候遇到传值和传址的问题。在这里我就总结一下Java的参数传递,以及内存到底是如何存储的。

 

<!--[if !supportLists]-->一、<!--[endif]-->参数传递

<!--[if !supportLists]-->1.<!--[endif]-->值传递

大家先看一下下面的简单代码:

public static void main(String[] args) {

int i =0;

i++;

int j= i;

j++;

System.out.println("i = "+i);

System.out.println("j = "+j);

 

swap(i,j);

 

System.out.println("交换后----i = "+i);

System.out.println("交换后----j = "+j);

}

 

 

public static void swap(int a,int b)

{

int temp=a;

a=b;

b=temp;

}

}

 

你认为i,j交换了吗?

公布答案,i,j其实并没有交换。

输出的结果是:

i = 1

j = 2

交换后----i = 1

交换后----j = 2

 

概括来说,值传递其实是将参数的原始数值拷贝一份,然后参与函数内部的变换,但是并没有影响它原始的值。

<!--[if !supportLists]-->2.<!--[endif]-->址传递

除了数组名作为形参传递到函数中是址传递外(数组名存的是数组的首地址,地址传递肯定是址传递,这里就不多讲),还有一种情况,就是Java中经常遇到的对象赋值情况。

下面看一个例子

新建了一个Student类:

public class Student {

 

private String name;

private int score;

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public int getScore() {

return score;

}

 

public void setScore(int score) {

this.score = score;

}

 

public void study(){

score++;

System.out.println(name+"学习中,学分是:"+score);

}

}

 

在Test主函数中,有:

public static void main(String[] args) {

Student stu1 = new Student();

stu1.setName("张三");

stu1.setScore(5);

 

Student stu2 = new Student();

stu2.setName("李四");

stu2.setScore(1);

 

stu1.study();

stu2.study();

 

stu2 = stu1;//赋值操作

 

System.out.println("stu2 = stu1后----------");

 

stu1.study();

stu2.study();

   }

}

 

大家觉得结果会怎样呢?(别忘了study方法中还有score++哟!)

公布答案:

张三学习中,学分是:6

李四学习中,学分是:2

stu2 = stu1后----------

张三学习中,学分是:7

张三学习中,学分是:8

 

从结果中可以看出,赋值语句,其实是将stu2指向了stu1的地址,然后stu2就存的是张三和6分的学分了。

 

概括的说,址传递中,对象1=对象2 的 赋值 ,是将对象2中存储的内存首地址拷贝一份给对象1,对象1于是指向了对象2的地址,存储了对象2 的属性和方法。

址传递也一般使用与非基本类型的引用类型

<!--[if !supportLists]-->二、<!--[endif]-->内存存储

内存主要包含:

<!--[if !supportLists]-->1.<!--[endif]-->堆:new的对象(包含属性方法等等)

<!--[if !supportLists]-->2.<!--[endif]-->栈:存储基本类型的数据名和值、对象名字和对象指向的堆的地址

<!--[if !supportLists]-->3.<!--[endif]-->静态内存:存储用static定义静态成员

 

 

总结:值传递只是对参数内容的复制,不改变原本的内容;址传递是一种改变原来内容的传递,址传递应用的比较多的一个是数组名作为参数传递,一个是两个对象的赋值操作。

内存主要讨论堆栈和静态内存,一定要知道,类new出来的对象名是在栈里,类的具体方法属性是存储到堆里。8中基本类型的变量名和数值直接存储在栈里,其他的与new方法

相似。

 

<!--EndFragment-->

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值