转载

Java方法的传参问题

形参:形式参数,在定义方法时所携带的参数。

实参:实际参数,在调用函数时传递给函数的。

实参和形参的区别:形参只有在被调用的时候,才分配内存单元,在调用结束时立即释放内存单元,形参只在当前方法内部有效。

1.值传递:在运行函数时,形参和实参在不同的内存位置之中,形参将实参的值复制一份。在函数运行结束时,形参被释放,实参的值不会发生改变。

2.地址传递:在运行函数时,传给形参的是实参的地址,那么形参被修改时,实参也会发生改变。

Java到底是值传递还是引用传递?有人说Java的基本类型是值传递,引用类型是传地址。也有人说JAVA只有值传递。其实都有道理,但我更倾向于第一种说法。即 JAVA基本类型是按照值传递,除了String以外的非基本类型是按照引用传递。

看一下下面的代码

public class Main {

public static void main(String[] args){
int i = 3;
//基本类型,值传递,不会修改i的值
changeInt(3);
//print 3
System.out.println(i);

Book book1 = new Book();
book1.setName("Java");
//输出book1的哈希值,可以认为是内存地址。
System.out.println(book1.hashCode());
//引用类型,传递的是对象的内存地址。
changeObject(book1);
//修改了book1的值。print python
System.out.println(book1.getName());
}

public static void changeInt(int i){
i = 10;
}
public static void changeObject(Book book){
book.setName("python");
//形参book的哈希值和book1一致。
System.out.println("internal hash code"+book.hashCode());
}
}

class Book{
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

上面的代码输出是这个样子的。

after change i: 3
book1 hash code: 1625635731
internal hash code: 1625635731
after change book1: python

大家注意我代码中注释的部分。根据上面的定义,所以说Java基本类型是值传递,非String的引用类型是引用传递也就是地址传递。String类有些特殊请看我这篇文章。

原文  https://hellofrank.github.io/2019/09/23/Java方法的传参问题/
正文到此结束
Loading...