什么是实例化?

简介: 什么是实例化?

为什么要写这个博客呢?可能是因为自己的基础太差,昨天敲三层的注册,各层都敲完了以后,死活报错,无奈之下只能找晓婵求救,她只改了三个地方,犯了同一个错误,我的源码是这样写的: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会发现自己现在了解的还只是一个皮毛,不过这个阶段,也是必须要经历的啊!


目录
相关文章
|
4月前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
30 0
|
8月前
|
JavaScript 前端开发
浅谈一下实例化
浅谈一下实例化
C#中声明、初始化和实例化
C#中声明、初始化和实例化
121 0
|
9月前
|
编译器 C++
30利用构造函数对类对象进行初始化
30利用构造函数对类对象进行初始化
62 0
|
9月前
|
C++
c++将一个类的回调函数注入到另一个类中的方法
c++将一个类的回调函数注入到另一个类中的方法
通过构造方法使属性初始化
通过构造方法使属性初始化
116 0
|
设计模式 Python
我为什么要创建一个不能被实例化的类
我为什么要创建一个不能被实例化的类
90 0
|
C++ 小程序
c++类的实例化,有没有new的区别
A a; A * a = new a(); 以上两种方式皆可实现类的实例化,有new的区别在于: 1.前者在堆栈中分配内存,后者为动态内存分配,在一般应用中是没有什么区别的,但动态内存分配会使对象的可控性增强。
1278 0
学生类-构造函数
学生类-构造函数
206 0