關於Java的構造器和直接為成員變量賦值的區別


 
首先,看一下為什么要用構造器?
1、Java類的 成員變量在被修飾為public、protected和包 訪問權限時,可以在不同層次上直接給 成員變量賦值。
但是,賦值的前提是:必須存在持有成員變量的對象。而對象的初始化必須調用構造函數,所以構造函數是必不可缺的。
至於使用 構造函數還是直接聲明時給成員變量賦值,那就要看情況而定。
如果創建的這個對象是不可變的,那么就必須使用構造函數初始化成員變量,反之,就無所謂。
另外,直接給成員變量賦值,Java是不推薦的,因為這樣會破壞它的封裝性。所以,建議在構造函數或提供setters方法對變量賦值。
2、成員變量的賦值一般通過構造函數;直接賦值一般的話都是一些常成員變量,final關鍵字開頭的。
3、其他的時候基本上都是用構造函數構造函數試用於動態創建對象。基於對象編程的思想,是不贊成直接給類里面的變量直接賦值的。
 
 
作者:小開
鏈接:http://www.zhihu.com/question/20616186/answer/15646132
來源:知乎

類變量、實例變量的初始化比較相似,對於實例變量有一個例子
public class RAMTest {
{
price = 3.4;//①--非靜態語句塊
}
public RAMTest( double price) {
this.price = price;//②-- 構造函數
}
double price = 2.0;//③-- 聲明語句並賦值
}


本例中對實例變量price的初始化有三處
執行順序為:③中price變量聲明[price=0.0]
--①中price變量賦值[price=3.4]
--③中price變量賦值[price=2.0]
--②中price構造函數賦值
需要注意的是,雖然非靜態語句初始塊中的price變量的賦值在聲明之前,但實際上執行的時候會先執行變量的聲明,再按代碼順序執行變量值的賦值動作,然后再進行構造函數對實例的初始化構造。
這三種實例變量的初始化語句經過編譯器處理后,都會合並到構造器中去,其中定義變量語句轉換得到的賦值語句、初始化塊中的語句轉化得到的賦值語句, 總是位於構造器的所有語句之前。合並后兩種賦值語句的順序保持他們在源碼中的順序。
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM