引入:谈谈你对java的理解
1.java的平台无关性
2.GC
3.语言特性(泛型反射)
4.面向对象
5.类库
6.异常处理
Compile Once,Run Anywhere如何实现?
编译期:javac指令,编译java源码生成字节码存入相应的.class文件中
运行期: jvm解析,转换成特定平台(ios或者windows或者Linux)的执行指令
![217007e018e8e1ae19063f7c7dea2d7a.png](https://i-blog.csdnimg.cn/blog_migrate/ba203af9584147ee2441cf55665fab8c.jpeg)
示例代码:
package
正常编译后:
![afb59dedf230aac2bb4a5de8b59ff6bb.png](https://i-blog.csdnimg.cn/blog_migrate/f2d7d012ec993199ba90436a0242a8ef.png)
会多出来这样的.class文件
![374245a759ad4c55fb75459fae1acb09.png](https://i-blog.csdnimg.cn/blog_migrate/ce9785d44ba9129f7b8b2f93af703254.png)
再进一步调用:
![28253a6f6b70139f28e86f45c81802e0.png](https://i-blog.csdnimg.cn/blog_migrate/7cfb87a5c13c06925502522a6b6e98dd.png)
使用指令javap打开text.class:
![5877241eaeff5dcfb6977f8bdb5018a8.png](https://i-blog.csdnimg.cn/blog_migrate/d2ca8aaad8546f22fd9ce6142804e9d0.jpeg)
Compiled
总结:
java源码首先被转换为字节码,再由不同平台的jvm解析,java语言在不同的平台上不需要重新编译,java虚拟机在执行字节码的时候把字节码转换成具体平台上的机器指令。
为什么jvm不直接将源码解析成机器码去执行呢?
准备工作:每次执行都需要各种检查,都要重新编译重新分析,所以引入了中间字节码,多次执行程序不需要反复编译
兼容性:也可以将别的语言解析成字节码。也可以被jvm执行,增加兼容扩展能力