一、编译器优化+自动装箱
1. Dog验证类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Dog {
private String name;
List<String> strings;
private Long thresholdTime;
}
2. Test测试类
public class TestMain1 {
public static void main(String[] args) {
System.out.println(getThresoldTimes());
}
public static Long getThresoldTimes(){
Dog dog = new Dog();
dog.setName("111");
return dog == null?-1:dog.getThresholdTime();
}
}
3. 允许结果【出现空指针异常】
Exception in thread "main" java.lang.NullPointerException
at com.luoyu.aiyu.luo1.TestMain1.getThresoldTimes(TestMain1.java:25)
at com.luoyu.aiyu.luo1.TestMain1.main(TestMain1.java:18)
分析——编译后的class文件:
public class TestMain1
{
public static void main(String[] args) {
System.out.println(getThresoldTimes());
}
public static Long getThresoldTimes() {
Dog dog = new Dog();
dog.setName("111");
return Long.valueOf((dog == null) ? -1L : dog.getThresholdTime().longValue());
}
}
再次分析:
注:重新验证Test
public class TestMain1 {
public static void main(String[] args) {
System.out.println(getThresoldTimes());
}
public static Long getThresoldTimes(){
Long a = -1L;
return a;
}
}
注:重新验证Test.class
public class TestMain1
{
public static void main(String[] args) {
System.out.println(getThresoldTimes());
}
public static Long getThresoldTimes() {
Long a = Long.valueOf(-1L);
return a;
}
}
这里说明:执行的Long.valueOf代表的是自动装箱。。。因为Long本身就是对象
同时:如下代码,1L表示long 1。根据编译器自动装箱,需要将这里的表达式转换为:Long a = Long.valueOf(1L);
Long a = 1L;
这里为什么需要Long.valueOf呢?因为-1L代表的是long 而 testLong()代表的是Long
最后统一需要转换成Long。
本质上:用的是这个方法:所以testLong()需要先将Long转换成long,故使用了longValue()方法