Java类加载的一个疑问

Aoess丶 2019-01-27 07:00:55
有一个Test类,该类中有个名为test1的Test类型的类变量。当我第一次使用Test类时,Test类会被虚拟机加载。类变量是在类加载的初始化阶段被赋初值的,在test1变量赋初值的时候,Test类并没有被加载完毕啊,那么这个时候虚拟机如果等待Test类加载完成再去获得实例对象的话,不就发生了死锁问题了吗?
...全文
296 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-01-28
  • 打赏
  • 举报
回复
引用 楼主 Aoess丶 的回复:
有一个Test类,该类中有个名为test1的Test类型的类变量。当我第一次使用Test类时,Test类会被虚拟机加载。类变量是在类加载的初始化阶段被赋初值的,在test1变量赋初值的时候,Test类并没有被加载完毕啊,那么这个时候虚拟机如果等待Test类加载完成再去获得实例对象的话,不就发生了死锁问题了吗?


是我搞错了,可以编译,不会死锁,因为类加载只是加载构造函数,这里构造为空。main不是类的构造函数。
qq_39936465 2019-01-28
  • 打赏
  • 举报
回复
引用 楼主 Aoess丶 的回复:
有一个Test类,该类中有个名为test1的Test类型的类变量。当我第一次使用Test类时,Test类会被虚拟机加载。类变量是在类加载的初始化阶段被赋初值的,在test1变量赋初值的时候,Test类并没有被加载完毕啊,那么这个时候虚拟机如果等待Test类加载完成再去获得实例对象的话,不就发生了死锁问题了吗?



不能调用主类本身,内部类可以这样调用,你这样编译都不能通过,后面都不成立。

qybao 2019-01-28
  • 打赏
  • 举报
回复
类加载不会执行main方法
类加载时只是定义了private static Test1 test1; //初期值为null
加载完后执行test1 = new Test1()才真正完成赋值

你可以试试
class A {
static A aa = new A();
public A() {
System.out.println("aa=" + aa); //null
}
public static void main(String[] args) {
System.out.println("A.aa="+ A.aa); //
}
}


十八道胡同 2019-01-27
  • 打赏
  • 举报
回复
你说的是这种情况:
public class Test11 {

    public  Test11 test11=new Test11();

    public static void main(String[] args) {
        System.out.println(new Test11().test11);
    }
}
上面的代码 是直接报错的
"C:\Program Files\Java\jdk1.8.0_121\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.4\lib\idea_rt.jar=13535:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_121\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar;D:\Java\workspace\ThreadDemo\out\production\main" com.demo.Test11
Exception in thread "main" java.lang.StackOverflowError
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>(Test11.java:10)
	at com.demo.Test11.<init>

62,614

社区成员

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

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