当前位置首页 > 软件编程 > JAVA教程 > 关于java类加载正确的是,java程序加载类的步骤

关于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类加载时的细节。请多关注我们的其他相关文章!

本文来自网络,不代表菜鸟教程之家立场,转载请注明出处。
返回顶部