Java main如何被加载,Java的main方法与类的加载的联系

如长期以来众多人的看法:我想的东西很怪异。这种看法多少有些中肯成份,这次的东西怪异到我都不知道该为它起什么标题了,但必须写,就胡诌了一个。

问题源自我在测试题里面作答的两道习题,我先遇见老紫竹老师出的题目,大意是Java中是否一定要依赖main方法来执行程序代码?我当时很认真地答了是,我认为程序一定要有入口,结果我错了;但是,前天我又遇到了这样的类似问题,这个问题是一位同学出的,由于我很在意那个错误所以在一道多选题中没有将main方法勾选在内,于是,我又错了,搞来搞去我就两次都栽在了一个混沌的问题上,故此,不免要thinking in Java一下了。

在说明问题之前不免要铺陈一番。

Java的类是用到才开始加载的,并且在每个类的构造器调用之前,类的每个域(成员变量)都要首先被编译器初始化一次,然后才轮到构造器来干活儿。但是,Java的初始化是惰性的,它没有C++构造函数的苛刻的要求,Java编译器会保证每个变量在使用之前会被初始化,因此Java中只要求程序员在合适的地方为类成员给一个有效的值即可。

一个有益于问题突破的事实是,一个static变量在没有类实例的时候也是可以使用的,这就要求static必须被恰当地初始化,也就是说,在构造器的调用之前,加载类的时候,Java编译器会允许JVM运行一段代码,至少可能会有几行。

这里就出现了一个有趣的问题:程序开始的时候类加载的时候所做的工作流程是怎样的?

Thinking in Java告诉我,每当执行Java编译器的时候,编译器会寻找指定的类,当它找到类时,首先需要初始化static变量,因为这些成员可以在没有实例的情况下运行,接着,再按照变量的声明顺序依次初始化类的成员,成员初始化完毕之后才为自己调用构造器,一切进行完毕之后,才可以调用方法。但主类比较特殊,主方法会在构造器之前,static变量初始化之后调用,这是由于Java的惰性初始化,在main方法被调用之前无法知道是否存在主类的实例。

Java的初始化和构造的分离使得Java提供了代码块作为初始化成员的工具和支持无名类的利器,而这样一来,初始化的工作就不免会被扩展,程序员可以嵌入额外的初始化步骤。由于Java的成员分普通成员和static成员,初始化代码块也分static的,例如:

public class Foo{       int a;       int b;       static int c;      {             a=-1;             b=1;      }//这个就是所谓的初始化代码块      static {              c=100;      }//static成员有专属的static初始化代码块      Foo(){Syetem.out.println("Foo creat now!")}//这个和C++确实不同,权限大为缩减 };      接下来就是问题的实质了:如何在没有main方法的情况下执行程序段?把程序段写在static块里面就可以了!当执行加载主类命令时,static块中的代码会在类对象初始化之前执行完毕。注意,这个只是执行代码段而已,并且只能执行static初始化代码块内的代码,并不是所谓的执行程序。首先一点,你这static代码块无法接受到传递过去的参数。而且,如果打算运行上面的类,肯定会失败,因为在初始化完成之后JVM找不到入口,入口都没有当然程序也就特别异常了。       问题的思考就到这里,收工睡觉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值