日积跬步02
重要思想繼續:
1.對象的創建和存在時間:對象需要的數據位于哪兒?如何控制對象的“存在時間”呢?
方法一,C++認為程序的執行效率是最重要的,所以允許程序員為獲得最快的運行速度,自行決定存儲以及存在時間——只需將對象放置在堆?;蛘哽o態存儲區域,同時犧牲靈活性,因為在編寫程序時必須準確知道對象數量、存在時間以及類型。
方法二,在內存池中動態創建對象,給內存池叫“堆”或“內存堆”。采用這種方式,除非進入運行期,否則根本不知道實際需要多少個對象,也不知道存在時間以及準確類型。由于動態創建方法使對象本來就傾向于復雜,所以查找存儲空間以及釋放它所需的額外開銷不會為對象的創建造成明顯的影響。
如果在堆?;蛘哽o態存儲空間里創建一個對象,編譯器會判斷對象的持續時間有多長,到時會自動“破壞”或者“清除”它。程序員用兩種方法破壞對象:一是用程序化的方式消除對象,二是利用運行環境提供的“垃圾收集器”特性,垃圾收集器會自動尋找不再使用的對象并消除,但會額外帶來開銷。這并不符合C++的語言宗旨,C++嚴格要求使用完對象必須及時釋放。而Java提供了垃圾收集器設計。
2.違例控制:這里的“違例”(Exception)屬于一個特殊對象,它會從產生錯誤的地方“扔”出來 ,隨后這個違例會被“違例控制器”捕獲,甚至會有多個違例控制器并行捕獲對應違例對象。這種設計理念是在不干擾常規代碼執行的情況下,獨立處置違例錯誤,最后利用違例從糟糕的環境中恢復,程序不用退出就能恢復執行。
3.多線程:Java的多線程機制已經內建到語言中,簡化了復雜的多線程。Java對多線程處理的支持是在對象一級的,所以一個執行線程可表達為一個對象,Java也提供有限的資源鎖定方案,它能鎖定任何對象占用的內存,即同一時間只能有一個線程使用特定的內存空間。關鍵字synchronized。
4. java客戶端程序、java服務器端程序。。。。
==============================================================================================
“磨刀不誤砍柴工”,學習java基本組件:
Chapter2 一切都是對象
1. 一切都是對象,然而操縱標識符實際是指向一個對象的“句柄”,(有參考書的說法是“引用”,甚至“指針”等)。String s; 這里創建的是句柄,而不是對象;始終堅持一個原則:創建句柄時,無論如何必須初始化。
String s = "asdf"; 可以解釋為String是一種特殊類型——字串可用加引號的文字初始化。更通用的初始化方法:
String s = new String("asdf");
2.程序運行時,數據保存在什么地方?(非常喜歡作者能一直關注到代碼運行內存保存情況,這是一程序員應該考慮的事情,而不是一個拼湊代碼的碼農care的)
一般來說,有6個地方可以保存數據:
(1)寄存器:速度最快的保存區域,然而寄存器數量有限,由編譯器根據需要分配,對程序員來所透明;
(2)堆棧:常規RAM(隨機訪存)區域,特點是特別快速、特別有效,指針上下移動即可完成內存創建、刪除;Java編譯器必須明確所保存數據的長度、以及存在時間,這會限制程序的靈活性。一般對象句柄保存在堆棧,而java對象不保存在堆棧;
(3)堆:一種常規用途的內存池(RAM區域),其中保存Java對象?!皟却娑选保℉eap)最大亮點是編譯器不必知道需要從堆里分配多少空間,也不必知道存儲的數據在堆停留多長時間;靈活性的代價是堆里分配空間會花掉較長時間;
(4)靜態存儲:“靜態”static是指“位于固定位置”,靜態存儲的數據隨時等候調用,關鍵字static指定。可以理解保存在RAM的中的靜態區域;
(5)常數存儲:可直接置于程序代碼內部,也可保存在ROM;
(6)非RAM存儲:數據完全獨立一個程序之外,程序運行時仍可存在?!傲魇綄ο蟆焙汀肮潭▽ο蟆薄?/p>
3. Primitive 類型:一些頻繁使用、需要特別對待的類型,也叫基本類型。這些簡單的、小的變量沒必要保存在內存堆。Java采用C/C++方法,不用new創建變量,二是創建一個非句柄的“自動”變量。這些變量容納具體值,并保存在堆棧中,存取高效;
常用的主類型:boolean char byte short int long float double Void
需要注意的是:數值類型全部都是有符號的;主數據類型擁有自己的“封裝器”(wrapper)類。高精度計算:BigInteger和BigDecimal,兩者都沒有對應“主類型”,需要通過方法調用。
單獨說一下數組,C和C++中數組就是實際的內存塊,如果越界訪問或未初始化,會產生不可預測后果(C++優先使用標準模板庫的容器)。Java推崇安全性的設計目標——系統自動進行范圍檢查,缺點是會造成少量內存開銷。創建對象數組,實際創建的是一個句柄數組,每個句柄初始化成特殊值null,Java強制要求在使用前句柄指向一個對象。
4.作用域和存在時間
例子:
 {
  int x = 12;
  /* only x available */
   {
     int q = 96;
     /* both x & q available */
    }
  /* only x available */
  /* q “out of scope” */
 }
