2018/7/26:
看极客时间中《java核心技术36讲》第一章问题
1.什么是解释执行什么是编译执行?
解释执行:类似口译,要执行一句就解释一句为机器语言,适合小型的项目。
编译执行:类似全文翻译,先编译为机器语言,然后你再执行,适合大型项目。
❤2.java是解释执行吗?
在我浅薄的认知中,我不知道为什么会有这样的问题。开始学的时候,老师就说java是编译执行,python是解释执行,真是一脸懵逼。我猜测老师说的是下面说的前半部分,问题问的是后半部分?
作者说:
首先:Java分为①编译期和② 运行期。
1).java-- 编译---->.class -------->这个步骤是一次编译,到处执行那句话。
2).class----->类加载器------->解释/编译执行
在运行期:
a)jvm内嵌的解释器讲.class转换成最终的机器码。
b)大多数的JVM,都提供JIT(Just-In-Time)动态编译器,将热点代码编译成机器码,这种情况就是编译执行而不是解释执行。
c)还有一种新的AOT(Ahead-of-Time-Compilation)直接讲字节码编译成机器码,避免JIT预热各方面的开销。比如Oracle JDK 9
所以:.java是解释执行吗?错,java有解释执行,混合执行,编译执行
评论中有这么一:
首先javac编译器将源代码编译成字节码。
然后jvm类加载器加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度相对会比较慢。有些方法和代码块是高频率调用的,也就是所谓的热点代码,所以引进jit技术,提前将这类字节码直接编译成本地机器码。这样类似于缓存技术,运行时再遇到这类代码直接可以执行,而不是先解释后执行。
2018/8/15:
❤1.为什么匿名类引用外面的变量必须要用final:
第一次知道这个事情是在写安卓代码的时候,当时就相当想知道着是为什么呢?但是当时浅薄的认知,连要百度的问题我都不知道GG。今天突然看到有人说为什么,我激动哦。
他说java传参,是传值而不是传引用,这就是最本质的原因。
2.值传递和引用传值:什么意思?
jvm中有堆和栈,栈中存放对象的引用,局部变量,操作数等。栈中存放对象的实例。值传递就是传递栈中的值,不是堆中的。
小总结:
形参就是:方法声明时候的()里面的值 实参就是:方法调用的时候传入的值。
基本数据类型 :将实参的值传递给形参
引用数据类型:将实参的对应的堆空间的首地址值传递给形参
网上有人说:为了生命周期和可见性的问题:使用了final ?
具体推荐final语义: 大神写的
- final保证传入值是不可变得: (指令重排导致传入参数的值是不确定的。)这句话我猜的。
- final 属性的值因为compilers 缓存在寄存器中,而不用像普通属性一样从内存中重新读取。
我说错完了,希望有人指正。
网友评论