对象创建过程覆盖
Java对象创建过程
Java对象被创建有两种方式:第一种是通过new XX();第二种是rName(\"XX\").newInstance().我现在对这个流程的认识有些混乱.
要生成一个类的对象,必须有两样东西被加载到内存,一种是Class对象;另一种是类,然后类对象才会被创建.由于Java是动态加载(类的静态成员被引用,类才会别加载),所以类加载的时候相对于上面的两种方式分别是在:第一种:new XX(),因为构造器方法也是静态方法,这种方式会调用构造器方法,所以此时类会被加载;第二种:rName()首先会检查类有无被加载,没有则加载类.至此,两种方式的类都被加载.
我的疑问是Class对象是何时被加载的,是和类一样吗?(我现在知道的关于Class对象的知识就是它是在.java文件被创建,被编译后产生了和类名字一样的.class文件.)是在类被加载之前还是之后,还有Class对象是怎么和类配合生成类对象的...
加载类就是加载Class对象。new XX();
rName(\"XX\").newInstance();
这两种效果一样,加载方式也一样,毫无区别,newInstance()实际上也是调用默认构造器方法的。
只是在用的场合不一样,前面一种用的很普遍。后面一种一般都是结合工厂模式应用的比较多。
这两种方式效果是一样的,但是稍微有以下两点小区别:
区别1:rName的方式能实现动态地载和创建Class 对象,而NEW指定生成某个类的对象
例:String str = 你定义的字符串
Class t = rName(str);
wInstance();
区别2:JAVA的工厂模式中常使用rName方式创建对象
可能是我的表达能力不清楚.我想问的就是加载过程...到底一个对象是如何从无到有的.首先是编写一个后缀名为.java的类文件名叫Gun,经过编译后就生成了ass文件.我的意思是类加载器(JVM的一部分)总得加载它们吧(它们代指Class对象和类Gun,每个类都对应一个Class对象).这个加载过程是怎么个样子的.一楼说的也只是说了表面.都是调用默认构造方法.中间这个调用过程还是要牵扯到加载Class对象,加载类,还有一些我还不明白的过程...我看过这么一句话:\"当Class对象被载入内存,它就用来生成所有的对象\".就是说ass被载入内存就是用来生成所有的Gun类的对象的...
关键是 static initialization
class A {
//
static {
intln(\"haha\");
}
}
这个东西类似常量的初始化。
第一种调用方法,VM 启动的时候,会去找所有被 import 了的类,如果找到了,这段代码就会被调用。也就是一启动就会调用。
第二种方法,如果你一直没有 import 这个类,vm 一直等到 rName(\"XX\").newInstance() 才会调。如果 static initialization 里面写了很多代码,又不想在不需要的时候调用它们,就只有第二种方法来。
说明一下加载的过程:
public class LoaderTest{
public static void main(String args[])throws ClassNotFoundException{
Class c;
LoaderTest lt=new LoaderTest();
c=rName(\"LoaderTest\");
intln(c);
intln(tName());
intln(tClassLoader());
intln(tClassLoader().getParent());
intln(tClassLoader().getParent().getParent());
}
}
class LoaderTest
LoaderTest
uncher$AppClassLoader@19821f
uncher$ExtClassLoader@addbf1
null
首先对于编译后的ass,必须要知道哪个加载器来加载,(下面是一种委托模式,及子类加载器都先调用父类加载器加载)首先调用AppClassLoader来加载,但AppClassLoader会让他继承的父类加载器ExtClassLoader加载ass,ExtClassLoader没有父类加载器(返回值为null),将ass转交给虚拟内核中的Bootstrap,由于Bootstrap只能加载java核心包中的类,所以告诉ExtClassLoader自己不能加载,ExtClassLoader是用来加载%JAVA_HOME%/jre/lib/ext/中的jar包中类,自己也不能加载ass,于是就告诉AppClassLoader自己不能加载该ass。由于AppClassLoader可以加载应用程序的启动态,可以加载该ass,
要加强财政、货币、贸易、产业、投资政策的协调配合。最重要的是 然后就像上面说的那样,加载时生成了一个个Class类的实例对象,该Class对象封装了 ass的字节码数据,也就是生成存储在内存中的可执行代码。我们可以通过rName(\"LoaderTest\").getName()获得这个Class对象的名称,通过rName(\"LoaderTest\").newInstance()来获得 LoaderTest这个类的对象。
成都不孕不育治疗费用石家庄妇科哪家医院好
小孩子厌食不吃饭怎么办
- 上一页:对战战争与和平的游戏计划
- 下一页:对象创建过程牛
-
一生里面,也许总有一两回
生前之中,或许总有一两回,你样子着了魔一样相恋一个人,大叔他大叔得失...
2024-01-15
-
衰退担忧便市场恐惧 投资者逃离几乎所有主要资产类别
只不过一周投资者逃离几乎所有主要资产类别,仅美股和美债从未遭遇大现有...
2023-10-13
-
同龄职场人自我救赎:只要开始一切都不晚。改变四种心理底层逻辑
我不是不情愿从前辈小野自己,怕下定决心确信自己并非金石珠玉。实际上同...
2023-10-01
-
上外女生图书馆自习,咖啡杯内被投放异物,校方的否认叫网友不满
作为接受过成人教育的族群,初中生一直是依托的值得一提的是,虽然他们在...
2023-09-26
-
郭碧婷为什么很少穿著短裙?看到她的短裙照后,网友:血压又身高了
【注:本文由〖宅游奶牛君〗作者影音原创剧作,未经允许禁止抄袭刊出。侵...
2023-09-25
-
要点发挥巡察职能 推进民生工程建设
本报讯(记者 覃岩峰)连日来,郑东新一区党工委第二随行组、郑东新一区...
2023-09-22