Java004 Java本身(JRE, JVM, JDK, J
首先,解释一下这句话:
Java, platform compatible, write once, compile once, run everywhere on JVM.
这句话的意思是,任何的platform上, 只要装了JVM, 都可以跑以 .Class结尾的 byte code 文件.
以下是JRE, JVM 和 JDK的关系
![](https://img.haomeiwen.com/i12624636/9be07ba41099def3.png)
与C++不同的是,Java的代码在JVM上运行,因此兼容性很强,而C++做的是直接编译成platfrom能够跑的底层代码,虽然速度快,但对不同机器,甚至相同系统不同版本,都会造成差别。
![](https://img.haomeiwen.com/i12624636/d4265c98be4bc449.png)
从图上可以看到, .java文件先由compiler变成Byte Code,再传入到不同的JVM中。
当Byte Code到了JVM中,通常会有两种运行方式:
1.JVM 担当Interpreter的角色, 边执行边翻译, interprets the Java bytecode to pre-compiled routine on machine code.
2.JIT(Just in time) 直接翻译把bytecode编译成机器可以实现的代码,机器直接执行。
(当然,Interpreter还是不及C++ compile,实时翻译远不如两位native speaker面对面谈话)
![](https://img.haomeiwen.com/i12624636/c34757d1c8019452.png)
那么为什么全部都用JIT呢?
由于JIT对每条字节码都进行编译,造成了编译过程负担过重。为了避免这样的情况,当前的JIT仅仅对常常运行的字节码进行编译,如循环等.(被调用足够多,足够 “热” 以后再用JIT进行编译并保存
深剖请看下文.
https://www.zhihu.com/question/37389356
Java中的单继承性:
Java中的class只能extends one class, 好处是:
1.每个object都有object特有的属性
2.避免Ambiguity
菱形结构反例:
Class A {
public void dummy() {
System.out.println("dummy from A")
}
}
Class B extends A {
public void dummy() {
System.out.println("dummy from B")
}
}
Class C extends A {
public void dummy() {
System.out.println("dummy from C")
}
}
Then, when class D extends both B and C.
class D extends B, C {
}
Dummy的定义就模糊了