Java对象被创建有两种方式:第一种是通过new XX();第二种是Class.forName("XX").newInstance().我现在对这个流程的认识有些混乱.
    要生成一个类的对象,必须有两样东西被加载到内存,一种是Class对象;另一种是类,然后类对象才会被创建.由于Java是动态加载(类的静态成员被引用,类才会别加载),所以类加载的时候相对于上面的两种方式分别是在:第一种:new XX(),因为构造器方法也是静态方法,这种方式会调用构造器方法,所以此时类会被加载;第二种:Class.forName()首先会检查类有无被加载,没有则加载类.至此,两种方式的类都被加载.
    我的疑问是Class对象是何时被加载的,是和类一样吗?(我现在知道的关于Class对象的知识就是它是在.java文件被创建,被编译后产生了和类名字一样的.class文件.)是在类被加载之前还是之后,还有Class对象是怎么和类配合生成类对象的...希望大家能多多发表自己的见解.

解决方案 »

  1.   

    怎么说的有点乱七八糟的啊,加载类就是加载Class对象。new XX();
    Class.forName("XX").newInstance();
    这两种效果一样,加载方式也一样,毫无区别,newInstance()实际上也是调用默认构造器方法的。
    只是在用的场合不一样,前面一种用的很普遍。后面一种一般都是结合工厂模式应用的比较多。
      

  2.   

    new XX();
    Class.forName("XX").newInstance(); 
    两者都是调用构造函数
      

  3.   

    new 就是生成一个类的实例,就是一个对象。
    class。forname()就是一个以编译过的类,生成一个对象
      

  4.   

    这两种方式效果是一样的,但是稍微有以下两点小区别:
    区别1:Class.forName的方式能实现动态地载和创建Class 对象,而NEW指定生成某个类的对象
    例:String str = 你定义的字符串
        Class t = Class.forName(str); 
        t.newInstance();
    区别2:JAVA的工厂模式中常使用Class.forName方式创建对象
      

  5.   

    class Test{
    }
    还有一种方式,
    Class<?> i=Test.class  ;  
    i.newInstance();   
    不同之处:LZ列举上面2种都会伴随类的初始化,而这种不会伴随类的初始化。
      

  6.   

    程序中new 对象好像不好吧!
      

  7.   

    new对象不好,那java还弄个new干什么。
      

  8.   

    可能是我的表达能力不清楚.我想问的就是加载过程...到底一个对象是如何从无到有的.首先是编写一个后缀名为.java的类文件名叫Gun,经过编译后就生成了Gun.class文件.我的意思是类加载器(JVM的一部分)总得加载它们吧(它们代指Class对象和类Gun,每个类都对应一个Class对象).这个加载过程是怎么个样子的.一楼说的也只是说了表面.都是调用默认构造方法.中间这个调用过程还是要牵扯到加载Class对象,加载类,还有一些我还不明白的过程...我看过这么一句话:'当Class对象被载入内存,它就用来生成所有的对象'.就是说Gun.class被载入内存就是用来生成所有的Gun类的对象的...
      

  9.   

    加载class二进制文件,生成该类对应的Class对象。
      

  10.   

    具体的整个的一个时间流程是什么样子的,楼上的能帮我解释下吗?谢谢...比如何时加载加载Class对象,何时加载类,它们分别由谁加载...再就是Class对象和类是怎么扯上关系的.能具体的举个例子说明下吗?感激不已啊...
      

  11.   

    ClassLoader读取class文件内容得到一个byte[],
    然后就可以调用defineClass来在ClassLoader中生成Class
      

  12.   

    具体的整个流程是怎样子的呢?Class对象、类他们之间联系如何...说的模糊一点,Class对象被加载到JVM中之后是不是会调用类的默认构造函数(调用类的默认构造函数会触发类被加载).这样子对象就产生了?我还有一个疑问,Class对象和类是有了Class对象才有类(JVM中),还是其它什么顺序.可能我的功力还不够.楼上的前辈能不能把整个运作流程给小弟说说.你只将到Class对象被加载到内存,之后会发生什么呢?就我现在知道的,用new的方式创建对象,它会因为调用类的静态成员而加载类,至于这种方式Class对象是何时被加载...是程序运行时就被加载呢,还是其它时间...用Class.forName("XX"),它会检测类有无被加载,没有则加载.然后返回Class对象(这是不是说明这种方式产生的Class对象与类加载器无关),然后调用Class的newInstance()方法生成类对象...现在感觉乱了,还请各位能帮帮我理清下这个思路...感激不已
      

  13.   

    http://java.sun.com/docs/books/jvms/second_edition/html/ConstantPool.doc.html
      

  14.   

    加载类就是加载Class对象,这句话是对的吗?这个话是一楼的大哥说的.我只是求证下
      

  15.   

    这话不是很准确,加载类是加载class文件(类的二进制表示)到内存中,并创建类Class对象的过程。比如你写了一个类,Test.class加载过程就是使用类加载器加载这个文件中的信息,根据这些信息创建Class对象,为static的成员分配内存,执行默认初始化,执行static块和static初始化语句的过程。
      

  16.   

    关键是 static initialization
    class A {
        //
        static {
            System.out.println("haha");
        }
    }
    这个东西类似常量的初始化。第一种调用方法,VM 启动的时候,会去找所有被 import 了的类,如果找到了,这段代码就会被调用。也就是一启动就会调用。
    第二种方法,如果你一直没有 import 这个类,vm 一直等到 Class.forName("XX").newInstance() 才会调。如果 static initialization 里面写了很多代码,又不想在不需要的时候调用它们,就只有第二种方法来。
      

  17.   

    先加载Class,后加载类,Class包含所有关于类的结构等数据,
      

  18.   

    我要把它顶到第一条,希望有更多的人能看到.
    经过一天的了解.我对这个流程有了更多一点了解.首先是编译器生成.class文件.然后是类加载器加载.class文件,因为JVM处理类和处理基本类型是一模一样的方式.所以这里的.class文件时对一个类型的定义...至于后面的流程我还是要慢慢体会啊!
      

  19.   

    编译:类名.java -> 类名.class
    运行:类装载器 ->字节码验证器->....->通过JIT等生成存储在内存中的可执行代码...
    首先是类装载器根据 类名.class 在文件中找到相应的 类名.class,然后加载该 类名.class,及将类名.class文件转化为java虚拟机中的类字节码。
    Class.forName("XX") 返回值是一个Class类的实例对象,该Class对象封装了 XX.class的字节码数据,也就是生成存储在内存中的可执行代码。//Class类的作用
    Class.forName("XX").newInstance() 返回的是XX.class类 中XX的一个实例对象。
    举个例子:
    public class classObjectTest{
        public static void main(String args[])throws ClassNotFoundException{
        Class c;
        classObjectTest cot=new classObjectTest();
        c=Class.forName("classObjectTest");//相当于c=cot.getClass();
        System.out.println(cot);
        System.out.println(c);
        System.out.println(c.getName());   }
    }
    结果:D:\>java classObjectTest
    classObjectTest@de6ced
    class classObjectTest
    classObjectTest
    也不知道对不对,有点晕了
      

  20.   

    通过JIT等生成存储在内存中的可执行代码... 错了,直接叉掉
      

  21.   

    说明一下加载的过程:
    public class LoaderTest{
        public static void main(String args[])throws ClassNotFoundException{
        Class c;
       LoaderTest lt=new LoaderTest();
        c=Class.forName("LoaderTest");
        System.out.println(c);
        System.out.println(c.getName());
        System.out.println(c.getClassLoader());
        System.out.println(c.getClassLoader().getParent());
        System.out.println(c.getClassLoader().getParent().getParent());
     }
    }
    class LoaderTest
    LoaderTest
    sun.misc.Launcher$AppClassLoader@19821f
    sun.misc.Launcher$ExtClassLoader@addbf1
    null
    首先对于编译后的LoaderTest.class,必须要知道哪个加载器来加载,(下面是一种委托模式,及子类加载器都先调用父类加载器加载)首先调用AppClassLoader来加载,但AppClassLoader会让他继承的父类加载器ExtClassLoader加载LoaderTest.class,ExtClassLoader没有父类加载器(返回值为null),将LoaderTest.class转交给虚拟内核中的Bootstrap,由于Bootstrap只能加载java核心包中的类,所以告诉ExtClassLoader自己不能加载,ExtClassLoader是用来加载%JAVA_HOME%/jre/lib/ext/中的jar包中类,自己也不能加载LoaderTest.class,于是就告诉AppClassLoader自己不能加载该LoaderTest.class。由于AppClassLoader可以加载应用程序的启动态,可以加载该LoaderTest.class,
    然后就像上面说的那样,加载时生成了一个个Class类的实例对象,该Class对象封装了 LoaderTest.class的字节码数据,也就是生成存储在内存中的可执行代码。我们可以通过Class.forName("LoaderTest").getName()获得这个Class对象的名称,通过Class.forName("LoaderTest").newInstance()来获得 LoaderTest这个类的对象。
      

  22.   

      Java的类在运行过程中动态的装载,因此,Java可以在分布式的环境中动态的维护应用程序和Java类库之间的一致性。当类库升级后,应用程序无需重新编译,也一样可以利用新类库中新增的功能。
      

  23.   

        类加载器为程序的执行加载所需要的全部类。类加载器将局部文件系统的类名空间与来自网络源的类名空间相分离,以增加安全性。由于局部类总是首先加载,因而可限制任何“特洛依木马”的应用。
    当全部类被加载后,可执行文件的记忆体格式被确定。这时,特定的内存地址被分配给符号引用并创建检索表格。由于记忆体格式在运行时出现,因而Java技术解释器增加了保护以防止对限制代码区的非法进入。网上找了些资料,有用的话就好了
      

  24.   

    java虚拟机使用每个类的第一件事就是将该类的字节码撞进来。类装载器负责根据一个类的名称来定位和生成类的字节码数据后返回给java虚拟机。如,UTF-8编码形式的.class 文件,装进java虚拟机后要被转换成Unicode 编码,装载类本身也是一个java类,当一个类被夹在后,java虚拟机将其编译成可执行代码存储在内存中,并将索引信息存储在一个HashTable中,索引关键字就是这个类的完整名称。在java虚拟机需要用到某个类时,首先通过hashtable查找相应的信息,如果该可执行代码已经存在,java虚拟机就直接从内存中调用该可执行代码,否则调用类装载器加载。
      

  25.   

    2种创建对象的方法 一种是直接调用类的构造方法创建类的对象,另一种是间接创建通过的是java的反射机制,通过类名找到该类,在调用该类的构造方法生成该类的对象。
      

  26.   

    在调用Class.forName("")时,类会被初始化,调用newInstance()产生类的实例
    使用new时,JVM同样先初始化类,然后再产生实例Class.forName("")是动态加载,并且被加载的类有一定的限制,它必须有一个默认的,有访问权限的无参构造器,否则会抛出异常(可以编译)
    而new则相对必较灵活,它不需要默认的无参构造器,没有访问权限的话将无法编译
      

  27.   

    Class.forName("")通常用在接口编程中,常见的就是Class.forName("xxx.xxx.xxxDriver")
      

  28.   


    I CALL! RE 孔乙己!!!!
      

  29.   

    《Java编程思想》中有这么两句话:"所有的都是在第一次使用时,动态加载到JVM中.当程序创建第一个对类的静态成员的引用时,就会加载这个"  正如一楼所说,这里的"类"难道就是指Class对象?
      

  30.   

    类是类,class 对象是class对象。类怎么能是对象呢??类必须实例化才能获得对象。四个概念:类,类的对象,类Class,Class对象。Java中的类用来描现实中有形或者无形的事物,由于它本身也是一种事物,它也可以用一个Java类来描述,这个Java类就是类Class。Class类中的字节码被Class对象封装了,类加载器加载Class对象。
      

  31.   

    LZ概念上有点混乱.A.java--编译器--->A.class--ClassLoader(当第一次A a = new A();或者Class.forName("A")时加载)-->
    java.lang.Class类型的对象(暂且命名aCls).1)A.java编译后就可以抛弃了,jvm使用的是A.class.把A.java删除后,A.class可以正常使用,就证明了这点.
    2)当第一次生成一个类的对象时,会有一个合适的ClassLoader去把A.class文件读取并加载入内存.
    3)接着jvm生成一个描述该类的java.lang.Class类型的对象,可以通过 Class aCls = a.getClass();获得getClass()方法继承自java.lang.Object类.一个类无论被实例多少次,都只会有一个该类的Class类型的对象,就是第一次加载时产生的. 最后,我们所说的A类,不是指A.java或者A.class也不是aCls,而是指一种类型,A类型.前两者是文件,后者是对象.简单的说,鸟类就是鸟类,我也说不明白了,看来只可意会,不可言传啊.哈哈.
      

  32.   


    关于aCls的产生描述的不正确,当我们编译一个Java类就会同时产生一个与该类相对应的Class对象(保存在.class文件中),也就是.class文件被加载后,就已经在内存中存在一个对应该类的java.lang.Class类型的对象了,而不是生成.
      

  33.   

    那具体的::"所有的类都是在第一次使用时,动态加载到JVM中.当程序创建第一个对类的静态成员的引用时,就会加载这个类"中的"加载这个类"是啥意思.你说的这几个概念我还是知道的...但就是这句话百思不得其解.JVM加载的是.class文件中的信息->链接->初始化.我想这里的"加载这个类"是不是指:"初始化这个类,并加载静态方法和静态块".
      

  34.   

    "加载这个类"是不是指:"初始化这个类,并加载静态方法和静态块".讲的差不多对吧。
    加载这个类是指加载Class对象,根据Class对象初始化这个类,并为类中的静态方法和静态块跟配内存的过程。差不多吧这样子,真的也不是很清楚,具体真正什么过程只有计算机知道,先看着会用就行了。
      

  35.   

    new XX();
    是java关键字,最早由c++演变而来。Class.forName("XX").newInstance();
    是一种反射方法,是java.lang.Class.class 这个类中的方法,位于jdk的rt.jar这个包中,是sun帮你编译好的。
    所以完整的写法应该是:java.lang.Class.forName("XX").newInstance();
    只不过java.lang.一般可以忽略不写罢了。由于"XX"是字符串,所以使程序有了运行时动态加载的能力,增加了灵活性,反之损失了效率,光看Class.class 里import的数量就知道了,四十多个 -_-!
      

  36.   

    注册公司流程企业名称预核准(工商局)(会计师事务所)--办理相应前置手续--申请营业执照(工商局)注册公司流程中重要的是注册一个公司,首先想好经营什么,怎样经营好,再来注册。注册了公司是需要很多成本的,前期可行性分析调查,建议你自己认真的考虑一下。接下来谈谈注册公司流程,有哪些程序.
    注册公司需要有以下几个流程:
    1.核准名称: 
    到工商局领取一张“企业(字号)名称预先核准申请表”,填入你准备取的公司名称(一共5个),工商局会检索是否有重名,如无重名,即可使用并核发“企业(字号)名称预先核准通知书”,费用是30元(可以检索5个名称)。 2.租房: 
    租写字楼的办公室,民用房屋不可以注册的(北京)。 
    签订租房合同,并让房屋的产权人提供房产证复印件,再到税务局买印花税。税率是年租金的千分之一,将印花税票贴在合同的首页。 3.编写公司章程: 
    可以找人代写,也可以从工商局的网站下载“公司章程”样本,修改后,由所有股东签名。 4.刻法人名章: 
    到刻章社,刻法人名章(方型)费用15-20元。 5.到银行开立公司验资户: 
    携带“公司章程”“工商局的核名通知”“法人名章”“身份证”到银行去开立公司帐户(是验资帐户,将各股东的资金存入帐户),银行出据“询征函”“股东缴款单”。 6.办理验资报告: 
    拿着“股东缴款单”“询征函”“公司章程”“核名通知书”“房租合同”“房产证复印件”到会计师事务所办理验资报告,费用500元。 7.注册公司: 
    到工商局领取公司设立登记的各种表格填好,然后将“核名通知”“公司章程”“房租合同”“房产证复印件”“验资报告”一起交给工商局,一般3个工作日后可以领取执照(各地时间略有差别)。 8.刻制公章: 
    凭营业执照,到公安局指定的刻章社,刻公章,财务专用章,费用120-180元。 9.办理企业组织机构代码证: 
    凭营业执照到技术监督局办理组织机构代码证,费用30元。 10.开基本户: 
    凭营业执照,组织机构代码证,去银行开立基本帐号(同时注销验资帐户)。 11.办理税务登记: 
    领取执照后的30日内到当地税务局申请领取税务登记证(国税,地税)费用分别是10元, 40元 。 12.领购发票: 
    服务性质的公司使用地税发票,销售商品的公司使用国税发票。 
    各地的费用会略有不同。 
    注册公司的流程所需要的材料和时间
    一.公司查名所需材料如下: 
      ①法定代表人、股东身份证或者法人的身份证; 
      ②注册资本金额及各股东投资比例; 
      ③公司名称字号五个以上; 
      ④公司主要经营范围; 
      二.流程: 
      查名→验资→办理工商营业执照(含刻章)→办理组织机构代码证→办理税务登记证。 
      三.时间: 
      ①查名:三个工作日; 
      ②验资:三个工作日; 
      ③营业执照:五个工作日; 
      ④组织机构代码证:二个工作日; 
      ⑤税务登记:十个工作日。
    二.注册资本用完后在你公司的所开户的银行里做为你公司的流动资金用,是不交给工商局的,与他们无关.是存入银行的证明你们有这些资本实力进行公司运营. 
    三.具体程序:
    企业名称预核准(工商局)--验资(会计师事务所)--办理相应的前置审批手续--申请营业执照(工商局) 
    要注册一个公司,首先想好经营什么,怎样经营好,再来注册。要不,注册了也没有用,注册了公司是需要很多成本的,不是一件“好玩”的事情。前期可行性分析调查,建议你自己认真的考虑一下。接下来谈谈如何注册公司,需要哪些手续、怎样操作。 
    一、选择公司的形式: 
    普通的有限责任公司,最低注册资金3万元,需要2个(或以上)股东 二、注册公司的步骤: 
    1.核名:到工商局去领取一张“企业(字号)名称预先核准申请表”,填写你准备取的公司名称,由工商局上网(工商局内部网)检索是否有重名,如果没有重名,就可以使用这个名称,就会核发一张“企业(字号)名称预先核准通知书”。 
    2.租房: 
    去专门的写字楼租一间办公室,如果你自己有厂房或者办公室也可以,有的地方不允许在居民楼里办公。 
    租房后要签订租房合同,并让房东提供房产证的复印件。 
    3.编写“公司章程”: 
    可以在工商局网站下载“公司章程”的样本,修改一下就可以了。章程的最后由所有股东签名。 
    4.刻私章: 
    去街上刻章的地方刻一个私章,给他们讲刻法人私章(方形的)。费用大概20元左右。 
    5.到会计师事务所领取“银行询征函”: 
    联系一家会计师事务所,领取一张“银行询征函”(必须是原件,会计师事务所盖鲜章)。如果你不清楚,可以看报纸上的分类广告,有很多会计师事务所的广告。 
    6.去银行开立公司验资户: 
    所有股东带上自己入股的那一部分钱到银行,带上公司章程、工商局发的核名通知、法人代表的私章、身份证、用于验资的钱、空白询征函表格,到银行去开立公司帐户,你要告诉银行是开验资户。开立好公司帐户后,各个股东按自己出资额向公司帐户中存入相应的钱。 
    银行会发给每个股东缴款单、并在询征函上盖银行的章。 
     
    7.办理验资报告: 
    拿着银行出具的股东缴款单、银行盖章后的询征函,以及公司章程、核名通知、房租合同、房产证复印件,到会计师事务所办理验资报告。一般费用500元左右(50万以下注册资金)。 
    8.注册公司: 
    到工商局领取公司设立登记的各种表格,包括设立登记申请表、股东(发起人)名单、董事经理监理情况、法人代表登记表、指定代表或委托代理人登记表。填好后,连同核名通知、公司章程、房租合同、房产证复印件、验资报告一起交给工商局。大概3个工作日后可领取执照. 
    9.凭营业执照,到公安局指定的刻章社,去刻公章、财务章。后面步骤中,均需要用到公章或财务章。 
    10.办理企业组织机构代码证: 
    凭营业执照到技术监督局办理组织机构代码证,费用是80元。办这个证需要半个月,技术监督局会首先发一个预先受理代码证明文件,凭这个文件就可以办理后面的税务登记证、银行基本户开户手续了。 
    11.去银行开基本户: 
    凭营业执照、组织机构代码证,去银行开立基本帐号。 
     
    12.办理税务登记: 
    领取执照后,30日内到当地税务局申请领取税务登记证。
    13.申请领购发票: 
    如果你的公司是销售商品的,应该到国税去申请发票,如果是服务性质的公司,则到地税申领发票。 
     
    有二点你可能比较关心: 
    1.公司必须建立健全的会计制度,你可能担心自己不会,怎么办?刚开始成立的公司,业务少,对会计的工作量也非常小,你可以请一个兼职会计,每个月到你的公司帮你建帐,二、三天时间就够了,给他200-500左右的工资即可。 
    2.公司的税额: 
    营业税:销售商品的公司,按所开发票额的4%征收增殖税;提供服务的公司,按所开发票额的5%征收营业税。 
    所得税:对企业的纯利润征收18-33%的企业所得税。 小公司的利润不多,一般是18%。对企业所得税,做帐很关键,如果帐面上你的利润很多,那税率就高。所以,平常的购买设备都要开发票,你吃饭、坐车的票都留起来,可以做为你的企业运作成本。
    本公司的服务网址:
                      1. 公司注册网      http://www.51zhuce.net
                      2.上海公司注册网  http://www.51gongsizhuce.com 
                      3.外资公司注册网  http://www.zhucewaizi.com 
                      4.代表处注册网   http://www.shdbc.com
                      5.上海企业注册网   http://www.shanghaizhuce.com
      

  37.   

    要是英文好就好了,可以去看一下Java的doc了,就什么都明白了
      

  38.   


    哈哈  new对象不好? 是看对性能的要求 和new的多少
    即使用spring 有的时候该new还是要用的  不然就被框架约束死了
      

  39.   

    虽然结果是2者都创建了对象 
    但是在不知道 类 地址,只能通过外部传入的时候
    只能用 class。forName("ClassPath").newInstance()
    class。forName("ClassPath") 是加载类 ,加载的时候类的
    静待函数和变量会被加载到内存中,在需要类的静态函数但是不想
    new对象的时候 会用。
      

  40.   

    Class本身就是一个类,实际上所有的Java类创建时, JVM都会为每个具体的实例创建一个Class对象,但是Class本身不能明确建立,因为他没有自己的构造方法,他的构造是被JVM完成的。forName是Class的一个静态方法,其用途和普通的静态方法是一样的。比如你写一个懒汉模式的单体类就明白了,单体类的创建模式,和Class.ForName的创建方式含义相似。
      

  41.   

    http://www.ibm.com/developerworks/cn/java/coretech/java-vm.html?S_TACT=105AGX52&S_CMP=content