假如B是A的子类
那么如果有一个线程正在加载类A.在类A未加载完成之前,另外一个线程能否加载类B.我的程序显示能够加载,而且这样居然造成一个结果,即子类的构造方法被调用而父类的方法因为其类没有被加载而不能被调用,最后因为加载完成没有调用

解决方案 »

  1.   

    我的代码:
    package com;
    public class A {
    static{
    try {
    new C().start();//启动另外一个线程
    Thread.sleep(3000);//为了实现顺序,在这里耽搁3秒
    System.out.println("A");
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    public static void main(String[] a){
    }
    }//在这里运行
    package com;public class B{
    static int a=2;
    static {
    System.out.println("static b");
    }
    public B(){
    System.out.println("b");
    }
    }
    package com;public class C extends Thread{
    static{
    System.out.println("static c");
    }
    public void run(){
    System.out.println(new B());//加载B
    }
    public C(){
    System.out.println("c");
    }
    }
    结果是:
    static c
    c
    static b
    b//直接加载B类和构造方法
    com.B@61de33
    A//然后加载类A,连A得构造方法都没有运行
      

  2.   

    例子如下:
    public class MyJava{
    public static void main(String[] args){
    TA t1=new TA();
    TB t2=new TB();
    t1.start();
    t2.start();
    }
    }class TA extends Thread{
    public void run(){
    System.out.println("TA 运行开始");
    new Base();
    System.out.println("TA 运行结束");
    }
    }class TB extends Thread{
    public void run(){
    System.out.println("TB 运行开始");
    new Sub();
    System.out.println("TB 运行结束");
    }
    }public class Base{
    static{
    System.out.println("正在初始化Base类");
    try{
    Thread.sleep(3000);
    }catch(Exception e){
    System.out.println("Base ERROR");
    }
    }
    }public class Sub extends Base{
    static{
    System.out.println("正在初始化Sub类");
    try{
    Thread.sleep(3000);
    }catch(Exception e){
    System.out.println("Sub ERROR");
    }
    }
    }运行结果:TA 运行开始
    TB 运行开始
    正在初始化Base类
    TA 运行结束
    正在初始化Sub类
    TB 运行结束