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-->
上一篇: 汉朝被毁与董卓张角有关吗?到底因何而废
下一篇: 参数传递