框架是個好東西,可早晚有一天會過時,這世界上就沒有亙古不變的東西,來學下Java基礎吧
利用反編譯工具JD-GUI來探尋Java編譯的藝術與原理【Java版本:Java 11.0.5】
高版本的JDK的結論與低版本的有很多不符,建議研究Java8,畢竟目前大部分公司都用的Java8
包裝類
自動拆裝箱
源碼:
public class Test {
public static void main(String[] args) {
Integer a1 = 10;
int a2 = a1;
}
}
反編譯後的class文件
package cn.luckycurve.demo10;
public class Test {
public static void main(String[] args) {
Integer a1 = Integer.valueOf(10);
int a2 = a1.intValue();
}
}
可以看出:
包裝類和基本數據對象是通過valueOf()和xxxValue的方法來相互轉換實現自動拆裝箱的
Foreach循環
- 如果遍歷的是數組類型
源碼:
public class Test {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4};
for (int i : a) {
System.out.println(i);
}
}
}
反編譯結果
public class Test {
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
for (int i : a)
System.out.println(i);
}
}
- 如果遍歷的是對象數組
源碼:
public class Test {
public static void main(String[] args) {
Integer[] a = {1, 2, 3, 4};
for (Integer i : a) {
System.out.println(i);
}
}
}
反編譯結果
public class Test {
public static void main(String[] args) {
Integer[] a = { Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3), Integer.valueOf(4) };
for (Integer i : a)
System.out.println(i);
}
}
- 如果遍歷的是集合
源碼
public class Test {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(1);
list.add(1);
for (Integer i : list) {
System.out.println(i);
}
}
}
反編譯結果
public class Test {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(Integer.valueOf(1));
list.add(Integer.valueOf(1));
list.add(Integer.valueOf(1));
for (Integer i : list)
System.out.println(i);
}
}
結論:
Foreach並不會進行額外的封裝
註解,枚舉…待續