作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/
初步:
1.傳統的面向過程的結構化開發方法 Vs 以對象為最小系統的物件導向的開發方法
2.物件模型:
1)自底向上的抽象:抽象三層次
把問題領域中的事物抽象為具有特定屬性和行為的對象。
把具有相同屬性和行為的對象抽象為類
若多個類之間存在一些共性(具有相同的屬性和行為),把這些共性抽象到父類中。
注意在Java中抽象有兩種意思:
a.作為動詞,指的是上述思維過程。
b.作為形容詞,可以用來abstract修飾類和方法。abstract修飾方法時表明這個方法沒有具體的實現,僅僅描述類具有的功能。abstract修飾類時表明表明這個類不能被執行個體化
2)自頂向下的分解:
一個電腦系統->主機、顯示器、鍵盤、滑鼠
|
分為處理器、記憶體
物件導向亦支援自頂向下。
3.物件導向的相關理念
1)萬物皆為對象。
2)每個對象都是唯一的,世界上沒有完全相同的兩片樹葉,在JVM中,保證對象的唯一性是在記憶體中分配唯一的地址。
3)對象具有屬性和行為。
4)對象具有狀態,也就是說某個瞬間對象的各個屬性都有取值。
5)對象都屬於某一個類,類是具有相同屬性和行為的對象的集合。同一類的所有執行個體具有相同的屬性,但其取值不一定相同,類的所有執行個體具有相同行為,父類和子類之間的實力則可能採用不同的方式來實現相同的功能。建立對象時,JVM將類載入記憶體,然後以其為模板進行對象的構建。
6)每個對象都具有特定的功能,相對於其他對象而言,它的功能就是為其他對象提供服務。而服務的提供則是通過方法實現的。
7)介面是一個抽象的概念,指系統對外提供的所有服務,描述了系統能提供哪些服務,但是不包含服務的實現細節。利用介面提高了子系統之間松耦合性。某個子系統內部的實現發生了改變,但是只要介面不變,就不會影響到主機子系統。在Java中,介面有兩個意思:a.對象中表現為public類型的方法,在外可以被調用。b.用interface關鍵字定義的實實在在的介面,它用於明確地描述系統對外提供的所有服務。
8)物件導向編程對於封裝的實現主要是通過存取控制機制來進行封裝的,這種機制能控制對象的屬性和方法的存取權限。封裝的原則:a.把儘可能多的東西藏起來,對外提供簡捷的介面。b.把所有屬性藏起來,必要的設定和讀取用getter和setter
9)繼承中,父類用Private修飾的屬性和方法對子類的透明。
10)多態是指當系統A訪問系統B的服務時,系統B可以通過多種實現方式來提供服務,而A全然不知。
11)動態綁定是指JVM在運行時根據引用對象的不同Binder 方法實現多態。
UML建模語言初步
1.UML採用一些標準圖形元素來直觀的表示物件模型,是一種可視化的物件導向的建模語言。
2.框圖初步:
使用案例圖、類框圖、元件圖表和部署圖4個圖形構成了系統的靜態模型,而狀態轉換圖,時序圖和共同作業圖表則構成了系統的動態模型。因此,UML的主要框圖也可以歸納為靜態模型和動態模型兩大類。
a.使用案例圖
描述了系統提供的功能,協助團隊明確系統的動能需求。包含內容:
角色:使用系統特定功能的使用者。用人形符號表示。角色與用例是使用的關係。
用例:表示某個功能。用橢圓符號表示。用例之間是包含和擴充的關係。用例的細節和處理流程以文檔的形式來描述,具體內容見書P25。
b.類框圖
顯示了系統的靜止結構,包括類(矩形表示,上層為類名,中層為屬性,下層為行為方法,抽象類別和方法都用斜體表示)和類之間的關係。
c.時序圖
顯示用例的詳細流程,有兩個維度:
水平維度:顯示對象之間發送訊息的過程。
垂直維度:顯示發送訊息的時間順序。
d.共同作業圖表
與時序圖包含的資訊相同。兩者的區別是共同作業圖表不參照時間,直接顯示對象與角色之間的交換過程。
e.狀態轉換圖
對於狀態轉換比較複雜的對象,才有必要用此來描述。狀態轉換圖的基本元素有初始點、狀態之間的轉移,狀態、終止點。
f.元件圖表
顯示系統中組建之間的依賴關係,以及和其他第三方組建(例如類庫)的依賴關係,還可以顯示原始碼檔案的物理組織圖。這裡的組件也就是指軟體系統中的每個子系統。
g.部署圖
表示軟體系統如何部署到硬體環境中,能夠展示系統中的組件在硬體環境中的物理布局。
3.類之間的關係:
a.關聯:類之間的特定對應關係。一般的,類A中有定義類型為類B的屬性。
b.依賴:類之間的調用關係。類A要訪問類B的屬性和方法,或類A負責執行個體化B,則稱類A依賴於B.
c.聚集:整體和部分的關係。分為普通聚集關係(比如檯燈和燈泡之間可以將燈泡卸下)和強聚集關係(整合音效卡和主板間的關係,無法拆卸),前者帶有set方法,而後者則無set方法。與關聯的區別在於整體對象會制約它的組成對象的生命週期。
d.泛化:類之間的整合關係。
e.實現:類實現介面的關係。
4.使用UML簡介
得出UML框圖後可以從被依賴的組件開始編程,注意使用一些設計模式。
語言初步
1.每個源檔案中包含內容:
零個或一個包聲明、零個或多個包引入、零個或多個類聲明、零個或多個介面聲明。至多隻有一個類或者介面是public的,而且源檔案必須以其中public類型的類的名字命名。
1)包聲明語句:
用於把該源檔案中的類和介面放在特定的包中,一個源檔案中只能有一個package語句,也可以省略表示為在預設包,該包沒有名字。這就意味著在該源檔案中定義的包和介面都在同一個包中。package語句必須放在源檔案第一行。例如:package com.abc.dollapp
包的作用:
a.區分名字相同的類。b.實施存取控制。c.劃分和組織Java應用中的各種類。
包的命名規範:
a.一般採用小寫。
b.包含建立者、所屬項目名稱、處於項目所處的哪些位置等資訊。
c.一般採用URL命名規範的反轉,例如,類名com.abc.netstore.common,SysContent,這意味著SysContent類由abc公司開發,屬於netstore項目,位於netstore.common中。
d.Java不強制要求包名。
2)包引入語句:
使用其他包中的類和介面。注意import語句不會意味著JVM會把所有的類和介面載入到記憶體中並對它們初始化。
注意:若同時引用了兩個來自不同包的同名類,那麼必須通過完成類名來區分。
3)方法聲明:
傳回值類型 方法名 (參數列表){
方法主體
}
4)main()方法:
public static void main (String[] args),其實public和static的位置可以調換,由於用static修飾的方法預設都是final(不能被子類覆蓋),所以加上final也沒事。
類中可以通過重載的方法提供多個不作為的應用程式入口的main方法。
5)注釋:
注意/** ... */出現在任何聲明之前都會被視為JavaDoc。
6)關鍵字:
注意friendly和sizeof不是Java關鍵字,這與c++不一樣。
7)標識符:
a.首字母必須是字母、底線、貨幣符號、人民幣符號。其中不能包含-、#等字元。
b.沒有長度限制,但是大小寫敏感。
c.官方的命名規範有
類名和介面名:首字母大寫,若多個單詞拼成則每個單字首大寫。
方法和變數名:首字母小寫,若多個單詞拼成則除第一個單詞外的其他單字首大寫。
包名:小寫。注意源檔案的位置,比如若使用預設包,則Doll.java在根目錄下,若類名為com.abc.dollapp.doll.Doll,則源檔案Doll.java要在/com/abc/dollapp/doll目錄下。
常量名:大寫形式,多個單詞用底線隔開。
2.編譯Java源檔案
javac [options] [sourcefiles]
常用選項:
-classpath 路徑 ——覆蓋classpath環境變數,是指定class類的路徑
-sourcepath 路徑 ——指定Java源檔案的路徑,指定類的源檔案的路徑
-d 目錄 ——指定目錄
-verbose ——輸出詳細編譯器資訊
3.運行Java程式
java someClass
常用選項:
-classpath 路徑 ——覆蓋classpath環境變數,是指定class類的路徑,對於Java類則設定根目錄
-verbose ——輸出詳細編譯器資訊
-D<屬性名稱=屬性值> ——設定系統屬性,例如:java -DUser="tom" SomeClass,則SomeClass中調用的System.getProperty("user")則得到tom
-jar 指定運行某個Jar檔案中的特定Java類,對於Jar包指定全路徑
使用注意:
a.必須指定主程式類的完整名字,例如,
b.在classpath中,類檔案的存放位置必須和包名匹配。
4.JavaDoc的使用
JavaDoc有一系列的標誌
javadoc 標記有如下一些:
標記 用於 作用
@author 對類的說明 標明開發該類別模組的作者
@since 對類、屬性、方法的說明 指定最早出現的版本
@version 對類的說明 標明該類別模組的版本
@see 對類、屬性、方法的說明 參考轉向,也就是相關主題,用於產生連結
@link 對類、屬性、方法的說明 與@see一樣,但是其能嵌入到備註陳述式中
@param 對方法的說明 對方法中某參數的說明
@return 對方法的說明 對方法傳回值的說明
@exception 對方法的說明 對方法可能拋出的異常進行說明
@deprecated 對類、屬性、方法的說明 表示已經不推薦使用
5.JVM簡介
運行程式的步驟:
1)把.class檔案中的位元據載入到記憶體中。
2)對類的位元據進行驗證
3)解析並執行指令
運行時資料區:
堆區——存放對象的一個指向方法區的引用
方法區——存放類的類型資訊、類型資訊包括靜態變數和方法資訊,而方法資訊中包含類的所有方法的位元組碼。
棧區——局部變數(指向堆區),主方法的調用
例如:Doll beibei = new Doll("貝貝");
其中beibei在棧區,指向一個名字為“貝貝”的Doll執行個體(在堆區),而Doll執行個體含有的方法則指向方法區。
操作符簡介
1.注意"=" "==" "!="還能操作各種參考型別。而"+"除了可以操作包含Boolean類型以外的基礎資料型別 (Elementary Data Type)外,還可以操作string類型。
2.多數操作符都是從左至右運算的,但是賦值操作是從右至左。
3.整型操作符在計算運算式時,若一個操作元是long,那麼結果也是long,否則不管操作元是byte還是short、char,運算結果都是int。
4.算術右移位操作符>>
符號位是0的左端就補零(正數),否則補一。a>>b等價於(a/2)^(b%32).
5.邏輯右移位操作符>>>
左端都是加0.
6.左移操作符<<
右端加0.
7.短路操作符
&&和||都是短路操作符,而&和|是非短路操作符。也就是說前者只需能根據操作符左邊的運算式推出整個運算式的布爾值,而後者只能全部計算出來。
8.!為一元操作符,只能用於Boolean運算式。
9.使用+時,若一個操作元是string,而另一個操作元是參考型別,則調用引用對象的toString()方法獲得字串。
10.兩邊都是參考型別時,==只在兩個參考型別引用的是同一個對象時結果為True。只有具有同種類型或有繼承關係時才可以比較,否則編譯出錯。
11.instanceof操作符
obj instanceof ClassName/Interface,當左邊為右邊的類、直接或間接父類、直接或間接實現的介面時返回為TRUE。
兩邊的操作元必須是同種類或有繼承關係的。數群組類型也可以使用instanceof進行比較。
12.類型強制轉換
從低位類型到高位類型會進行自動轉換,而從高位類型到低位類型需要進行強制類型的轉換。從double、float、long、int類型一直檢測,若最終沒有轉換為上述任何一種資料類型,則統一轉化為int。例如:
short a=1,b=1;
short c = a + b;//出錯,此時a+b的結果已經轉化為了int,可以將c變為int,或強制轉化為short。
又如:
int x=6;
double d=7.1;
System.out.println((x>d)?99.9:9);//輸出9.0,因為9已經被轉化為了double。
直接數在變數所屬類型的取值範圍之內,就允許自動轉換,但是對於變數給變數賦值則需要在適時的時候強制轉換類型。
參考型別的變數之間賦值時,子類給直接或間接父類賦值,會自動進行類型轉換,父類給直接或間接子類賦值,需要強行轉換類型。
流程式控制制
1.switch(expr)語句中,expr的類型必須是與int類型相容的基本類型,即包括byte、short、char、int。而case valueN中valueN也是這個要求,並且valueN必須為各不相同的常量。
2.Java中的迴圈支援標號,例如:
outer:
for (;;)
{
inner:
for (;;)
{
xxxx;
xxxxx;
continue inner;
}
break outer;
}
作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/