文章目录
①. 概述①. 字节码文件的跨平台性(了解)②. Java的前端编译器(了解)③. 透过字节码指令看代码细节
①. 概述
①. 字节码文件的跨平台性(了解)
①. Java语言:跨平台的语言
当Java源代码成功编译为字节码后,如果想在不同的平台上运行,则无须再次编译这个优势不再那么吸引人了。Python PHP perl ruby lisp等有强大的解释器跨平台似乎已经快成为一门语言必须的特征
②. Java虚拟机:跨语言的平台: (Java虚拟机不和包括java在内的任何语言绑定,它只与class文件这种二进制文件格式所关联。无论使用何种语言进行软件开发,只要将源文件编译为正确的Class文件,那么这种语言就可以在Java虚拟机上执行,可以说,统一而强大的Class文件结构,就是Java虚拟机的基石、桥梁)
③. 想要让一个Java程序正确地运行在JVM中,Java源码就必须要编译为符合JVM规范的字节码
前端编译器的主要任务 就是负责将符合Java语言规范的Java代码转换为符合JVM规范的字节码文件javac是一种能够将Java源码编译为字节码的前端编译器javac编译器在将Java源码编译为一个有效的字节码文件过程中经历了4个步骤:分别是词法解析、语法解析、语义解析以及生成字节码
②. Java的前端编译器(了解)
①. 前端编译器 vs 后端编译器
②. 图解:
③. 透过字节码指令看代码细节
①. Integer:透过字节码可以看出,当Integer的范围在-128 - +127 之间会在数组中直接拿取数值,超过这个范围会重新new对象
public class IntegerTest {
public static void main(String
[] args
) {
Integer x
= 5;
int y
= 5;
System
.out
.println(x
== y
);
Integer i1
= 10;
Integer i2
= 10;
System
.out
.println(i1
== i2
);
Integer i3
= 128;
Integer i4
= 128;
System
.out
.println(i3
== i4
);
}
②. 在父类中调用方法,如果子类有重写,那么调用的是子类的方法,如代码中的this.print( )
class Father {
int x
= 10;
public Father() {
this.print();
x
= 20;
}
public void print() {
System
.out
.println("Father.x = " + x
);
}
}
class Son extends Father {
int x
= 30;
public Son() {
this.print();
x
= 40;
}
public void print() {
System
.out
.println("Son.x = " + x
);
}
}
public class SonTest {
public static void main(String
[] args
) {
Father f
= new Son();
System
.out
.println(f
.x
);
}
}
③. 静态变量随着类的加载就加载了,在链接(准备阶段)会为静态变量赋予默认的初始化值,在初始化阶段会显示的赋值
public class People {
private final static String parentStaitc
= "父类的静态成员属性";
public static void main(String
[] args
) {
People people
= new Child();
}
public People() {
System
.out
.println("父类构造方法");
}
static{
System
.out
.println(parentStaitc
);
System
.out
.println("父类静态代码块");
}
}
class Child extends People {
private final static String childStaitc
= "子类的静态成员属性";
public Child() {
System
.out
.println("子类构造方法");
}
static{
System
.out
.println(childStaitc
);
System
.out
.println("子类静态代码块");
}
}