What is the difference between "instantiated" and "initialized"?

我一直在听微软的 VB.NET 教程中使用这两个词。当提到变量时,这两个词有什么区别?

96484 次浏览

使用值初始化 变量。当为 对象分配了内存并且它的构造函数已经运行时,就会实例化 对象

例如,这里有一个变量:

Dim obj as Object

这个变量不是 已初始化。一旦我为 obj变量赋值,该变量将被初始化。下面是初始化的例子:

obj = 1
obj = "foo"

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

Dim obj As New Object()

在前一行代码中,obj变量是 initialized,引用的新 Object实例化。我们说新的 Object被实例化是因为我们已经创建了它的一个新实例。

现在我相信 VB.NET 比 C # 更让人困惑,因为在上面的代码中不清楚是否发生了赋值。在 C # 中,实例的实例化和变量的初始化更加清晰:

Object obj = new Object();

实例化意味着已经创建了对象的实例。Initiated 意味着同一个对象已经完成了一些初始化。

When you instantiate a class or object, you're creating a new instance of it, or allocating memory to "hold" one. Initializing that object would be the instructions that are performed during instantiation.

To 初始化 something is to set it to its initial value. To 实例化 something is to create an instance of it.

通常情况下,这是差不多相同的事情:

SqlConnection conn = new SqlConnection();

实例化 SqlConnection对象,并通过将 conn变量设置为该实例来实例化 initializes变量。

由于对象的构造函数也将对象的属性设置为它们的默认值,所以说实例化对象初始化它通常是正确的。(误导,如果对象公开了一个方法,您必须显式地调用该方法来在实例化之后初始化它,有时就是这种情况。)

实例化是指创建类的实例。这个实例就是一个对象,您可以设置它的属性,或者调用它的方法(告诉它做一些事情)。

初始化是指为某事设置一组初始条件。这个东西可能是一个对象,你让它自己启动,或者只是一个变量,你给它赋一个值。

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

不同之处在于实例化是创建一个可以做事情的东西; 启动是完成的事情。

*Instantiation means to create an instance for a class or object.Initialization means to *initiate the same object or class for any purpose.**

相对于参考类型的值

C # 中的变量 分为两组。价值型或 参考文献型。像 intDateTime这样的类型是 价值类型。相反,您创建的任何类都是 参考文献类型。C # 字符串也是 参考文献类型。大部分的东西。NET 框架是 参考文献类型。

变量的部分

There is the variable 姓名 and its 价值. Two parts.

变量的 姓名是你的 声明价值是你的 指派

变量已初始化

所有的变量总是在变量是 声明的时候给出一个 initial值。因此所有的变量都是 initialized

对于 价值类型,如 int,如果不显式地这样做,编译器将给它们一个有效值。缺省情况下 int初始化为0,缺省情况下 DateTime初始化DateTime.MinValue

参考 类型变量 初始化到您给它的对象。编译器将不会 assign一个对象(即一个有效的值) ,如果你不。在这种情况下,值是 null-nothing。所以我们说引用是 已初始化到 null。

对象已实例化

Humans are born. Objects are instantiated. A baby is an 例子 of a Human, an object is an 例子 of some Class.

创建类的 instance的动作称为 < strong > 实例化 (Ta-Da!)

所以 声明初始化实例化这样结合在一起

MyClass myClassyReference = new MyClass();

在上面,说“ ... 创建 对象的实例...”是错误的


受评论讨论的启发进行编辑

有三种截然不同的情况(以上)使用截然不同的术语,而且这些术语是不可互换的:

  1. A reference variable is declared - MyClass myClassyReference
  2. 一个对象被实例化(... 从给定的 同学们实例化)-new MyClass()
  3. 该对象被分配给变量。

重述事实:

  1. 引用类型的变量也称为“引用”。“值类型的变量”不是引用。

  2. 这一点: “ objectA 是对象的一个实例”是大错特错的。如果 objectA 是“ objectB 的一个实例”,那么它必须是 objectA 以 objectB 的类型(不管是什么)和当前状态(不管是什么)开始生命。如何在对象 B 更改时创建对象 D、 E 和 F?不,不!在概念和技术上,“ objectA 是一个类的实例”。“实例化”和“实例化”具有精确的含义——对象从 Class 中获取其类型、定义和值。

  3. 一般来说,我们不会说“变量被赋值为 null”,我们也不会说“变量引用 null”,不会。相反,我们说“变量为空”; 或者“变量没有引用任何东西”,或者“引用为空”

实际应用:

  • I jab my finger at your code and say "this instance has an invalid property. Maybe that's why the loop fails. You gotta validate parameters during instantiation." (i.e. constructor arguments).

  • 我在你的代码中看到了这一点,

     MyClass myClassyReference;
    myClassyReference.DoSomething();
    

    ”您声明了变量,但从未赋值它。它是空的,所以它没有引用任何东西。这就是方法调用抛出异常的原因。”

结束编辑


生命中不能承受之轻

引用类型变量的名称和值是独立存在的,我的意思是独立的。

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

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

声明引用可能是对象,也可能不是对象。

实例化是指分配内存以创建类的实例,而初始化是指通过为该实例分配变量名来命名该实例。

例句: SqlConnection conn = new SqlConnection();

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

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

"原点一 = 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."

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

class P { string name = "Ralf"; }


WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null

GetUninitializedObject不调用构造函数在那里实例化对象(但是有一些内部魔法)。

也有人认为值类型不是实例化的,而是初始化的,因为在执行 new..时它不需要新的分配,但这取决于实例化的定义。

我们可以这样看,下面是一行代码:

var p = new Person();

以上一行可从以下两个方面理解:

  1. 变量 p 作为一个人员类是 已初始化
  2. Person 类在变量 p 中为 实例化

参考的主题或上下文问题。当谈到 变量时,我们使用 初始化这个词。当谈到 类别/类别时,我们使用 实例化这个词。

In object-oriented parlance:

  • 实例化意味着创建某个类的对象,其初始状态可能是未定义的。

    类是程序用来创建对象的蓝图。创建的对象与蓝图兼容,并且可以由程序操作。例如,变量 current_clientprevious_client可以被赋予类 Customer的对象。类别 X 的实例是从类 X 实例化的对象。

    在代码中,类是对象可以做什么的永久性静态描述,但是对象本身是临时的和动态的。它们有一个可以更改的单独状态(例如,客户名称、相关订单)。实例化可以这样做:

    dim current_client as new Customer(VB)
    Customer* current_client = new Customer()(C + +)
    current_client = Customer()(Python)

    new Customernew Customer()Customer()是不同语言中触发实例化的等价形式。

    In the end objects are destructed to release memory and other resources required for their existence and working.

  • To 初始化 means assigning an initial state to the object before it is used.

    此初始化可以是实例化过程的一部分,在这种情况下,值显式分配给对象构造函数中的对象属性。或者,它可以留给用户来决定是否需要它。后一种方法允许更快的实例化,但是要求用户的代码在为任何属性显式分配值之前不读取任何属性的值。例如:

    current_client.count = current_client.count + 1

    在用户设置属性 count之前是不允许的,因为它可以包含任何初始值,包括会触发执行错误的无效值。