“实例化”和“初始化”之间有什么区别?

我一直听到VB.NET微软教程中使用的这两个词。 用于引用variables时,这两个词有什么区别?

参考types的价值

C#中的variables分为两组。 types或引用types。 像intDateTimetypes是types。 相反,您创build的任何类都是引用types。 C#string也是一个引用types。 .NET框架中的大部分内容都是引用types。

variables的一部分

有variables名称和它的两部分

variables的名字就是你声明的那个名字价值是你分配给它的。

variables被初始化

所有的variables总是在variables被声明的地方被赋予一个初始值。 因此所有variables都被初始化

对于types,比如int ,如果你不这样做,编译器会给它一个有效的值。 int默认初始化为零,默认情况下DateTime 初始化DateTime.MinValue

引用typesvariables初始化为您提供的对象。 如果不这样做,编译器将不会分配一个对象(即有效值)。 在这种情况下,该值为null – 什么也不是。 所以我们说参考被初始化为null。

对象被实例化

人类是天生的 对象被实例化。 一个婴儿是一个人的一个实例 ,一个对象是某个类的一个实例

创build一个类的实例的行为称为实例化 (Ta-Da!)

所以声明初始化实例化就像这样

 MyClass myClassyReference= new MyClass(); 

在上面,说“创build一个对象的实例…”是错误的。

生命中不能承受之轻

引用typesvariables的名称和值独立存在。 我的意思是独立的。

实例化的对象可能有也可能没有对它的引用。

实例化的对象可能有许多引用。

声明的引用可能指向或不指向对象。

一个variables用一个值初始化。 一个对象被实例化,当它被分配了内存并且它的构造函数已经被运行。

比如这里是一个variables:

 Dim obj as Object 

这个variables还没有被初始化 。 一旦给objvariables赋值,variables将被初始化。 这里是初始化的例子:

 obj = 1 obj = "foo" 

实例化是一个非常不同的事情,但是相关的,因为实例化后通常是初始化:

 Dim obj As New Object() 

在前面的代码行中, objvariables是通过引用实例化的新Object初始化的 。 我们说新的Object是实例化的,因为我们已经创build了一个新的实例。

现在我相信VB.NET比C#更令人困惑,因为在上面的代码中并不清楚分配是否发生。 在C#中,有一个实例的实例化和一个variables的初始化:

 Object obj = new Object(); 

初始化的东西是将其设置为初始值。 实例化一些东西就是创build它的一个实例。

通常这是或多或less相同的事情。 这个:

 SqlConnection conn = new SqlConnection(); 

实例化一个SqlConnection对象,并通过将其设置为该实例来初始化connvariables。

由于对象的构造函数也将对象的属性设置为其默认值,因此说实例化一个对象对其进行初始化通常是正确的。 (误导性的,如果对象公开了一个方法,你必须明确地调用它初始化它的实例化,有时是这样的情况。)

*实例化是指为类或对象创build一个实例。初始化意味着*为任何目的启动相同的对象或类。**

实例化意味着已经创build了对象的一个​​实例。 启动意味着同一个对象已经做了一些初始化。

当你实例化一个类或对象时,你正在创build一个新的实例,或者分配内存来“保存”一个。 初始化该对象将是在实例化过程中执行的指令。

实例化是当你创build一个类的实例。 那么这个实例就是一个对象,你可以设置它的属性,或者调用它的方法(告诉它做什么)。

启动是当你为一些东西设置一组初始条件时。 那东西可能是一个对象,你告诉它启动它自己,或者只是一个你赋值的variables。

一个对象可能会初始化一些其他的东西,或者甚至实例化其他对象作为其启动的一部分。

不同之处在于,实例化是创build一个可以做东西的事物; 开始是完成的东西。

查看Java文档: https : //docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

Point originOne = new Point( 23,94 );

 Declaration: The code set in bold are all variable declarations that associate a variable name with an object type. Instantiation: The new keyword is a Java operator that creates the object. Initialization: The new operator is followed by a call to a constructor, which initializes the new object." 

实例化是指分配内存来创build一个类的实例,而初始化是指通过为该实例分配variables名来命名该实例。

例如: SqlConnection conn = new SqlConnection();

这里new是为实例分配内存的关键字,而conn是为该实例分配的variables名称。

其他人已经解释了这个区别,所以我不会详细讨论。 但有些情况下,实例化不能正确初始化一个对象。 当你实例化一个对象时,你也用一些数据初始化它。 类/types将具有初始化逻辑,而实例化逻辑通常由new关键字执行(基本上是内存分配,参考复制等)。 但是实例化不一定会导致对象的有效状态,也就是说我们可以说对象是未初始化的 。 这是一个实例,一个对象可以被实例化,但没有初始化(对不起,例如在C#中)。

 class P { string name = "Ralf"; } WriteLine(new P().name); // "Ralf"; WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null 

GetUninitializedObject不调用构造函数来在那里实例化对象(但有些内在的魔力)。

人们也可以争辩说,值types没有实例化,但只是初始化,因为当你做new..时候它不需要新的分配new..但是这取决于一个实例化的定义。

我们可以这样看。 对于下面的一行代码:

 var p = new Person(); 

以上两行可以通过以下两种方式读取:

  1. variablesp已经被初始化为一个人类
  2. Person类已经在variablesp中实例化

参考的主题或背景很重要。 当根据variables说话时,我们使用单词initialize 。 当根据类/types进行交谈时,我们使用实例化(instantiate)这个词。