方法参数是引用数据类型时
- 示例1
package Demo;
public class Person {
String name;
}
package Demo;
public class Test_1 {
public static void main (String[] args){ /*main方法压栈运行*/
Person p = new Person(); /*定义了一个person类的对象p,p.name赋初值null,person类进堆占用一部分内存*/
p.name ="张三"; /*这里给p.name赋值"张三",p.name由null变成张三*/
System.out.println(p.name); /*输出p.name*/
function(p); /*调用function,function也进栈,function方法运行完毕后出栈*/
System.out.println(p.name); /*输出p.name*/
}
public static void function (Person t){
t.name = "李四"; /*给传入的person对象的name赋值为"李四"*/
} /*main方法完成后出栈,但堆中用过的内存暂时不会被释放(需要被虚拟机释放)*/
}
运行结果:
张三
李四
- 理解
引用数据类型作为方法的参数,类似于c语言中的指针。对于这个示例来讲的话,function(p)是直接对堆中p.name之前存储的"张三"进行了一个替换,直接从根本上改变了数据,这种改变是永久性的,而不是暂时性的。
方法参数是基本数据类型时
- 示例2
package Demo;
public class Test_2 {
public static void main (String[] args){
int a = 9;
System.out.println(a);
function(a);
System.out.println(a);
}
public static void function (int a){
a += 8;
}
}
运行结果
9
9
- 理解
示例中在main方法中先对a赋值为9,进行了一次输出a,这次的值为9,相信这一点大家都理解,而后调用了function方法,将a的值更改为了17,这时再进行a的值输出的话不应该是17吗,但为什么还输出了9呢?
类似示例1的main方法进栈运行,但调用到function方法时,它的参数却不同于示例1,它的参数同它一起存储在方法栈中,而不是存储在堆中,因此,参数传入后,进行+8运算,a的值更新在function方法中为17,但随着function方法的运行结束,function出栈,连带着存储在它中的a一起消去。回到main函数中,再次进行对a的值的输出就仍旧是最初的值9了。
以上理解和阐述若有哪里不足敬请读者们指正哦~
Java方法参数详解

本文深入解析Java中方法参数的传递机制,对比基本数据类型与引用数据类型的参数传递区别,通过实例展示参数如何在堆和栈中存储及变化。
6575

被折叠的 条评论
为什么被折叠?



