热搜
您的位置:首页 >> 育儿

Java基礎初步探討Java語言類加載機

2019年06月03日 栏目:育儿

尿路结石治疗调理小便刺痛快速治疗方法小便刺痛吃药一直不好  记得在刚学JAVA的时候,类的加载机制和初始化顺序经常被弄的糊里糊涂,其实当我们
尿路结石治疗调理
小便刺痛快速治疗方法
小便刺痛吃药一直不好

  记得在刚学JAVA的时候,类的加载机制和初始化顺序经常被弄的糊里糊涂,其实当我们不太了解某些事情的时候,不防去做一做实验,让代码的运行结果说话,这或许能帮助我们更好地了解一些事情.今天我们就用一些代码来看一下类是如何被加载的,并且当有继承关系的时候,类的加载顺序又是怎么样的.

  先看代碼吧

  /*

  * va

  *

  * Created on , 9:33:31

  *

  * To change this template, choose Tools | Templates

  * and open the template in the editor.

  */

  package test1;

  /**

  *

  * @author hadeslee

  */

  public class Test4 {

  private void testClassForName(String name) throws ClassNotFoundException{

  Class c=rName(name);

  }

  private void testNewInstance(String name) throws ClassNotFoundException, InstantiationException, IllegalAccessException{

  Class c=rName(name);

  Object obj=wInstance();

  intln(obj);

  }

  public static void main(String[] args)throws Exception {

  Test4 t=new Test4();

  stClassForName("test1.B");

  new B();

  new B();

  }

  }

  class A{

  private int aj;

  {

  aj=20;

  intln("A成员初始化块");

  }

  private static int ai;

  static {

  ai=10;

  intln("A静态初始化块");

  }

  public A(){

  intln("A构造函数");

  }

  }

  class B extends A{

  private static int bi;

  static {

  bi=30;

  intln("B静态初始化块");

  }

  private int bj;

  {

  bj=40;

  intln("B成员初始化块");

  }

  public B(){

  intln("B构造函数");

  }

  }

  在代码里面我们总共有三个类,一个是做测试用的Test4,一个是A,一个是A的子类B,我们在A和B类里面都有很多输出,一个是静态初始化的输出,一个是成员初始化的输出,一个是在构造函数里面的输出,从这些输出我们可以知道代码的执行顺序,以上代码运行输出如下:

  A静态初始化块

  B静态初始化块

  A成员初始化块

  A构造函数

  B成员初始化块

  B构造函数

  A成员初始化块

  A构造函数

  B成员初始化块

  B构造函数

  从上面我们可以看出,A和B的静态初始化块只被执行了一次,也就是类的对象将要被生成的时候,它会执行,并且执行的顺序如下:父类的静态成员,子类的静态成员,父类的成员变量和构造方法,子类的成员变量和构造方法.当再用这个类生成对象的时候,静态的部份就不再被调用了.因为静态是类的所有实例所共享的,所以它在整个虚拟机的生命周期内只执行一次.

  如果我们加上一个stClassForName("test1.B");放在main函数的面,我们会发现输出还是和刚刚一样,没有任何改变,这个时候,我们知道,当我们调用rName(name);的时候,类是不会自动初始化的,它默认只是把这个类的字节码读入内存,但是并没有初始化这个类.只有我们调用了newInstance()的时候,它才会被初始化.在这里我们再这样试一下:把A和B生成的class文件去掉,然后再分别调用rName和new B(),看看会怎么样,我们会发现当我们调用rName的时候,当我们要for的Name找不到的时候,只会抛出ClassNotFoundException,注意,它只是一个异常而已,而当我们new B()的时候,B的class文件却被我们删掉了,那就事大了,那就将抛出NoClassDefFoundError,呵呵,它就是一个Error了,这点区别我们可要注意啦,当我们在做这些事情的时候,一个只要捕获异常就可以了,一个却需要捕获一个Error,一般来说,Error级别的错误是不希望程序员去捕获的.了解了类的基本加载顺序以及加载机制后,对我们了解JAVA是有一定的帮助的.

  查看本文来源

河南大学生刷脸上课出勤率达到百分之百
袁咏仪与成龙合照 与张智霖真实现状其私生活很乱惊人
保养“婴儿般的娇嫩皮肤”,有诀窍更有学问
  • 友情链接
  • 合作媒体