1_Java基本特性
最近打算跟著極客時間的《核心技術36講》擼一下程式碼,結果發現高估了自己,好像是不會寫Java程式碼捏。看《Thinking in Java》乖乖來做個基礎筆記。喵~
物件導論
這一章每次都會看,這次看發現原文寫的超好,翻譯也超棒~
哼哧做了個圖,怎麼做都覺得不好,湊合給自己看
這一部分主要是把面向物件的思路怎麼來,以及面向物件有什麼娓娓道來,撿看著特別有道理的話簡單列一下:
- 所有程式語言都是提供抽象機制,人們所能夠解決的問題的複雜性直接取決於抽象的型別和質量。
- 面向物件提供的是表示問題空間中的元素的工具,這樣程式可以通過新增新的型別的物件使自身適用於某個特定的問題。
- 將物件看作“服務提供者”有助於將問題分解成物件的集合,還可以提高物件的內聚性。
- 在任何相互關係中,具有關係所設計的各方都遵守的邊界是十分重要的事情。訪問控制讓類的使用者更容易看到什麼是重要的東西。
- 程式碼複用是面向物件程式設計語言最了不起的優點之一。在建立新類的時候應該優先考慮組合而不是繼承。
- 物件這種觀念使得你可以通過概念將資料和功能封裝到一起,因為可以對問題空間的觀念給出恰當的表示,而不用受制於必須使用底層機器語言。
- 以相同的術語將解決方案轉換城問題是大有裨益的,因為不需要再問題描述和解決方案之間建立許多中間模型。
- 通過繼承而產生的型別等價性是理解面向物件程式設計方法內涵的重要門檻。
- 面向物件程式語言的編譯器使用後期繫結的概念來實現多型。
- 簡單來說,容器就是一個可以被操作,從而解決問題的序列。之所以單一容器無法滿足所有要求,有兩方面原因:不同容器提供了不同型別的介面和外部行為;不同容器對於某些操作具有不同的效率。
- 引數化型別(範型):編譯器可以自動定製作用於特定型別上的類。
- 動態記憶體分配的方式有這樣一個一般性的邏輯假設:物件趨向於變得複雜,所以查詢和釋放儲存空間的開銷不會對物件的建立造成重大沖擊。編譯器對建立在堆上的物件的生命週期一無所知。
- 大多數錯誤處理機制的主要問題在於,它們都依賴於程式元自身的警惕性,這種警惕性來源於一種共同的約定,而不是程式語言所強制的。Java內建了異常,強制必須使用。
一切都是物件
操縱物件的方法
不管看哪本講Java的書,大概都會有一個總結:Java使用引用,C++使用指標。
退一步來看其實就是C++和Java在記憶體分配上給程式設計師的許可權不同。
// C++
ClassA* a = new ClassA();
// Java
ClassA a = new ClassA();
Java中,物件的儲存空間釋放是不需要程式設計師來操作的,所以對於物件不怎麼需要我們操心的一種操縱方式就是遙控器。給一個遙控器(引用),只要握住遙控器就可以保持與電視機的連線,不管電視機在哪裡。C++中則是直接告訴你電視機在哪裡(還可以把電視機搬走丟掉呢~)。
儲存
儲存型別 | 特點 |
---|---|
暫存器 | 位於處理器內部,速度最快,但是小啊~按需分配,不能直接控制,C++中允許向編譯器建議暫存器的分配方式 |
堆疊 | 位於通用RAM中,通過堆疊指標可以從處理器獲得直接支援。移動指標進行建立和刪除。速度僅次於暫存器 |
堆 | 通用記憶體池,用於存放所有Java物件。編譯器不需要知道儲存的資料在堆裡存活多長時間,十分靈活~ |
常量儲存 | ROM中,常量不會被改變 |
非RAM儲存 | 活在程式之外的小淘氣,如流物件和持久化物件 |
特例:Java中基本型別不用new來建立,因為new建立的物件儲存在堆,基本型別都比較“小”。對於這些型別,Java採用和C++相同的方法,不用new來建立,而是建立一個並非是引用的“自動”變數,該變數直接儲存值,並置於堆疊中。
Java基本型別佔用的儲存空間不隨及其硬體框架的變化而變化,具有更好的可移植性:
基本型別 | 大小 | 預設值 | 包裝器型別 |
---|---|---|---|
boolean | - | false | Boolean |
char | 16bit | \u0000(null) | Character |
byte | 8bit | (byte)0 | Byte |
short | 16bit | (short)0 | Short |
int | 32bit | 0 | Integer |
long | 64bit | 0L | Long |
float | 32bit | 0.0f | Float |
double | 64bit | 0.0d | Double |
void | - | - | Void |
高精度數字:BigInteger和BigDecimal。
生命週期和作用域:
Java物件不具備和基本型別一樣的生命週期,使用new建立的Java物件可以存活於作用於之外。
類
型別關鍵字:class
欄位:資料成員,基本資料型別的成員即使沒有初始化也會獲得一個預設值。
方法:引數列表(引用)、返回值
名字可見性:使用域名生成包名避免重複。
使用其他構件:import。
牧羊人static
關鍵字
解決兩個需求:
- 不論建立多少物件(0個或多個),都可以值為某特定域分配單一儲存空間。
- 希望某個方法不與包含它的類的任何物件關聯在一起。
類資料
和類方法
表示資料和方法只是作為整個類,而不是類的某個特定物件而存在的。
咩~
Java程式
- 入口
public static void main(String[] args)
- 註釋和文件:javadoc可以提取註釋用於生成文件。
- 編譯執行:JDK
操作符
操作符接受一個或多個引數,並生成一個新值。操作符的優先順序決定了計算順序。
副作用:操作符改變了運算元自身的值的現場。
操作符 | 符號 | 含義說明 |
---|---|---|
賦值運算子 | = | 取其右邊的值(右值)複製給左邊(左值) |
算術操作符 | 加(+) 減(-) 除(/) 乘(*) 取模(%) | |
一元加減操作符 | 一元加號(+) 一元減號(-) | 一元減號用於轉變資料的符號,一元加號僅僅是講較小型別的運算元提升為int |
自動遞增和遞減 | ++ – | 字首式:先執行計算,再生成變數值。字尾式:先生成值,再執行運算。 |
關係操作符 | < > <= >= == != | 進行比較,等於和不等於適用於所有的基本資料型別,其他比較夫不適用於Boolean型別 |
邏輯操作符 | 與(&&) 或( | |
直接常量 | 十六進位制0x字首 八進位制字首0 指數記數e 浮點數f 長整型L | 在含糊不清的時候需要使用這些來明確含義 |
按位操作符 | 與(&) 或( | ) 非(~) 異或(^) |
移位操作符 | 左移(<<) 右移(>>) 無符號右移位操作符(>>>)(零擴充套件) | 移位可與等號組合使用對byte或short移位時會先轉型再右移再賦值 |
三元操作符 | if-else | |
字串操作符 | + += | 不需要進行字串的“運算子過載” |
型別轉換
窄化轉換 narrowing conversion:大轉小,需要顯示進行型別轉換
擴充套件轉換widening conversion:小轉大
將float或double轉成整型時預設使用截尾,要使用舍入,需要呼叫Math.round() 。
控制執行流程
條件語句都利用條件表示式的true或false來絕地個執行路徑。
- 基本控制流:if-else
- 迭代:while、do-while、for
- Foreach
- 無條件分支:return、break、continue
- 選擇語句:switch
總結
這裡大概過了一下程式語言的基本特性:運算、操作符優先順序、控制流等。果然是看完第一章的總結的時候激情澎湃,一會兒就被這些小細節的地方磨得沒勁兒了。其實好像會C++也是不必看的,就是心虛的不知道自己到底會不會,好在,看完啦啦啦啦啦~