欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中参数传递与内存存储

程序员文章站 2022-05-09 20:35:03
...

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-->