java代码执行流程 java执行java代码片段

简述JAVA程序运行过程1,如果java文件没有package,就默认给文件加上"无名"package;
2,默认导入java.lang包,所以我们的java程序中可以使用Sting,Math,Integer等类,包括一些异常类;
3,如果生成的类没有父类,则为这个类隐式加上父类:Object;因此,包括Object中的许多方法可以使用;
4,字段的初始化;
二,我们所看的到的:
既然看的到,就先看程序运行结果:
public class JRun1 {
public JRun1() {
System.out.println(" 构造函数");
}
static
{
System.out.println("static{}");
}
{
System.out.println("{}");
}
public static void main(String[] args) {
System.out.println("main()");
}
}
运行结果:
static{}
main()
显然,程序运行时,先运行:
static
{
System.out.println("static{}");
}
再调用main();
如果我们在类中建立一个对象:
public class JRun1 {
public JRun1() {
System.out.println(" 构造函数");
}
static
{
System.out.println("static{}");
}
{
System.out.println("{}");
}
public static void main(String[] args) {
System.out.println("main()");
new JRun1();
}
}
运行结果:
static{}
main()
{}
构造函数
从而,我们得出:
建立一个非主类对象,顺序为:静态初始化块static{}--初始化块{}--构造函数constructor;
那么,牵涉到继承,运行流程又如何?
看程序:
class JRun1Father{
JRun1Father(){
System.out.println("父类构造函数");
}
static{
System.out.println("父类静态初始化块");
}
{
System.out.println("父类初始化块");
}
}
public class JRun1 extends JRun1Father{
public JRun1() {
System.out.println("子类构造函数");
}
static
{
System.out.println("子类静态初始化块");
}
{
System.out.println("子类初始化块");
}
public static void main(String[] args) {
//System.out.println("主方法)");
new JRun1();
}
}
运行结果:
父类静态初始化块
子类静态初始化块
父类初始化块
父类构造函数
子类初始化块
子类构造函数
所以,牵涉到父类:父静态--子静态--父初始化及构造--子初始化及构造;
注意:初始化块和构造是接连运行的,不会父类子类交替.
简述Java程序从编写到运行的基本步骤,并说明Java的基本工作原理Java编译原理:
Java 虚拟机(JVM)是可运行Java 代码的假想计算机 。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行 。
一.Java源文件的编译、下载 、解释和执行
Java应用程序的开发周期包括编译、下载 、解释和执行几个部分 。Java编译程序将Java源程序翻译为JVM可执行代码?字节码 。这一编译过程同C/C++ 的编译有些不同 。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的 。因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行 。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址 。这样就有效的保证了Java的可移植性和安全 性 。
运行JVM字节码的工作是由解释器来完成的 。解释执行过程分三部进行:代码的装入、代码的校验和代码的执行 。装入代码的工作由"类装载器"(class loader)完成 。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类 。当类装载器装入一个类时,该类被放在自己的名字空间中 。除了通过符号引用自己名字空间以外的类 , 类之间没有其他办法可以影响其他类 。在本台计算机上的所有类都在同一地址空间内,而所有从外部引进的类,都有一个自己独立的名字空间 。这使得本地类通过共享相同的名字空间获得较高的运行效率 , 同时又保证它们与从外部引进的类不会相互影响 。当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局 。解释器为符号引用同特定的地址空间建立对应关系及查询表 。通过在这一阶段确定代码的内存布局,Java很好地解决了由超类改变而使子类崩溃的问题 , 同时也防止了代码对地址的非法访问 。

推荐阅读