1.System.exit(int status):main方法正常退出時(shí),程序的退出代碼為0(通常都不寫這句,默認(rèn)的),表示成功運(yùn)行了程序,若要返回其他退出代碼,使用System.exit方法。System.exit方法的作用是中斷虛擬機(jī)運(yùn)行,使程序結(jié)束運(yùn)行。return的作用是退出本方法,返回上一層(調(diào)用者)
2.三種注釋。注釋不會(huì)出現(xiàn)在可執(zhí)行程序中,只是在源碼中,是給人看的
? ? ? ? ? ? a). //?
? ? ? ? ? ? b). /*? ?*/
? ? ? ? ? ? c). /**? ? */可以用來自動(dòng)生成注釋文檔
3.強(qiáng)類型:一個(gè)變量在確定了其數(shù)據(jù)類型后,其數(shù)據(jù)類型就固定了不會(huì)變,除非進(jìn)行強(qiáng)制類型轉(zhuǎn)換操作
? ?弱類型:數(shù)據(jù)類型區(qū)分沒強(qiáng)類型那么嚴(yán)格,如String a=1,在運(yùn)算操作時(shí),a可以是字符串1,也可以是數(shù)字1,而不需要強(qiáng)制類型轉(zhuǎn)換就可以直接參與運(yùn)算。
4.動(dòng)態(tài)語言:數(shù)據(jù)類型是在運(yùn)行時(shí)確定的。
? ?靜態(tài)語言:數(shù)據(jù)類型是在編譯時(shí)確定的。詳細(xì)解釋
5.數(shù)據(jù)類型:8種基本數(shù)據(jù)類型,byte(1),short(2),int(4,整形默認(rèn)),long(8);float(4),double(8,浮點(diǎn)型默認(rèn),浮點(diǎn)數(shù)是不準(zhǔn)確的,精度問題需要特別注意,2.0-1.1并不等于理想中的0.9);char(2或4);boolean(1或4)
boolean(1或4)的理由來源是《Java虛擬機(jī)規(guī)范》一書中的描述:“雖然定義了boolean這種數(shù)據(jù)類型,但是只對(duì)它提供了非常有限的支持。在Java虛擬機(jī)中沒有任何供boolean值專用的字節(jié)碼指令,Java語言表達(dá)式所操作的boolean值,在編譯之后都使用Java虛擬機(jī)中的int數(shù)據(jù)類型來代替,而boolean數(shù)組將會(huì)被編碼成Java虛擬機(jī)的byte數(shù)組,每個(gè)元素boolean元素占8位”。這樣我們可以得出boolean類型占了單獨(dú)使用是4個(gè)字節(jié),在數(shù)組中又是1個(gè)字節(jié)。那虛擬機(jī)為什么要用int來代替boolean呢?為什么不用byte或short,這樣不是更節(jié)省內(nèi)存空間嗎。大多數(shù)人都會(huì)很自然的這樣去想,我同樣也有這個(gè)疑問,經(jīng)過查閱資料發(fā)現(xiàn),使用int的原因是,對(duì)于當(dāng)下32位的處理器(CPU)來說,一次處理數(shù)據(jù)是32位(這里不是指的是32/64位系統(tǒng),而是指CPU硬件層面),具有高效存取的特點(diǎn)。
6.特殊值:正無窮大,負(fù)無窮大,NaN(判斷x是否為NaN,Double.isNaN(x))
int.class == Integer.TYPE//true
int.class == Integer.class//false
基本類型的包裝類都有三個(gè)靜態(tài)變量BYTES、SIZE、TYPE用來表示對(duì)應(yīng)的基本類型存儲(chǔ)所用的字節(jié)數(shù),位數(shù)和class對(duì)象(Boolean只有TYPE,沒有BYTES和SIZE,因?yàn)閖ava規(guī)范沒具體指明boolean需要占據(jù)幾個(gè)字節(jié),單獨(dú)使用時(shí)占據(jù)4個(gè),boolean數(shù)組則每個(gè)boolean元素占據(jù)1個(gè))
Character類的charCount方法用來判斷一個(gè)給定的代碼點(diǎn)對(duì)應(yīng)的字符是哪種類型的,如果大于等于0x10000則返回2,小于則返回1。對(duì)于傳進(jìn)來的代碼點(diǎn)參數(shù)是否有效,該方法不進(jìn)行驗(yàn)證,需要調(diào)用者自己調(diào)用isValidCodePoint方法自行驗(yàn)證
bitCount方法統(tǒng)計(jì)數(shù)值二進(jìn)制形式中1的個(gè)數(shù)

