爲了更好的理解這些基本概念,在這裏把基本類型變量和引用類型變量做一個比較, 按慣例前者簡稱爲引用,後者簡稱爲變量;數組
我相信這裏面的邏輯是一致的,所以假使站在引用的角度看待變量會是個什麼感受?對象
int a;編譯
int a = 10;class
聲明一個整型變量a;容器
給a初始化爲10;變量
這裏實際上已經默認建立了一個類 叫作引用
public class Int{集合
};錯誤
這樣 上面就能夠陳述爲 建立一個int類的對象a,把這個對象a初始化爲10;由於它是Java自帶的,所以不須要new,也就是新建的意思。new
新建一個類,新建一個包,實質上都是在new一個還沒有存在的事物;
話說回來,當咱們新建一個非自帶的類時,好比
public class Student{
};
這時,想建立一個Student類的對象,則須要new
Student a = new Student( );
此時默認調了一個無參構造
即
public class Student{
Student( ){
}
};
後面那個括號是參數列表容器嗎(這個是我爲了好理解本身捏造的概念)?說白了參數列表就是一個變量集合,也就是一個屬性集,用來表徵引用對象。
咱們不可能建立一個不傳參的引用對象,那沒有實際意義,即不實例化的建立一個對象自己是不符合邏輯的。
所以抽象類才變的有了實用的邏輯意義。
反過來再來看int,假設它也有默認無參構造也須要new
public class Int{
int(){
}
};
int a;
int a = new int( );
一對比就知道這個是沒有意義的,由於int已是基本類型變量,你傳參沒有意義。
10 就是 10,這個整型對象10是一個基本元素。
一個Student類的對象a,不能說是a 就是10,你能說一個整數是10,但你不能說一個學生a是10;
你能夠說a的年齡是10,由此我彷佛明白了引用的深層意味;
引用對象a(注意相對於基本對象 10)的屬性參數並無存在棧中,棧中只是存了它,和它的地址;
它的地址就像一個路徑指向堆中的變量
咱們說a的年齡是10,名字張三,十、張三都保存在堆中。這個地址其實也是咱們本身創建的:
public class Student{
Student( ){
}
};
Student a = new Student( );
此時僅僅是建立了一個對象a,並無初始化(沒有實例化)的狀態;
我認爲地址就是經過兩段代碼創建的對應的一個路徑。
即Student這個關鍵字,它就是一個地址關鍵因素,由於假使
public class Student{
Student( ){
}
};
Teacher a = new Student( ); // 這個是要報編譯錯誤,也就是典型的牛頭對馬嘴
Teacher a = new Teacher( ); /這個就跟Student無關,即創建關聯路徑(地址),就是風馬牛不相及;
那接下來說數組。
數組也是引用,咱們知道int[ ] a = new int[ 4 ];
是聲明(建立了)一個整型數組對象a,這時 a ( a 也是一個變量)的類型就會是一個整型數組,這個數組裏麪包含着一些整型變量;
重點來了,當咱們給a裏面的元素初始化時,咱們是這麼幹的,以給a的第1個元素初始化來講!
a [ 0 ] = 10;
注意這裏不須要new,爲何?由於前面已經說了,int是基本類型變量,所以不要要new;
可是!你給引用數組(int[ ]算是基本數組)初始化你就得new了並且傳參,由於引用數組裏面的成員是引用;
建立一個Student類的對象,則須要new
Student a = new Student( );
傳參了就是初始化這個a
這兩步合在一塊兒即聲明並初始化(實例化)1個引用對象a;
聲明並初始化1個基本對象就不須要new了 好比 int a = 10;
注意區分辨析概念
建立引用數組對象 和爲引用數組對象中的元素賦值 都須要new 前者new個引用數組對象,後者new個引用類型的引用數組的元素;