问个类加载问题

lliiqiang 2009-09-10 06:13:03
假如B是A的子类
那么如果有一个线程正在加载类A.在类A未加载完成之前,另外一个线程能否加载类B.我的程序显示能够加载,而且这样居然造成一个结果,即子类的构造方法被调用而父类的方法因为其类没有被加载而不能被调用,最后因为加载完成没有调用
...全文
128 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
南南北北 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yekai012 的回复:]
引用 8 楼 lliiqiang 的回复:
我是白痴,鉴定完毕.迅速结贴

UP
[/Quote]

友情up
z812183667 2009-09-11
  • 打赏
  • 举报
回复
调用子类的构造方法的同时就会去调用父类的构造方法啊!
chenchengamao 2009-09-11
  • 打赏
  • 举报
回复
例子如下:


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 运行结束
chenchengamao 2009-09-11
  • 打赏
  • 举报
回复
不能,要等父类加载完才能加载子类。
x360995630 2009-09-11
  • 打赏
  • 举报
回复
up
yekai012 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lliiqiang 的回复:]
我是白痴,鉴定完毕.迅速结贴
[/Quote]
UP
tfsict2008 2009-09-11
  • 打赏
  • 举报
回复
加载只能一个线程进行,如果有一个线程加载。其他的线程就等待,这也就可以保证一个类只能有一个加载器来加载,有一个命名空间!
java_object 2009-09-10
  • 打赏
  • 举报
回复
qiang//
lxxzhy 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lliiqiang 的回复:]
我是白痴,鉴定完毕.迅速结贴
[/Quote]
咔咔
libingye 2009-09-10
  • 打赏
  • 举报
回复
你的问题有问题呀?
lliiqiang 2009-09-10
  • 打赏
  • 举报
回复
我是白痴,鉴定完毕.迅速结贴
lxxzhy 2009-09-10
  • 打赏
  • 举报
回复
你怎么知道A类的构造方法没有调用啊?
lxxzhy 2009-09-10
  • 打赏
  • 举报
回复
你的B类有继承A类么?
lliiqiang 2009-09-10
  • 打赏
  • 举报
回复
我的代码:
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得构造方法都没有运行
lxxzhy 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangwansheng 的回复:]
A未加载完成之前,另外一个线程能加载类B,
没加载完,就像没有父类一样,所以没调用。
[/Quote]
你太厉害啦!!!
lxxzhy 2009-09-10
  • 打赏
  • 举报
回复
上代码.
angel6709 2009-09-10
  • 打赏
  • 举报
回复
reflection?
liangwansheng 2009-09-10
  • 打赏
  • 举报
回复
A未加载完成之前,另外一个线程能加载类B,
没加载完,就像没有父类一样,所以没调用。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