“实例化”和“初始化”之间有什么区别?
我一直听到VB.NET微软教程中使用的这两个词。 用于引用variables时,这两个词有什么区别?
参考types的价值
C#中的variables分为两组。 值types或引用types。 像int
和DateTime
types是值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还没有被初始化 。 一旦给obj
variables赋值,variables将被初始化。 这里是初始化的例子:
obj = 1 obj = "foo"
实例化是一个非常不同的事情,但是相关的,因为实例化后通常是初始化:
Dim obj As New Object()
在前面的代码行中, obj
variables是通过引用实例化的新Object
来初始化的 。 我们说新的Object
是实例化的,因为我们已经创build了一个新的实例。
现在我相信VB.NET比C#更令人困惑,因为在上面的代码中并不清楚分配是否发生。 在C#中,有一个实例的实例化和一个variables的初始化:
Object obj = new Object();
初始化的东西是将其设置为初始值。 实例化一些东西就是创build它的一个实例。
通常这是或多或less相同的事情。 这个:
SqlConnection conn = new SqlConnection();
实例化一个SqlConnection
对象,并通过将其设置为该实例来初始化该conn
variables。
由于对象的构造函数也将对象的属性设置为其默认值,因此说实例化一个对象对其进行初始化通常是正确的。 (误导性的,如果对象公开了一个方法,你必须明确地调用它初始化它的实例化,有时是这样的情况。)
*实例化是指为类或对象创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();
以上两行可以通过以下两种方式读取:
- variablesp已经被初始化为一个人类
- Person类已经在variablesp中实例化了
参考的主题或背景很重要。 当根据variables说话时,我们使用单词initialize 。 当根据类/types进行交谈时,我们使用实例化(instantiate)这个词。