框架是个好东西,可早晚有一天会过时,这世界上就没有亘古不变的东西,来学下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并不会进行额外的封装
注解,枚举…待续