diff options
| author | yingyu5658 <i@yingyu5658.me> | 2025-12-13 08:33:08 +0800 |
|---|---|---|
| committer | yingyu5658 <i@yingyu5658.me> | 2025-12-13 08:33:08 +0800 |
| commit | 1e5f8eb33bc41cb59faf059e83701152785cabea (patch) | |
| tree | 45867273ac2178285be840764f7962d2b55556c6 /content/posts/Java方法的传参原理.md | |
| download | blog-1e5f8eb33bc41cb59faf059e83701152785cabea.tar.gz blog-1e5f8eb33bc41cb59faf059e83701152785cabea.zip | |
Initial commit
Diffstat (limited to 'content/posts/Java方法的传参原理.md')
| -rw-r--r-- | content/posts/Java方法的传参原理.md | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/content/posts/Java方法的传参原理.md b/content/posts/Java方法的传参原理.md new file mode 100644 index 0000000..98824ce --- /dev/null +++ b/content/posts/Java方法的传参原理.md @@ -0,0 +1,102 @@ +--- +abbrlink: 1642973481 +author: yingyu5658 +categories: +- 往昔 +cid: 95 +cover: images\2024\12\2743265221.jpg +customSummary: null +date: "2024-11-30 20:14:00" +layout: post +mathjax: auto +noThumbInfoEmoji: null +noThumbInfoStyle: code +outdatedNotice: false +parseWay: auto +reprint: standard +slug: 95 +status: publish +tags: +- Java +thumb: null +thumbChoice: default +thumbDesc: null +thumbSmall: null +thumbStyle: default +title: Java方法的传参原理 +updated: 2024/12/07 10:56:51 +--- + + +## Java方法的参数传递机制-基本类型 +值传递 +### 值传递是什么 +在传输实参给方法的形参的时候,**传输的是实参变量中存储的副本** +说人话,把实参里面的东西赋值了一部分扔了给形参 +## 值传递具体理解案例 +```java +public class prameter { + public static void main(String[] args) { + int a = 10; //定义一个int变量a赋值为10 + change(a); //调用change方法 + System.out.println("main" + a); //打印mian a中的值 + } + +//这里开始写方法 + public static void change(int a){ + System.out.println("change1" + a); //打印方法中a的值 + a = 20; + System.out.println("change2"a); //打印赋值后a的值 + } +} +``` +我们运行以后,控制台输出的结果为 +``` +change1 10 +change2 20 +main 10 +``` +## 为什么main中打印的不是赋值后的20? +这就要提到刚才的概念:**值传递** +我们定义了一个变量``a = 10;``,在方法中``public static void change(int a)`` +由于**值传递**,也就是把值复制了一分传给方法,所以我们方法里用的值永远都是刚刚定义的``int a = 10;``,所以``change(a); = change(10);`` +我们后面再赋值,打印出来的结果还是10,除非你把变量定义的代码改了,否则方法里的值不会变。 + + +## 引用类型的参数传递 +引用类型的参数传递也满足值传递,但代码中会有不同的地方。 +示例代码 +```java + public static void main(String[] args) { + int[] arrs = new int[]{10,20,30}; + change(arrs); + System.out.println("main" + arrs[1]); + } + public static void change(int[] arrs) { + System.out.println("方法内1" + arrs[1]); + arrs[1] = 222; + System.out.println("方法内2" + arrs[1]); + } +``` +结果: +``` +方法内1:20 +方法内2:222 +main:222 +``` +上一篇文章提到了栈内存的执行顺序,根据上一篇所讲,代码执行顺序如下: +1.先执行 +```java + public static void change(int[] arrs) { + System.out.println("方法内1" + arrs[1]); + arrs[1] = 222; + System.out.println("方法内2" + arrs[1]); + } +``` +2.再回到main方法 +```java + System.out.println("main" + arrs[1]); +``` +在1时进行打印,结果得到数组内第二个位置存储的20. +代码继续向下执行,第二个位置被赋值为222,此时再打印它,结果得到222. +这时候change方法执行完,它在栈内存中会被清除,然后回到main方法,由于刚才change方法中对arr[1]进行了赋值,所以我们再打印,结果得到的还是它赋值出来的222. |
