什么是实例化? 标签: vb 2015-02-08 20:26 1026人阅读 评论(30) 收藏

      为什么要写这个博客呢?可能是因为自己的基础太差,昨天敲三层的注册,各层都敲完了以后,死活报错,无奈之下只能找晓婵求救,她只改了三个地方,犯了同一个错误,我的源码是这样写的:Dim uA As  Entity.UserInfo,然后就会报这个错:

晓婵的改法是:Dim uA As New Entity.UserInfo,当时觉得好坑,自己整了半天就是因为少了一个NEW,其实之前用vb敲机房的时候也肯定有这个问题,但是自己从来没有注意过,这次特意去查了一下,为什么加new和不加new差别这么多,下面基本都是别人写的,拿来科普给自己。


     1.new的作用

     先来看看dim a as 类1 和dim a as new 类1的区别:

        DIM a As 类1 '声明a是这个类1对象,但是类1必须通过 set a=new 类1创建,否则为nothing 
        Dim a As new 类1 ' 声明一个类1对象,但不需要显示创建对象,会自动创建
当后续代码第一次调用 a.方法或a.属性时,系统会自动创建

        所以new就相当于这句:set a =new 类1,是一个初始化的过程。


          2.如何创建对象(实例化)

          Dim a As 类1  的意思我们知道了,是定义一个变量,并且变量内容是指向一个类的指针,但因为这个类型没有实际的分配出内存并载入堆栈,所以这个时候这个变量是无用的,只是个指向空地址无用变量。

          而 new 类1 就是将这个类创建一个新实例的过程,并将这个创建好的新实例地址赋值给 a 这个变量。也可以理解为在内存中划分了一块符合这个类所需要的内存区域,并将相关过程载入到该内存中,并将这个内存地址载入堆栈共CPU执行。而这块分配好的地址句柄便是这个类的实例句柄。也就是 a 这个类指针真正存储的东西。


          当调用变量的属性、方法或事件时,其实就是CPU根据代码寄存器再内部跳转执行编译位置代码,每一个实例有一个独立的内存块,即使结构一直,但内容不同,这就是类和类实例化的关系。
在VB中理解,就是
         Dim a As 类1       '是定义类变量
         Set a = new 类1    '是初始化类变量(加上“实例”更为贴切)
         Dim a As New 类1  '是定义类变量同时初始化类变量
        因为类必须初始化,如果没有初始化的类是不能用的。
        即使有些类或对象不是经由你的代码初始化,也是系统或别的程序帮你初始化了才能用,如 me、app、Form1...

       3.为什么要实例化?

        因为只有实例化之后,才能将这个对象放到内存中,然后才能在规定的范围内来调用。这不包括静态对象,静态对象是可以直接调用的。
      每次实例化其实都是一个新建的过程
      例如dim a  as  new Object();这句话,你可以写无数次,只要每次起到名字不同,就会在内存中创建无数个Object对象,这样在调用其中任意一个的时候互不干扰。    


      自己查找了这么多的东西以后,其实对于new这个问题也了解了,可能以后再来看new会发现自己现在了解的还只是一个皮毛,不过这个阶段,也是必须要经历的啊!


posted @ 2015-02-08 20:26  kingsaytay  阅读(150)  评论(0编辑  收藏  举报