先上结论(带着结论往下看):
java中方法参数传递方式是 按值传递。
如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。
1、搞清楚 基本类型 和 引用类型的不同之处
int num = 10;
String str = "hello";
2、赋值运算符(=)的作用 :
为了大家更好理解,赋值语句,你可以从右往左看
int num = 10;
String str = "hello";
num = 20;
str = "java"; // 把 “java”对象地址赋值给 str
image.png
3、实参与形参
public static void main(String[] args){
}
这里面的 args就是参数 。参数再程序语言中分为形式参数和实际参数 。
形式参数 :
是在定义函数的时候 ,使用的参数 ,目的是用来接收调用该函数时传递的参数 。
实际参数 :
在调用有参函数时,主调用函数和被调用函数之间有数据传递关系 在主调用函数中调用一个函数时,函数名后面的参数成为: 实际参数。
4、Java方法本质 :
当我们调用某个java方法时,实际上是线程调用了它私有的虚拟机栈,将方法作为一个栈帧将其压入虚拟机栈中。
栈帧中存放着局部变量表(即该java方法中的局部基本类型变量、引用对象指向堆的地址)、
操作数栈(用于计算的临时数据存储区,相当于栈帧里面又有一个栈,这个栈的入栈出栈主要用作计算)、
动态链接、方法出口。
它本质是一个内存区块,里面存储着方法的数据集。一个方法从开始执行到执行完毕其实就对应该栈帧的入栈到出栈的过程。
上代码 :
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
list.add(i);
}
add(list);
for (Integer j : list) {
System.err.print(j + ",");
;
}
// 0,1,2,3,4,5,6,7,8,9,100,
System.err.println("");
System.err.println("*********************");
String a = "A";
append(a);
System.err.println(a); // A
int num = 5;
addNum(num);
System.err.println(num); // 5
}
static void add(List<Integer> list) {
// list 是实参list 地址的拷贝,都是指向堆内存中的对象
list.add(100); // 调用堆中对象的方法
}
static void append(String str) { // "A" str = Ox1111 拷贝
str += " is a";
// "A is a " 新对象, 地址为: Ox1112 ,赋值语句,把地址Ox1112给到形参 str
System.err.println("append str : " + str);
//append str : A is a
}
static void addNum(int a) { // 值 5 的拷贝
a = a + 10; // 5+10 = 15 , 赋值给形参 a
System.err.println("addNum a :" + a); // addNum a = 15
}
}
(以上内容是为了大家方便理解,有些地方不是很准确,还请指教)
参考知乎: https://www.zhihu.com/question/31203609
网友评论