實例化(instantiate)是指在面向對象的編程中,把用類創建對象的過程稱爲實例化。是將一個抽象的概念類,具體到該類實物的過程。實例化過程中一般由類名 對象名 = new 類名(參數1,參數2...參數n)構成。
簡介
在面向對象的編程中,通常把用類創建對象的過程稱爲實例化,其格式如下:
如 Date date=new Date();就是用日期類創建了一個日期的對象,就叫對象的實例化。
多數語言中,實例化一個對象就是爲對象開闢內存空間,或者是不用聲明,直接使用new 構造函數名,建立一個臨時對象。
例:Java
public class A{
public static void main(String[] args){
B b = new B();//實例化
b.print();
}
}
class B{
public void print(){
System.out.println("Hello,World!");
}
}
例: c#
namespace test
{
class A
{
public int Sub(int a)
{
return a++;
}
}
class B
{
public void Main(String[] args)
{
int p = (new A()).Sub(1);
System.Console.WriteLine(p);
System.Console.ReadKey();
}
}
}
使用方法
以PHP爲例。
類不同於函數,定義完之後無法直接使用,因爲類只是一個抽象的概念,需要通過關鍵字new來實例化類,纔可以使用。類實例化的語法格式如下:變量名=new 類名([構造函數])。其中,變量名可以爲任何PHP變量的名稱,構造參數取決於類的構造函數,若無構造函數,則圓括號中爲空。
例如:
<?php
class People{
public $name;
public function introduceMySelf(){
echo '內容',$this->name.‘內容2’;
}
}
$p=new People();
?>
如果要在類外使用類的屬性和方法(前提是該屬性或方法是可訪問的),需要使用操作符->,語法格式如下:
-
實例化的類變量名->屬性名;
-
實例化的類變量名->方法名([方法參數]);
使用類的方法與調用函數一樣,在圓括號中給出函數參數(沒有參數時當然就不用寫了)。需要特別注意的是,在使用操作符->引用屬性時,屬性名是不加符號$的。
類模板與函數模板實例化
函數模板實例化
以C++爲例,C++標準除支持隱式實例化模板函數外,還支持顯式實例化。其語法格式如下:
template 返回類型 函數名<類型實參列表>(實參類型列表);
例如,若有以下函數模板:
template<typename T>
void swap(T a ,T b){
T tempt=a;
a=b;
b=tempt;
};
那麼,以下語句是該函數模板的一個顯式實例化:
template void swap<int>(int,int);
說明:template關鍵字之後不再跟"<>",否則就成了函數模板的特化。
類模板的實例化
與函數模板相似,類模板只是一個虛的“圖紙”。只有在編譯期間,編譯器根據給定的模板類型實參生成實實在在的模板類,這纔是真實存在的類代碼。函數模板實例化後會生成模板函數,類模板實例化後則會生成模板類。
在爲不同模板實參類型實例化生成模板類時,編譯器會爲每種數據類型都生成一個模板代碼的副本,所以結果會導致代碼體積增大。因此,在實際調用過程中,編譯器會有選擇的實例化類模板中的成員函數,只有那些被調用了的函數,它對應的類模板成員函數纔會被編譯器實例化並生成。這就是類模板的“選擇性實例化”。
聲明、初始化、實例化的區別
聲明是指使用一個對象的時候,先定義屬於哪個類型,比如string _str;
_str是聲明(定義)了一個string類型的對象。
初始化可以理解爲給聲明的對象賦值的過程。string _str ="hello";
_str現在已經被初始化了,實例化後它具有“hello”這個值。
實例化是類用到的,A a = new A();當new的時候爲對象分配內存,這個過程是對象的實例化。
總結:
聲明,只生成對象不賦值的過程。
初始化,是給對象賦值的過程。
實例化,是使用new爲對象分配內存的過程。