日积跬步02
重要思想繼續(xù):
1.對象的創(chuàng)建和存在時間:對象需要的數(shù)據(jù)位于哪兒?如何控制對象的“存在時間”呢?
方法一,C++認為程序的執(zhí)行效率是最重要的,所以允許程序員為獲得最快的運行速度,自行決定存儲以及存在時間——只需將對象放置在堆棧或者靜態(tài)存儲區(qū)域,同時犧牲靈活性,因為在編寫程序時必須準(zhǔn)確知道對象數(shù)量、存在時間以及類型。
方法二,在內(nèi)存池中動態(tài)創(chuàng)建對象,給內(nèi)存池叫“堆”或“內(nèi)存堆”。采用這種方式,除非進入運行期,否則根本不知道實際需要多少個對象,也不知道存在時間以及準(zhǔn)確類型。由于動態(tài)創(chuàng)建方法使對象本來就傾向于復(fù)雜,所以查找存儲空間以及釋放它所需的額外開銷不會為對象的創(chuàng)建造成明顯的影響。
如果在堆棧或者靜態(tài)存儲空間里創(chuàng)建一個對象,編譯器會判斷對象的持續(xù)時間有多長,到時會自動“破壞”或者“清除”它。程序員用兩種方法破壞對象:一是用程序化的方式消除對象,二是利用運行環(huán)境提供的“垃圾收集器”特性,垃圾收集器會自動尋找不再使用的對象并消除,但會額外帶來開銷。這并不符合C++的語言宗旨,C++嚴格要求使用完對象必須及時釋放。而Java提供了垃圾收集器設(shè)計。
2.違例控制:這里的“違例”(Exception)屬于一個特殊對象,它會從產(chǎn)生錯誤的地方“扔”出來 ,隨后這個違例會被“違例控制器”捕獲,甚至?xí)卸鄠€違例控制器并行捕獲對應(yīng)違例對象。這種設(shè)計理念是在不干擾常規(guī)代碼執(zhí)行的情況下,獨立處置違例錯誤,最后利用違例從糟糕的環(huán)境中恢復(fù),程序不用退出就能恢復(fù)執(zhí)行。
3.多線程:Java的多線程機制已經(jīng)內(nèi)建到語言中,簡化了復(fù)雜的多線程。Java對多線程處理的支持是在對象一級的,所以一個執(zhí)行線程可表達為一個對象,Java也提供有限的資源鎖定方案,它能鎖定任何對象占用的內(nèi)存,即同一時間只能有一個線程使用特定的內(nèi)存空間。關(guān)鍵字synchronized。
4. java客戶端程序、java服務(wù)器端程序。。。。
==============================================================================================
“磨刀不誤砍柴工”,學(xué)習(xí)java基本組件:
Chapter2 一切都是對象
1. 一切都是對象,然而操縱標(biāo)識符實際是指向一個對象的“句柄”,(有參考書的說法是“引用”,甚至“指針”等)。String s; 這里創(chuàng)建的是句柄,而不是對象;始終堅持一個原則:創(chuàng)建句柄時,無論如何必須初始化。
String s = "asdf"; 可以解釋為String是一種特殊類型——字串可用加引號的文字初始化。更通用的初始化方法:
String s = new String("asdf");
2.程序運行時,數(shù)據(jù)保存在什么地方?(非常喜歡作者能一直關(guān)注到代碼運行內(nèi)存保存情況,這是一程序員應(yīng)該考慮的事情,而不是一個拼湊代碼的碼農(nóng)care的)
一般來說,有6個地方可以保存數(shù)據(jù):
(1)寄存器:速度最快的保存區(qū)域,然而寄存器數(shù)量有限,由編譯器根據(jù)需要分配,對程序員來所透明;
(2)堆棧:常規(guī)RAM(隨機訪存)區(qū)域,特點是特別快速、特別有效,指針上下移動即可完成內(nèi)存創(chuàng)建、刪除;Java編譯器必須明確所保存數(shù)據(jù)的長度、以及存在時間,這會限制程序的靈活性。一般對象句柄保存在堆棧,而java對象不保存在堆棧;
(3)堆:一種常規(guī)用途的內(nèi)存池(RAM區(qū)域),其中保存Java對象。“內(nèi)存堆”(Heap)最大亮點是編譯器不必知道需要從堆里分配多少空間,也不必知道存儲的數(shù)據(jù)在堆停留多長時間;靈活性的代價是堆里分配空間會花掉較長時間;
(4)靜態(tài)存儲:“靜態(tài)”static是指“位于固定位置”,靜態(tài)存儲的數(shù)據(jù)隨時等候調(diào)用,關(guān)鍵字static指定。可以理解保存在RAM的中的靜態(tài)區(qū)域;
(5)常數(shù)存儲:可直接置于程序代碼內(nèi)部,也可保存在ROM;
(6)非RAM存儲:數(shù)據(jù)完全獨立一個程序之外,程序運行時仍可存在。“流式對象”和“固定對象”。
3. Primitive 類型:一些頻繁使用、需要特別對待的類型,也叫基本類型。這些簡單的、小的變量沒必要保存在內(nèi)存堆。Java采用C/C++方法,不用new創(chuàng)建變量,二是創(chuàng)建一個非句柄的“自動”變量。這些變量容納具體值,并保存在堆棧中,存取高效;
常用的主類型:boolean char byte short int long float double Void
需要注意的是:數(shù)值類型全部都是有符號的;主數(shù)據(jù)類型擁有自己的“封裝器”(wrapper)類。高精度計算:BigInteger和BigDecimal,兩者都沒有對應(yīng)“主類型”,需要通過方法調(diào)用。
單獨說一下數(shù)組,C和C++中數(shù)組就是實際的內(nèi)存塊,如果越界訪問或未初始化,會產(chǎn)生不可預(yù)測后果(C++優(yōu)先使用標(biāo)準(zhǔn)模板庫的容器)。Java推崇安全性的設(shè)計目標(biāo)——系統(tǒng)自動進行范圍檢查,缺點是會造成少量內(nèi)存開銷。創(chuàng)建對象數(shù)組,實際創(chuàng)建的是一個句柄數(shù)組,每個句柄初始化成特殊值null,Java強制要求在使用前句柄指向一個對象。
4.作用域和存在時間
例子:
{
int x = 12;
/* only x available */
{
int q = 96;
/* both x & q available */
}
/* only x available */
/* q “out of scope” */
}
作為在作用域里定義的變量,只有在作用域結(jié)束之前才能使用。
Java對象的存活時間不同于主類型。new創(chuàng)建的Java對象,存活周期會超過作用域的范圍。
{
String s = new String("a string")
}/*作用域的終點*/
句柄s會在作用域終點處消失,而s指向的對象依然占據(jù)內(nèi)存,只要你愿意,甚至可以一直保留下去。好任性的說,因為Java的內(nèi)存垃圾收集器特性,避免了C++程序員忘記釋放內(nèi)存導(dǎo)致的“溢出問題”。
5.類、成員和方法
關(guān)鍵字class定義一個類,類的基本元素:類成員和類方法。
類成員是一種對象(通過句柄與其通信),類成員可以是任何類型,或者是主類型,或者是指向?qū)ο蟮木浔H绻菍ο缶浔仨毷褂?strong>“構(gòu)建器”初始化;而如果是主類型,可直接在定義位置初始化;
類方法的基本形式:
返回類型 方法名(/* 自變量列表 */) {/* 方法主體 */}
自變量列表規(guī)定了傳送給類方法的信息,這些信息采用對象的形式,實際傳遞的是對象“句柄”。主數(shù)據(jù)類型是例外。
若返回類型是void,則關(guān)鍵字return的唯一作用是退出方法。所以一旦到達方法末尾,該關(guān)鍵字可不需要。
6.Java程序構(gòu)建
名字可見性:C++引入“命名空間”概念,Java設(shè)計者鼓勵程序員使用自己的Internet域名作為命名空間(域名很難重復(fù))。java這種機制保證所有文件自動保存在自己的命名空間,而且每個類自動獲得唯一的標(biāo)識符(現(xiàn)在可以理解Eclipse打開類名時出現(xiàn)的一長串字母的含義了),語言已經(jīng)幫你搞定命名重復(fù)問題。
如果在自己的程序里使用一個預(yù)定義好的類,編譯器如何找到它?一種情況是那個類就定義在當(dāng)前源文件中,只需直接引用即可,不用擔(dān)心“向前引用”問題,即使它直到文件后面才定義。Java語言又幫你消除一個限制。另一種情況是(大部分情況)采用標(biāo)準(zhǔn)Java庫的組件 ,他們與編譯器配套:
import java.util.*; //使用* 通配符,可以不必要明確聲明那個具體庫
static關(guān)鍵字:如果設(shè)置了static關(guān)鍵字,數(shù)據(jù)或方法就不會同那個類的任何對象實例聯(lián)系到一起。即使從未創(chuàng)建那個類對象,但仍能調(diào)用static方法或訪問static數(shù)據(jù)。static的重要用途是確保在不創(chuàng)建對象的前提下調(diào)用類方法,特別是在定義程序運行入口方法main()的時候。
7.開始第一個Java程序
//:Property.java
import java.util.*;
/** The first Thinking in Java example program
* Lists system information on current machine.
* @author Bruce Eckel
* @author http://www.BruceEckel.com
* @version v1.0
*/
public class Property{
/** Sole entry point to class & application
* @param args array of string argus
* @return No return value
* @exception exceptions No exceptions thrown
*/
public static void main(String[] args){
System.out.println(new Date());
/**
* using Properties class in main function
*/
Properties p = System.getProperties();
p.list(System.out);
System.out.println("---Memory Usage:");
Runtime rt = Runtime.getRuntime();
System.out.println("Total Memory = "
+ rt.totalMemory()
+ " Free Memory = "
+ rt.freeMemory());
try{
Thread.currentThread().sleep(5*1000);
} catch(InterruptedException e){}
}
} ///:end
需要注意的是:
(1)程序開頭必須導(dǎo)入文件代碼里用到的類(import),類庫java.lang會自動導(dǎo)入。在網(wǎng)上http://tool.oschina.net/apidocs/apidoc?api=jdk_7u4 可以查找java API.
(2)如果是創(chuàng)建獨立程序,文件中必須存在一個類與文件同名,而且類里必須包含一個名為main()的方法,形式如下:
public static void main(String[] args) //注意使用static修飾,自變量args不會在本程序用到,但必須列出,該變量保存了命令后調(diào)用的自變量。
(3)javadoc命令可以提取注釋到html文件,具體參見http://www.cnblogs.com/bluestorm/archive/2012/10/04/2711329.html
(4)一個非正式的Java編程標(biāo)準(zhǔn):大寫類名的首字母,如果類名由幾個單詞組成,不能使用下劃線,且每個單詞首字母大寫。例如:
class AllTheColorsOfTheRainbow {
int anIntegerRepresentingColors;
void changeTheHueOfTheColor(int newHue) {
// ...
}
// ...
}
總結(jié)
- 上一篇: Angular应用里的Template
- 下一篇: 哈啰打车推免佣、高额满单奖等车主激励举措