相比C++,Java是一種更純粹的面向對象語言,在Java中,(幾乎)一切都是對象。
1.1 建立對象
通過辨別符操縱對象,操縱的辨別符是對象的引用(reference)。類似于遙控器(引用)操作空調(對象)。
- 建立引用:
String s;
- 對引用初始化:
String s = "hello java";
- 通常用new操作符實作初始化:
String s = new String("hello java");
1.2 對象存儲在哪?
基本知識:計算機中有以下五個地方可以存資料
- 寄存器:
- 速度最快的存儲區。
- 位于cpu内部,數量極其有限。
- 寄存器會按需配置設定,你無法感覺。
- 棧:
- 速度非常快(僅次于寄存器)。
- 位于RAM内部。
- 通常存儲Java對象的引用。
- 堆:
- 通用的記憶體池,也位于RAM中。
- 通常用于存儲Java對象。
- 好處:編譯器無需知道存儲的資料在堆裡存儲了多久,是以配置設定存儲比較靈活。
- 非RAM區:
- 存活于程式之外,程式沒有運作時也可以存在。
- 如:流對象和持久化對象。
- 有時候(嵌入式系統中)常量可能會存儲到ROM區。
1.3 基本資料類型
基本資料類型需要被特殊對待。
- 通過上文可知,一般情況下Java通過new将對象存放在堆裡。
- 但是,用new建立一個特别小的,簡單的,常用的變量,放在堆裡就影響了程式的效率。
- 是以,對于這些基本的類型,可以不用new來建立,而是建立一個并非引用的“自動”變量,這些變量直接存儲值,并存放在棧中。
- 目的:提高程式的效率。
Java目前支援八種基本資料類型:
基本類型 | 大小 | 最小值 | 最大值 | 包裝類類型 |
---|---|---|---|---|
Boolean | Boolean | |||
char | 16-bit | Unicode 0 | Unicode 2^16-1 | Character |
byte | 8 bits | -128 | 127 | Byte |
short | 16 bits | -2^15 | 2^15-1 | Short |
int | 32bits | -2^31 | 2^31-1 | Integer |
long | 64 bits | -2^63 | 2^63-1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
void | Void |
注:
- boolean所占大小沒有明确指定。參考:(1)Oracle官方文檔(2)你真的知道boolean類型大小嗎
- byte即位元組。在java中,byte是作為最小的數字來處理的。
1.4 建立新的資料類型:類
- 建立類:
class People {
/* 類主體 */
}
- 建立對象:
- 字段,方法,參數(清單)和傳回值 略
- static關鍵字:友善在沒有建立對象的情況下來進行調用(方法/變量)。
- static修飾的方法 / 變量不需要依賴于對象來進行通路,隻要類被加載了,就可通過類名通路。
- static方法(靜态方法)不依賴于任何對象就可以進行通路,是以對于靜态方法是沒有this的,因為它不依附于任何對象。是以,在靜态方法中不能通路類的非靜态成員變量和非靜态成員方法,因為非靜态成員方法/變量都是必須依賴具體的對象才能夠被調用。
- static變量(靜态變量)與非靜态變量的差別:靜态變量被所有的對象所共享,在記憶體中隻有一個副本,它當且僅當在類初次加載時會被初始化;非靜态變量是對象所擁有的,在建立對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。
- static代碼塊。static塊可以置于類中的任何地方,類中可以有多個static塊。在類初次被加載的時候,會按照static塊的順序來執行每個static塊,并且隻會執行一次。
1.5 操作符
- 注意優先級。
- 簡化符号:
可以寫為x = x + 1;
x += 1;
- 自動遞增遞減:
和print(i++)
print(++i)
- ++在前,先自增再指派;
- ++在後,先指派再自增。
- 關系操作符:
- 基本資料類型的比較,使用
;==
- 引用類型的比較,使用
equals()
- 基本資料類型的比較,使用
- 按位操作符:
- 與
,或&
,取反|
,異或~
;^
- 與
- 移位操作符:
- 左移:
<<
- 有符号右移
, 符号為正,高位插0,符号為負,高位插1>>
- 無符号右移
,無論正負,高位插0>>>
- 左移:
1.6 控制程式執行流程
-
略if-else, while, do-while, for, foreach
- return:
- 指定方法傳回什麼
- 導緻目前方法退出,并傳回那個值
- break和continue:
- break表示退出目前循環,并且不執行循環剩下的所有語句(包括接下來所有未執行的循環)
- continue表示退出目前循環,但是傳回循環起始處執行下一次循環(如果存在)
1.7 初始化和清理
- 構造器
- 名稱與類同名(意味着首字母大寫)
- 建立對象時
,先為對象配置設定存儲空間,再調用構造器。=>確定了你在操作對象前,它就已經被初始化了new People()
- 構造器的重載(同名,但是參數清單不一樣)
- 對于有繼承關系的子父類程式的初始化順序:
- 1.父類【靜态成員】和【靜态代碼塊】,按在代碼中出現的順序依次執行。
- 2.子類【靜态成員】和【靜态代碼塊】,按在代碼中出現的順序依次執行。
- 3.父類的【普通成員變量被普通成員方法指派】和【普通代碼塊】,按在代碼中出現的順序依次執行。
- 4.執行父類的構造方法。
- 5.子類的【普通成員變量被普通成員方法指派】和【普通代碼塊】,按在代碼中出現的順序依次執行。
- 6.執行子類的構造方法。
- this關鍵字
- 隻能在方法内部使用,表示“調用該方法的那個對象”的引用
- 應用場景:需要明确指出目前對象的引用
public class Money { int i = ; Money increment() { i++; return this; // 傳回Moeny對象的引用 } void print() { Systemn.out.println("i = " + i); } public static void main(String[] args) { Money m = new Money(); m.increment().increment().increment().print(); } }
- 将目前對象傳遞給其他方法也很有用
- finalize()方法:
- finalize()是Object的protected方法,子類可以覆寫該方法以實作資源清理工作,GC在回收對象之前調用該方法。
- 一般不建議用finalize()完成“非記憶體資源”的清理工作,但建議用于:
- ① 清理本地對象(通過JNI建立的對象);
- ② 作為確定某些非記憶體資源(如Socket、檔案等)釋放的一個補充:在finalize方法中顯式調用其他資源釋放方法。