形参于实参对应两种类型:值类型与引用类型
值类型:包括8种基本类型(byte、short、int、long、double、float、char、boolean)+String
引用类型:数组、类、接口等类型。
注意String类型,这个比较特殊,它是存储在常量池中的,你可以把它近似看成值类型的。因为它的值一旦确定,就无法改变【可能不太严谨,可以看看JVM内容,应该可以通过其他方式修改的,但一般的操作是修改不了String的值。
为值类型时,形参方法内的参数值改变,并不会影响到实参的值。
为引用类型时,形参方法内的参数值改变时,会影响到实参的值。注意是地址所指向的堆中的值,如果形参的地址改变了,那么这个改变不会影响到实参。
代码示例:
//定义一个Tree类
Class Tree{
public int val;
public TreeNode leftChild;
public TreeNode rightChild;
public TreeNode(int newData)
{
this.val = newData;
this.leftChild = this.rightChild = null;
}
}
//定义一个修改形参内部Tree指向的方法
public void change(Tree tree){
tree=new Tree(22222);
}
//主方法
public static void main(String[] args){
Tree tree=new Tree(1);
System.out.println(tree.val);//输出值1
change(tree);
System.out.println(tree.val);//输出值1
}
为什么两次的输出结果没有变呢,明明在change()方法中已经让tree=new Tree(22222);了,这是因为“我们只是修改了tree的地址指向,并没有修改存放在堆中的实际值,而实参的地址并不会跟着形参的地址变化而变化”,当形参的change()方法执行完毕后,存放在栈中的形参地址变量也就会被释放掉,不复存在了。所以怎么可能会影响到实参的地址指向呢?