unicode是字符集的名稱,utf-8/16/32等是具體的實(shí)現(xiàn)方法
7.char字符集和編碼方式:utf-16,代碼點(diǎn)(代碼值,類似于編號(hào))和代碼單元(2個(gè)字節(jié)大小,詳見卷一P36-37),每個(gè)字符都有唯一的一個(gè)代碼點(diǎn)(編號(hào)),用16位來表示一個(gè)代碼單元,基本的字符只需一個(gè)代碼單元,有的字符需要兩個(gè)代碼單元來表示,基本的字符并沒有把65536(2的16次方)個(gè)編號(hào)都用完,還剩下2048個(gè)編號(hào),這2048個(gè)編號(hào)分成兩份A(a1~a1024)和B(b1~b1024),每份1024個(gè)編號(hào),用兩個(gè)編號(hào)如a1b1來表示基本字符之外的那些字符,這樣有1024x1024種組合(如果采取排列的方法,應(yīng)該可以有A(2048,2)即2048x2047種組合,可以表示更多字符),然后根據(jù)有關(guān)的算法,每種組合表示一個(gè)代碼點(diǎn)。string.length()求的是代碼單元數(shù),string.codePointCount()求的是代碼點(diǎn)數(shù)(實(shí)際的字符數(shù))
8.類常量:static final修飾
for(;;)是一個(gè)死循環(huán),相當(dāng)于while(true)
9.運(yùn)算符:&&和||為“短路”方式的邏輯與和邏輯或;三元運(yùn)算符?:
當(dāng)&的兩個(gè)操作數(shù)不是boolean型變量時(shí),則進(jìn)行按位與運(yùn)算,同理|也是
<<,>>(高位填充符號(hào)位),>>>(高位填充0)
數(shù)值在計(jì)算機(jī)中是以補(bǔ)碼的形式存儲(chǔ)的
一. 機(jī)器數(shù)和真值
在學(xué)習(xí)原碼, 反碼和補(bǔ)碼之前, 需要先了解機(jī)器數(shù)和真值的概念.
1、機(jī)器數(shù)
一個(gè)數(shù)在計(jì)算機(jī)中的二進(jìn)制表示形式,? 叫做這個(gè)數(shù)的機(jī)器數(shù)。機(jī)器數(shù)是帶符號(hào)的,在計(jì)算機(jī)用一個(gè)數(shù)的最高位存放符號(hào), 正數(shù)為0, 負(fù)數(shù)為1.
比如,十進(jìn)制中的數(shù) +3 ,計(jì)算機(jī)字長為8位,轉(zhuǎn)換成二進(jìn)制就是00000011。如果是 -3 ,就是 10000011 。
那么,這里的 00000011 和 10000011 就是機(jī)器數(shù)。
2、真值
因?yàn)榈谝晃皇欠?hào)位,所以機(jī)器數(shù)的形式值就不等于真正的數(shù)值。例如上面的有符號(hào)數(shù) 10000011,其最高位1代表負(fù),其真正數(shù)值是 -3 而不是形式值131(10000011轉(zhuǎn)換成十進(jìn)制等于131)。所以,為區(qū)別起見,將帶符號(hào)位的機(jī)器數(shù)對(duì)應(yīng)的真正數(shù)值稱為機(jī)器數(shù)的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
二. 原碼, 反碼, 補(bǔ)碼的基礎(chǔ)概念和計(jì)算方法.
在探求為何機(jī)器要使用補(bǔ)碼之前, 讓我們先了解原碼, 反碼和補(bǔ)碼的概念.對(duì)于一個(gè)數(shù), 計(jì)算機(jī)要使用一定的編碼方式進(jìn)行存儲(chǔ). 原碼, 反碼, 補(bǔ)碼是機(jī)器存儲(chǔ)一個(gè)具體數(shù)字的編碼方式.
1. 原碼
原碼就是符號(hào)位加上真值的絕對(duì)值, 即用第一位表示符號(hào), 其余位表示值. 比如如果是8位二進(jìn)制:
[+1]原?= 0000 0001
[-1]原?= 1000 0001
第一位是符號(hào)位. 因?yàn)榈谝晃皇欠?hào)位, 所以8位二進(jìn)制數(shù)的取值范圍就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原碼是人腦最容易理解和計(jì)算的表示方式.
2. 反碼
反碼的表示方法是:
正數(shù)的反碼是其本身
負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上, 符號(hào)位不變,其余各個(gè)位取反.
[+1] = [00000001]原?= [00000001]反
[-1] = [10000001]原?= [11111110]反
可見如果一個(gè)反碼表示的是負(fù)數(shù), 人腦無法直觀的看出來它的數(shù)值. 通常要將其轉(zhuǎn)換成原碼再計(jì)算.
3. 補(bǔ)碼
補(bǔ)碼的表示方法是:
正數(shù)的補(bǔ)碼就是其本身
負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上, 符號(hào)位不變, 其余各位取反, 最后+1. (即在反碼的基礎(chǔ)上+1)
[+1] = [00000001]原?= [00000001]反?= [00000001]補(bǔ)
[-1] = [10000001]原?= [11111110]反?= [11111111]補(bǔ)
對(duì)于負(fù)數(shù), 補(bǔ)碼表示方式也是人腦無法直觀看出其數(shù)值的. 通常也需要轉(zhuǎn)換成原碼在計(jì)算其數(shù)值.
三. 為何要使用原碼, 反碼和補(bǔ)碼
在開始深入學(xué)習(xí)前, 我的學(xué)習(xí)建議是先"死記硬背"上面的原碼, 反碼和補(bǔ)碼的表示方式以及計(jì)算方法.
現(xiàn)在我們知道了計(jì)算機(jī)可以有三種編碼方式表示一個(gè)數(shù). 對(duì)于正數(shù)因?yàn)槿N編碼方式的結(jié)果都相同:
[+1] = [00000001]原?= [00000001]反?= [00000001]補(bǔ)
所以不需要過多解釋. 但是對(duì)于負(fù)數(shù):
[-1] = [10000001]原?= [11111110]反?= [11111111]補(bǔ)
可見原碼, 反碼和補(bǔ)碼是完全不同的. 既然原碼才是被人腦直接識(shí)別并用于計(jì)算表示方式, 為何還會(huì)有反碼和補(bǔ)碼呢?
首先, 因?yàn)槿四X可以知道第一位是符號(hào)位, 在計(jì)算的時(shí)候我們會(huì)根據(jù)符號(hào)位, 選擇對(duì)真值區(qū)域的加減. (真值的概念在本文最開頭). 但是對(duì)于計(jì)算機(jī), 加減乘數(shù)已經(jīng)是最基礎(chǔ)的運(yùn)算, 要設(shè)計(jì)的盡量簡單. 計(jì)算機(jī)辨別"符號(hào)位"顯然會(huì)讓計(jì)算機(jī)的基礎(chǔ)電路設(shè)計(jì)變得十分復(fù)雜! 于是人們想出了將符號(hào)位也參與運(yùn)算的方法. 我們知道, 根據(jù)運(yùn)算法則減去一個(gè)正數(shù)等于加上一個(gè)負(fù)數(shù), 即: 1-1 = 1 + (-1) = 0 , 所以機(jī)器可以只有加法而沒有減法, 這樣計(jì)算機(jī)運(yùn)算的設(shè)計(jì)就更簡單了.
于是人們開始探索 將符號(hào)位參與運(yùn)算, 并且只保留加法的方法. 首先來看原碼:
計(jì)算十進(jìn)制的表達(dá)式: 1-1=0
1 - 1 = 1 + (-1) = [00000001]原?+ [10000001]原?= [10000010]原?= -2
如果用原碼表示, 讓符號(hào)位也參與計(jì)算, 顯然對(duì)于減法來說, 結(jié)果是不正確的.這也就是為何計(jì)算機(jī)內(nèi)部不使用原碼表示一個(gè)數(shù).
為了解決原碼做減法的問題, 出現(xiàn)了反碼:
計(jì)算十進(jìn)制的表達(dá)式: 1-1=0
1 - 1 = 1 + (-1) = [0000 0001]原?+ [1000 0001]原= [0000 0001]反?+ [1111 1110]反?= [1111 1111]反?= [1000 0000]原?= -0
發(fā)現(xiàn)用反碼計(jì)算減法, 結(jié)果的真值部分是正確的. 而唯一的問題其實(shí)就出現(xiàn)在"0"這個(gè)特殊的數(shù)值上. 雖然人們理解上+0和-0是一樣的, 但是0帶符號(hào)是沒有任何意義的. 而且會(huì)有[0000 0000]原和[1000 0000]原兩個(gè)編碼表示0.
于是補(bǔ)碼的出現(xiàn), 解決了0的符號(hào)以及兩個(gè)編碼的問題:
1-1 = 1 + (-1) = [0000 0001]原?+ [1000 0001]原?= [0000 0001]補(bǔ)?+ [1111 1111]補(bǔ)?= [0000 0000]補(bǔ)=[0000 0000]原
這樣0用[0000 0000]表示, 而以前出現(xiàn)問題的-0則不存在了.而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原?+ [1111 1111]原?= [1111 1111]補(bǔ)?+ [1000 0001]補(bǔ)?= [1000 0000]補(bǔ)
-1-127的結(jié)果應(yīng)該是-128, 在用補(bǔ)碼運(yùn)算的結(jié)果中, [1000 0000]補(bǔ)?就是-128. 但是注意因?yàn)閷?shí)際上是使用以前的-0的補(bǔ)碼來表示-128, 所以-128并沒有原碼和反碼表示.(對(duì)-128的補(bǔ)碼表示[1000 0000]補(bǔ)算出來的原碼是[0000 0000]原, 這是不正確的)
使用補(bǔ)碼, 不僅僅修復(fù)了0的符號(hào)以及存在兩個(gè)編碼的問題, 而且還能夠多表示一個(gè)最低數(shù). 這就是為什么8位二進(jìn)制, 使用原碼或反碼表示的范圍為[-127, +127], 而使用補(bǔ)碼表示的范圍為[-128, 127].
因?yàn)闄C(jī)器使用補(bǔ)碼, 所以對(duì)于編程中常用到的32位int類型, 可以表示范圍是: [-231, 231-1] 因?yàn)榈谝晃槐硎镜氖欠?hào)位.而使用補(bǔ)碼表示時(shí)又可以多保存一個(gè)最小值.
10.Math類:Math.sqrt(x),Math.pow(x,a),Math.round(),Math.PI,Math.E,Math.random()返回一個(gè)[0,1)之間的浮點(diǎn)數(shù),更精確的還有StrictMath類
11.靜態(tài)導(dǎo)入:import static java.lang.Math.*,也可以靜態(tài)導(dǎo)入某一個(gè)特定的靜態(tài)數(shù)據(jù)域或靜態(tài)方法
12.數(shù)值類型轉(zhuǎn)換:不同類型的數(shù)值進(jìn)行運(yùn)算,會(huì)將操作數(shù)轉(zhuǎn)換成同一類型再進(jìn)行計(jì)算,
? ? ?轉(zhuǎn)換的優(yōu)先級(jí)為double>float>long>int
13.強(qiáng)制類型轉(zhuǎn)換
14運(yùn)算符優(yōu)先級(jí)和結(jié)合性:先看優(yōu)先級(jí),優(yōu)先級(jí)相同再看結(jié)合性,大多數(shù)為左結(jié)合,少數(shù)幾個(gè)為右結(jié)合,如賦值,三元運(yùn)算符,+=類和一元運(yùn)算符。三元運(yùn)算符前面的如果為真,后面的就不會(huì)執(zhí)行了
int a = 1,b = 2,s = 0;
s = a>0?100:b++;
System.out.println(s);//100
System.out.println(b);//2
a+=b+=c相當(dāng)于a+=(b+=c),
int a = 1,b = 2,c = 3;
a+=b+=c;
System.out.println(a);//6
a?b:c?d:e相當(dāng)于a?b:(c?d:e)//先執(zhí)行前面的
int a = 1,b = 2,s = 0;
s = a>0?b:++b>2?200:300;
System.out.println(s);//2
System.out.println(b);//2
15.枚舉類型:舉例如下
enum Size {S,M,L,XL}
Size s = Size.S;
16.字符串String。String類被final修飾,而且String對(duì)象所維護(hù)的值是不可變的,對(duì)于String s = "hello","hello"才是真正的對(duì)象,而且是不可變對(duì)象,s只不過是指向這個(gè)字符串常量的一個(gè)引用。
final修飾變量,如果是基本類型,則變量不能被從新賦值,而且值也不會(huì)變;如果是引用類型,則不能再引用(指向不能再改變)其他對(duì)象,但是指向的對(duì)象本身的內(nèi)容可以變(不可變類除外)。
final修飾方法,可以被繼承,但是不能被重寫
final修飾的類,不能被繼承,成員變量可以是final的,也可以不是,但成員方法自動(dòng)為final
不可變類:對(duì)象一旦被創(chuàng)建完成,對(duì)象的成員變量的值將不能被改變
?如果一個(gè)類要被聲明為static的,只有一種情況,就是靜態(tài)內(nèi)部類
17.String類的API
subString(m,n):包前不包后
equals():注意與==的區(qū)別,==比較的是內(nèi)存地址,即是否為同一個(gè)對(duì)象,String的equals方法已經(jīng)重寫過了,Object類的equals方法實(shí)際上就是==
equalsIgnoreCase()
compareTo()
endsWith(),startsWith()
toLowerCase(),toUpperCase()
length(),codePointCount()
trim(),replace(),format()
注意subString等方法和+產(chǎn)生的都是新的String對(duì)象
18.StringBuilder(StringBuffer效率比StringBuilder低,但是線程安全)append和toString方法
String根據(jù)字符串本身的內(nèi)容重寫了hashCode方法,StringBuilder和StringBuffer沒有,值為內(nèi)存地址(并非真的內(nèi)存地址,而是在虛擬機(jī)中的內(nèi)存地址)
19.標(biāo)準(zhǔn)輸入Scanner in = new Scanner(System.in);
String name = in.nextLine();//next line
String color = in.next();//next word
int age = in.nextInt();//next int
上面的輸入是可見的,如果讀取密碼的話,用下面的(只能在終端,不能使用IDE,否則會(huì)報(bào)空指針錯(cuò)誤,因?yàn)镮DE占用了console對(duì)象,console對(duì)象是單例對(duì)象)
Console cons = System.console();
String username = cons.readLine("User name: ");
char[] password = cons.readPassword("Password: ");//密碼使用數(shù)組存儲(chǔ),因?yàn)槭褂米址话踩?/b>
字符串放在常量池,存在的時(shí)間長,且不能被修改,使用完后不能馬上覆蓋掉(直到gc回收),使用完后,需要將數(shù)組的值覆蓋掉
20.局部變量初始化:不一定要在聲明的時(shí)候立刻初始化,如
? ? ?int a;
? ? ?a = 2;這是完全可以的
21.大數(shù)值:BigInteger(大整數(shù))和BigDecimal(大浮點(diǎn)數(shù))
? ? 大數(shù)值運(yùn)算不能使用+,-,*,/,%符號(hào),而是使用對(duì)應(yīng)的方法
add? ? subtract? ? multiply? ? divide? ? mod? ? compareTo? ? valueOf
22.數(shù)組
? ? int[] a = {1,2,3,4,5};
? ? int[] a = new int[] {1,2,3,4,5};
? ? new int[] {1,2,3,4,5};//創(chuàng)建匿名數(shù)組
????int[] a = new int[10];//數(shù)組長度可以是變量 int n = 10;int[] a = new int[n];
? ? 創(chuàng)建一個(gè)整數(shù)數(shù)組時(shí),所有元素初始化為0;boolean數(shù)組元素都為false;對(duì)象數(shù)組元素都為null
23.一些接口
? ? Formattable? ??
????Iterable
24.一些API
? ? Arrays.toString(a)//將數(shù)組a轉(zhuǎn)換成字符串(形如[1,2,3])
? ? Arrays.deepToString(a)//將二維數(shù)組轉(zhuǎn)換成字符串
? ? Arrays.copyOf(a,length)//將a數(shù)組的每個(gè)元素拷貝到長度為length的新數(shù)組,
????若length<a.length,則拷貝前面的;若length>a.length,則多余的用默認(rèn)值填充
? ? Arrays.sort(a)//使用快速排序法對(duì)數(shù)組進(jìn)行排序
? ? Arrays.binarySearch(a,b)//返回b在數(shù)組a中的索引值,若a中沒有b,則返回一個(gè)負(fù)數(shù)r,-r-1是保持a有序b應(yīng)該插入a中的位置
? ? Arrays.equals(a,b)//比較兩個(gè)數(shù)組是否相同,如果長度相同,且a[i]和b[i]相同,則返回true
? ? Random:
? ? nextInt(n):生成一個(gè)0~n-1的隨機(jī)數(shù)
25.for each
? ? for(type variable : collection) {...}//collection為數(shù)組或者實(shí)現(xiàn)了Iterable接口
? ? for(int x : a) {System.out.println(x);}
26.main方法的參數(shù)String[] args的意義
27.類之間的關(guān)系
? ? 依賴(uses-a):類A的方法操作類B的對(duì)象,A只是單純的new一個(gè)B的對(duì)象,然后調(diào)用對(duì)象的方法
? ? 聚合(has-a):類A的對(duì)象包含類B的對(duì)象,即A數(shù)據(jù)域是B類型的如兔子有腿
? ? 繼承(is-a):類A繼承于類B
28.有的類沒有數(shù)據(jù)域,只有方法域(如Math)
29.除了構(gòu)造方法和類同名,其他的方法也可以跟類的名字一樣
30.對(duì)象變量和對(duì)象:一個(gè)對(duì)象變量并不包含一個(gè)對(duì)象,它只是對(duì)象的引用,new操作符的返回值就是一個(gè)引用
31.Date和GregorianCalendar,前者表示的是一個(gè)時(shí)間點(diǎn)(距離1970年1月1日00:00:00的毫秒數(shù)),后者是日歷表示,是時(shí)間點(diǎn)的表示,同一個(gè)時(shí)間點(diǎn)表示形式有多種
GregorianCalendar月份從0開始計(jì)數(shù)
二者之間的轉(zhuǎn)換Date time,GregorianCalendar calendar;time = calendar.getTime(); calendar.setTime(time)
32.隱式參數(shù)this:類的方法(靜態(tài)方法除外)有個(gè)隱式(implicit含蓄的)this,指向調(diào)用該方法的對(duì)象本身
33.更改器方法的好處:封裝性,而且可以在修改前進(jìn)行錯(cuò)誤檢查
34.訪問器方法:在編寫訪問器的時(shí)候,如果訪問的字段是一個(gè)對(duì)象,那不應(yīng)該返回該對(duì)象的引用(根據(jù)實(shí)際情況決定),因?yàn)榉祷貙?duì)象的引用使得該對(duì)象可以被外面的程序修改,破壞了數(shù)據(jù)的私有性,而應(yīng)該先對(duì)該對(duì)象進(jìn)行克?。ㄉ羁寺。?,再返回克隆對(duì)象,當(dāng)然像String類型的不可變對(duì)象除外,因?yàn)镾tring對(duì)象不能被修改
35.一個(gè)方法可以訪問該方法所屬類的所有的對(duì)象的私有數(shù)據(jù),如
? ? class A {
? ? ? ? ?private String name;
?????????public boolean myEquals(A other) {
? ? ? ? ? ? ? ? ? ? return name.equals(other.name);
????????????????}
????}
當(dāng)執(zhí)行harry.equals(boss)的時(shí)候,equals方法不僅訪問了harry的name,還訪問了boss的name
36.final修飾數(shù)據(jù)域的時(shí)候,應(yīng)該用于基本類型(primitive)或不可變類(如String,String之所以是不可變類,不是因?yàn)橛嘘P(guān)鍵詞final修飾,而是String對(duì)象維護(hù)的值不可變,String對(duì)象維護(hù)著一個(gè)final修飾的char[]),對(duì)于可變的類會(huì)造成混亂。注意兩種變:對(duì)象變量所指向的對(duì)象發(fā)生改變(堆中的對(duì)象本身改變),對(duì)象變量的指向發(fā)生改變(對(duì)象變量本身的值變了),指向了其他的對(duì)象(詳見卷一p115)
37.靜態(tài)域(static修飾又稱類域),靜態(tài)常量(static final修飾),靜態(tài)方法(不能訪問自身類的非靜態(tài)屬性和非靜態(tài)方法,可以訪問自身類的靜態(tài)域和靜態(tài)方法)
38.java函數(shù)傳參總是按值調(diào)用,方法得到的是所有實(shí)參值的一個(gè)拷貝,并不能修改實(shí)參值(卷一p121)
39.構(gòu)造器沒有對(duì)類的數(shù)據(jù)域進(jìn)行初始化的話(不良的習(xí)慣),數(shù)據(jù)域會(huì)有默認(rèn)的初始化值,數(shù)值為0,布爾為false,對(duì)象引用為null,這是和局部變量的區(qū)別,局部變量必須明確的初始化
40.如果一個(gè)類沒有編寫構(gòu)造函數(shù),會(huì)自動(dòng)提供一個(gè)無參數(shù)的構(gòu)造函數(shù),所有的數(shù)據(jù)域會(huì)被默認(rèn)初始化;但是如果編寫了構(gòu)造函數(shù),那就不再自動(dòng)提供構(gòu)造函數(shù)
41.構(gòu)造函數(shù)的形參命名技巧:a.使用數(shù)據(jù)域一樣的名字,方法內(nèi)添加this區(qū)分;b.數(shù)據(jù)域的名字+前綴a,如數(shù)據(jù)域?yàn)閚ame,形參就用aName
42.構(gòu)造器中調(diào)用另一個(gè)構(gòu)造器:在一個(gè)構(gòu)造器中使用this(...)的形式調(diào)用另一個(gè)構(gòu)造器(必須放在第一句)
43.數(shù)據(jù)域的初始化:構(gòu)造函數(shù)中初始化,聲明的時(shí)候初始化,初始代碼塊中初始化
44.初始化塊(卷一p130-131):包在一對(duì)花括號(hào)中的代碼{...},每次構(gòu)造對(duì)象的時(shí)候都會(huì)執(zhí)行一次
45.靜態(tài)代碼塊(卷一p131):static{...},只在類第一次加載的時(shí)候執(zhí)行(所以一個(gè)類沒有main方法也能執(zhí)行,記得在靜態(tài)代碼塊最后加一句System.exit(0),否則報(bào)沒定義main方法的錯(cuò)誤信息)
46.執(zhí)行順序:
? ? ①靜態(tài)代碼塊(類第一次加載執(zhí)行,只執(zhí)行一次)和靜態(tài)數(shù)據(jù)域初始化——數(shù)據(jù)域默認(rèn)初始化——按照聲明的順序或初始化塊的順序執(zhí)行聲明時(shí)的初始化(如果有的話)和初始化塊——如果構(gòu)造器中第一行調(diào)用了另一個(gè)構(gòu)造器A,則執(zhí)行構(gòu)造器A,再執(zhí)行本構(gòu)造器
????②父類靜態(tài)代碼塊和靜態(tài)數(shù)據(jù)域初始化——子類靜態(tài)代碼塊和靜態(tài)數(shù)據(jù)域初始化——父初始化(非靜態(tài))——父構(gòu)造器——子初始化(非靜態(tài))——子構(gòu)造器
47.finalize方法
48.如果在源文件頭沒有package語句,則這個(gè)類放在一個(gè)沒有名字的默認(rèn)的包中
49.如果沒有指定public或private,那么可以被同一個(gè)包中的所有方法訪問(包可見)
50.一些安全機(jī)制:JDK實(shí)現(xiàn)者禁止類加載器加載用戶定義的包名以"java."開頭的類。用戶可以使用包密封機(jī)制,將一個(gè)包密封起來,就不能再向這個(gè)包添加類了
51.呵呵,國家法律為啥要綁定微信?
