java零基础编译

java零基础编译倘只看书 便变成书橱 本文总结了一部分 java 编译期的语法糖 为了便于理解 本文不使用 java 字节码来推论 采用源代码和编译器编译后的伪代码来直观的表达 理解 java 在编译成 class 文件时 实际上编译器会给我们如何传递给 jvm 文章中每个语法糖都有如下两段代码 第一个源代码 第二个编译器解析后的伪代码 读者可根据两段代码的差异性 理解语法糖 格式如下 一 默认构造器 当我们创建一个类

大家好,我是讯享网,很高兴认识大家。



倘只看书,便变成书橱

本文总结了一部分java编译期的语法糖。为了便于理解,本文不使用java字节码来推论;采用源代码和编译器编译后的伪代码来直观的表达。理解java在编译成class文件时,实际上编译器会给我们如何传递给jvm

文章中每个语法糖都有如下两段代码,第一个源代码,第二个编译器解析后的伪代码,读者可根据两段代码的差异性,理解语法糖,格式如下:

讯享网

一、默认构造器

当我们创建一个类,如果没有编写任何构造器,编译器默认添加一个无参构造器

 
讯享网

二、自动拆/装箱

装箱:就是自动将基本数据类型转换为包装器类型;

拆箱:就是自动将包装器类型转换为基本数据类型;

1、编译器通过Integer.valueOf()实现基本数据类型的装箱

2、编译器通过integer.intValue()实现包装器类型的拆箱

3、如果用==比较,且一个是包装类型,一个是基本数据类型,会将包装类型拆箱

4、如果用equals比较,且一个是包装类型,一个是基本数据类型,会将基本类型装箱

 
 

三、范型擦除

JDK1.5开始

编译器会在编译后将范型擦除掉,但是会将范型信息存放在字节码文件模型的LocalVariableTypeTable 中

 
 

由于范型信息被存放在了字节码文件的LocalVariableTypeTable 中 ,在方法的形参和返回值上的范型,我们可以通过反射拿到

 

四、可变参数

可变长参数的定义:使用...表示可变长参数

例如 print(String... args){ ... }

在具有可变长型参的方法中可以把参数当成数组使用

 
 

五、forech

forech根据迭代对象的类型分为两种

数组

 
 

集合

 
 

六、switch的字符串

switch的实现是通过跳转指令或跳转表实现的, 这取决于分支的长度

java零基础编译

跳转表的特性在于key是整数且有序的,可以通过二分法快速匹配到,但JDK7开始,switch可以使用字符串和枚举。字符串与整形之前如何转换?这个功能实际上是语法糖来实现的。

 
 

 
 

 
 

 
 

jdk7开始,枚举实际是一个继承了Enum的类

 
 

 
 

 
 

 
 

通过打印B类的方法,我们可以验证

 
 

打印出来两个方法

 
 

成员内部类

 
 

 
 

可以看出:外部类和内部类都有相应的改动

1、在外部类存在一个公用的静态方法,将字段权限暴露出来

2、在内部类创建时,会通过构造器将外部类对象注入到自身成员变量中

3、内部类调用外部类的静态方法,获取到私有属性的值

方法内部类

 
 

 
 

其内部类的构造器上相对于成员内部类基础上多了局部变量的入参,并将其作为成员变量。

所以为什么方法内部类调用的变量要用final修饰?因为在内部类对象创建时就确定一切了。外面改了,里面就不一致了。

小讯
上一篇 2024-12-28 09:28
下一篇 2024-12-23 22:34

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/5665.html