作為在作用域里定義的變量,只有在作用域結束之前才能使用。
Java對象的存活時間不同于主類型。new創建的Java對象,存活周期會超過作用域的范圍。
{
String s = new String("a string")
}/*作用域的終點*/
句柄s會在作用域終點處消失,而s指向的對象依然占據內存,只要你愿意,甚至可以一直保留下去。好任性的說,因為Java的內存垃圾收集器特性,避免了C++程序員忘記釋放內存導致的“溢出問題”。
5.類、成員和方法
關鍵字class定義一個類,類的基本元素:類成員和類方法。
類成員是一種對象(通過句柄與其通信),類成員可以是任何類型,或者是主類型,或者是指向對象的句柄。如果是對象句柄,必須使用“構建器”初始化;而如果是主類型,可直接在定義位置初始化;
類方法的基本形式:
返回類型 方法名(/* 自變量列表 */) {/* 方法主體 */}
自變量列表規定了傳送給類方法的信息,這些信息采用對象的形式,實際傳遞的是對象“句柄”。主數據類型是例外。
若返回類型是void,則關鍵字return的唯一作用是退出方法。所以一旦到達方法末尾,該關鍵字可不需要。
6.Java程序構建
名字可見性:C++引入“命名空間”概念,Java設計者鼓勵程序員使用自己的Internet域名作為命名空間(域名很難重復)。java這種機制保證所有文件自動保存在自己的命名空間,而且每個類自動獲得唯一的標識符(現在可以理解Eclipse打開類名時出現的一長串字母的含義了),語言已經幫你搞定命名重復問題。
如果在自己的程序里使用一個預定義好的類,編譯器如何找到它?一種情況是那個類就定義在當前源文件中,只需直接引用即可,不用擔心“向前引用”問題,即使它直到文件后面才定義。Java語言又幫你消除一個限制。另一種情況是(大部分情況)采用標準Java庫的組件 ,他們與編譯器配套:
import java.util.*; //使用* 通配符,可以不必要明確聲明那個具體庫
static關鍵字:如果設置了static關鍵字,數據或方法就不會同那個類的任何對象實例聯系到一起。即使從未創建那個類對象,但仍能調用static方法或訪問static數據。static的重要用途是確保在不創建對象的前提下調用類方法,特別是在定義程序運行入口方法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)程序開頭必須導入文件代碼里用到的類(import),類庫java.lang會自動導入。在網上http://tool.oschina.net/apidocs/apidoc?api=jdk_7u4 可以查找java API.
(2)如果是創建獨立程序,文件中必須存在一個類與文件同名,而且類里必須包含一個名為main()的方法,形式如下:
public static void main(String[] args) //注意使用static修飾,自變量args不會在本程序用到,但必須列出,該變量保存了命令后調用的自變量。
(3)javadoc命令可以提取注釋到html文件,具體參見http://www.cnblogs.com/bluestorm/archive/2012/10/04/2711329.html
(4)一個非正式的Java編程標準:大寫類名的首字母,如果類名由幾個單詞組成,不能使用下劃線,且每個單詞首字母大寫。例如:
class AllTheColorsOfTheRainbow {
int anIntegerRepresentingColors;
void changeTheHueOfTheColor(int newHue) {
// ...
}
// ...
}
總結
 
                            
                        - 上一篇: Angular应用里的Template
- 下一篇: Angular应用里的@Input和@O
