## Java調用方法的參數傳遞
1. 如果形參是[基礎數據類型](Java%E5%9F%BA%E7%A1%80%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.md),實參向形參傳遞時,就是值傳遞。在調用方法棧幀內申請變量,存的是實參的值。
2. 如果形參是對象數據類型,實參向形參傳遞是,則是將形參內存的堆內對象的引用地址復制給形參。實際上還是值傳遞,只是值指的是對象的引用地址。
## 原理
***Java在方法傳遞參數時,是將變量復制一份,然后傳入方法體內執行。***
## 例子
### int類型是值傳遞
~~~
System.out.println("--------int start----------");
// int為基本類型,是值傳遞,value還是等于100
int value = 100;
System.out.println("value address:"+VM.current().addressOf(value));
changeNum(value);
System.out.println("value:"+value);
System.out.println("value address:"+VM.current().addressOf(value));
System.out.println("--------int end----------");
~~~
~~~
private static void changeNum(int a){
System.out.println("method value address before:"+VM.current().addressOf(a));
a = 100;
System.out.println("method value address after:"+VM.current().addressOf(a));
}
~~~
輸出:
```
--------int start----------
value address:32570546328
method value address before:32570546328
method value address after:32570544744
value:100
value address:32570546328
--------int end----------
```
### 對象類型是引用傳遞
~~~
System.out.println("--------A.class start----------");
A a = new A(12,"123");
System.out.println("A.class address:"+VM.current().addressOf(a));
changeA(a);
System.out.println("A.class value:"+a);
System.out.println("A.class address:"+VM.current().addressOf(a));
System.out.println("--------A.class end----------");
~~~
~~~
static class A{
public int age;
public String name;
public A(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "A{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
~~~
~~~
private static void changeA(A a){
System.out.println("method A.class address before:"+VM.current().addressOf(a));
a.age = 1;
a.name = "xxx";
System.out.println("method A.class address after:"+VM.current().addressOf(a));
}
~~~
輸出:
```
--------A.class start----------
A.class address:32586262016
method A.class address before:32586262016
method A.class address after:32586262016
A.class value:A{age=1, name='xxx'}
A.class address:32586262016
--------A.class end----------
```
- 面試突擊
- Java虛擬機
- 認識字節碼
- 000Java發展歷史
- 000Macos10.15.7上編譯OpenJDK8u
- 001熟悉Java內存區域
- 002熟悉HotSpot中的對象
- 003Java如何計算對象大小
- 004垃圾判定算法與4大引用
- 005回收堆和方法區中對象
- 006垃圾收集算法
- 007HotSpot虛擬機垃圾算法實現篇1
- 007HotSpot虛擬機垃圾算法實現篇2
- 007HotSpot虛擬機垃圾算法實現篇3
- 008垃圾收集器
- 009內存分配與回收策略
- 010Java虛擬機相關工具
- 011調優案例分析
- 012一次IDEA的啟動速度調優
- 013類文件Class的結構
- 014熟悉字節碼指令
- 015類加載機制(過程)
- 016類加載器
- IDEA的JVM參數
- Java基礎
- Java自動裝箱與拆箱
- Java基礎數據類型
- Java方法的參數傳遞
- Java并發
- 001走入并行的世界
- 002并行程序基礎
- 003熟悉Java內存模型JMM
- 004Java并發之volatile關鍵字
- 005線程池入門到精通
- 006Java多線程間的同步控制方法
- 007Java維基準測試框架JMH
- 008Java并發容器
- 009Java的線程實現
- 010Java關鍵字synchronized
- 011一些并行模式的熟悉
- 單例模式和不變模式
- 生產者消費者模式
- Future模式
- 012一些并行算法的熟悉
- 面試總結
- 長亮一面