关于java类加载正确的是,java程序加载类的步骤

  关于java类加载正确的是,java程序加载类的步骤

  如何解决写爬虫IP受阻的问题?立即使用。

  类什么时候加载

  类的加载是通过类加载器(Classloader)完成的,它既可以是饿汉式[eagerly load](只要有其它类引用了它就加载)加载类,也可以是懒加载[lazy load](等到类初始化发生的时候才加载)。(推荐学习:java课程)

  但是,我相信这与不同的JVM实现有关。然而,它是由JLS保证的(它只在有静态初始化需求时才被加载)。

  类什么时候初始化

  加载类后,将进行类的初始化,这意味着它将初始化所有的类静态成员。在下列情况下,类被初始化:

  实例是通过使用new()关键字创建的,或者是通过使用class.forName()反映的,但它可能会导致ClassNotFoundException。

  调用该类的静态方法。

  分配该类的静态域。

  静态域是访问的,它不是一个常数。

  在顶级类中执行assert语句

  反射也可以初始化一个类,比如java.lang.reflect包下的一些方法。JLS严格规定,除了上述原因,类不会被初始化。

  类是如何被初始化的

  现在我们知道什么时候触发类的初始化,这在Java语言规范中有精确的描述。但了解字段(静态或非静态)、块(静态或非静态)、不同类(子类和超类)和不同接口(子接口、实现类和超接口)的初始化顺序也很重要。

  事实上很多核心Java面试题和SCJP问题都是基于这些概念,下面是类初始化的一些规则:

  类是从上到下初始化的,所以在顶部声明的字段比在底部声明的字段初始化得早。

  类先于子类和派生类的初始化。

  如果类的初始化是通过访问静态域触发的,那么只有声明静态域的类才会被初始化,超类或子类的初始化不会被触发,即使静态域被子类或子接口或其实现类引用。

  接口的初始化不会导致父接口的初始化。

  静态域在类的静态初始化期间初始化,非静态域在类的实例创建期间初始化。这意味着静态域在非静态域之前被初始化。

  非静态域由构造函数初始化,子类的构造函数在任何初始化之前隐式调用父类的构造函数。保证了非静态或者实例变量(父类)的初始化早于子类,这是java类加载时的细节。请多关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: