一、JDK JRE JVM 三者的區別
JDK(Java Development Kit): 是太陽微系統針對Java開發人員發布的免費軟件開發工具包 是整個Java和音,包括了Java運行環境JRE(Java Runtime Environment),一堆Java工具(javac,Java,jdb等)和Java基礎類庫(即JavaAPI包括rt.jar)
JRE(Java Runtime Environment):JRE顧名思義是java運行時環境,包含了java虛擬機,java基礎類庫。是使用java語言編寫的程序運行所需要的軟件環境,是提供給想運行java程序的用戶使用的。
JVM(java virtual machine):JVM是JAVA虛擬機,它將.class字節碼文件編譯成機器語言,以便機器識別! JAVA程序就是在JVM里運行的。
二、Java常見數據類型
1、引用型數據類型(四類八種)
1)整形數據類型
①byte(8位字節)取值范圍-128~127
②short(16位字節)取值范圍215-1~-215
③int(32位字節)取值范圍231-1~-231
④long(64位字節)取值范圍263-1~-263
2)浮點型數據類型
①float(32位字節)取值范圍2-149~2128-1
②double(64位字節)取值范圍2-1074~21024-1
3) 字符型數據類型
①char(8位字節)
4)布爾型數據類型
①boolean
三、運算符
1、i++與++i的區別
1)i++是先賦值后+ ++i是先+后賦值,舉個栗子
int i=0,j=0;
System.out.println(i++);
System.out.println(++j);
顯而易見,輸出結果為1,2
i++是先進行輸出然后再進行自增運算而++j是先進行自增運算再進行輸出的
2、三目運算符
1)int i = 1>2?1:2;
三目運算符分為3部分1>2為第一部分 條件表達式1
1為第二部分 條件表達式2
2位第三部分 條件表達式3
三目運算符是由三個操作對象構成,一般結構為
條件表達式1?條件表達式2:條件表達式3
意思為當條件表達式1為true的情況下返回條件表達式2否則返回條件表達式3
2)/和%的用法及區別
①用法:都是數學運算符 都輸雙目運算符
②區別:/用於數字運算求商,就是單純的數學運算符號。舉個栗子:
System.out.println(15/5)輸出結果為3
%用於求余數,一般用來判斷X能否被Y整除
System.out.println(15%5)輸出結果為0
3)邏輯判斷 & 與&& 的區別 || 用法
①& &&的用法及區別,& 等同於and 和 並且,舉個栗子:
int o=1;
if(o>1&&o++>0){
}
System.out.println(o);輸出結果為1
if(o>1&o++>0){
}
System.out.println(o);輸出結果為2
根據上面兩個栗子不難得出結論:& 不管左邊表達式時是否返回為true都會執行右邊的表達式
&& 當左邊的表達式返回為false時將不會執行右邊的表達式
②| ||的用法和區別,| ||等同於或者 or,舉個栗子:
int i=1;
if(0<i|1<(++i)){
System.out.println(i);
}
if(0<i||1<(++i)){
System.out.println(i);
}
根據上面的兩個栗子不難得出結論:| 不管左邊的表達式返回是否為true 都將執行右邊的表達式
|| 當左邊表達式返回為true時將不會執行右邊的表達式
四、對象的加載過程,封裝,繼承(重寫與重載的區別),多態,抽象類,接口,訪問修飾符權限大小
1)對象的初始化過程:
①包含繼承的子類初始化過程為:(父)靜態對象(子)--非靜態對象(父)--構造方法(父)--非靜態對象(子)--構造方法(子)
。舉個栗子:
測試類
父類
子類
運行結果
從運行結果上可以看出:包含繼承的子類初始化過程為:(父)靜態對象(子)--非靜態對象(父)--構造方法(父)--非靜態對象(子)--構造方法(子)
②在不包含繼承情況下對象的初始化過程是:靜態對象--非靜態對象--構造器
對象
測試類
2)封裝
封裝:將屬性或者方法私有化,設置公有的set get 方法;我個人理解就是將屬性和方法統一提取到一個私密的空間里
然后給這個空間訂上訪問它的坐標,不能直接訪問這些屬性和方法,只能通過坐標來獲取
3)繼承
繼承 是面向對象軟件技術當中的一個概念,與多態、封裝共為面向對象的三個基本特征。
繼承可以使得子類具有父類的屬性和方法或者重新定義、追加屬性和方法等。
優點是:去除代碼重復,提高代碼復用性,便於維護。
在Java中類只支持單繼承,接口支持多繼承,接口不能被類繼承,普通類繼承抽象類得重寫抽象類里邊的所有抽象方法
4)抽象類
一個被abstract修飾的特殊的類,此類中可以有抽象方法和常量,也可以有非抽象方法和變量
抽象類不能被實例化,只能被繼承
5)接口
一個被interface修飾的特殊的類,在此類中只允許有常量和抽象方法,在JDK1.8以后(包含1.8可以有普通方法和變量),
接口不能被實例化,只能被實現(implements)
實現一個接口就得重寫它里邊的所有抽象方法 接口支持多繼承
6)訪問修飾符權限大小
private(本類)<-default(本包)<-protected(不同包的子類)<-Public(公有)
private:私密的,故只能在本類中使用,封裝就是將此類里所有的方法和屬性的訪問修飾符全部設定成private
default:默認的,在普通類中,默認的訪問修飾符就是這個,它的訪問權限僅僅比private大一級,僅限同一個包中使用
protected:這個訪問修飾符又比default大一級,可以在不同包中訪問,但前提是兩者必須是繼承關系
public:公開的,顧名思義,用這個訪問修飾符修飾的所有屬性和方法,在所有的類中都可以隨意調用
五、數組的聲明三種,如何遍歷取值賦值 for循環執行順序,選擇排序,冒泡排序 Continue 與 break的區別 switch語句用法
1)數組的聲明方式及遍歷取值 賦值
①數組的三種創建方式,話不多說,上代碼:
int []a=new int[6];
int[] b = {1,2,3};
int[] c=new int[]{1,2,3};
②數組的遍歷取值方式共4種:
第一種,使用for循環,話不多說看代碼:
第二種,使用while循環,繼續放代碼:
第三種,使用增強for循環,還是放代碼:
第四種,使用do...while循環,最后一次放代碼:
③數組的賦值
數組賦值可以在聲明數組的時候就賦值,也可以通過下標賦值,上代碼:
聲明時賦值
運行結果
通過下標賦值
運行結果
數組的下標是從0開始,0是第一個元素,如果沒賦值的話它默認為0;
2)for循環的執行順序
要知道for循環的執行順序,首先得了解for循環總體分為幾部分
for(初始化語句int i=0;條件語句i<20;迭代語句i++){
System.out.println("方法體")
}
如上所述,for循環總體分為4部分,1初始化語句,2條件語句,3迭代語句,4方法體
for循環剛開始第一次循環會首先執行初始化語句,也就是int i=0;然后執行條件判斷語句 i<20,如果它返回false則不會進入下一步,
如果返回true則執行方法體System.out.println("方法體"),執行完方法體后,再執行迭代語句也就是1 2 4 3
當首次循環完畢之后進行第二次循環的時候將不會執行初始化語句,而是直接開始執行第二步,也就是條件語句,
返回true的情況下再執行方法體,然后繼續迭代,直到條件語句返回為false為止;
3)選擇排序
選擇排序,顧名思義,有選擇的進行排序,話不多說先看代碼:
for (int i = 0; i < a.length-1; i++) {外層循環,確定的是要比較的次數
b=i;
for (int j = b+1; j < a.length; j++) {里層循環,將未比較的元素拿出來與外層循環的元素一一比較
if(a[b]>a[j]){判斷兩個元素的大小
b=j;記住值為小的一方的下標
}
}
if(b!=i){判斷一次循環結束后值為小的下標是否為當前元素下標,如果是則跳過此段代碼,如果不是則將當前元素與此次比較的最小元素進行更換位置
int c=a[i];
System.out.println(c);
a[i]=a[b];
a[b]=c;
}
}
上圖:
4)冒泡排序
冒泡排序:原理是每次比較兩個相鄰的元素,將較大的元素交換至右端。
思路拓展:每次冒泡排序操作都會將相鄰的兩個元素進行比較,看是否滿足大小關系要求,如果不滿足,就交換這兩個相鄰元素的次序,一次冒泡至少讓一個元素移動到它應該排列的位置,重復N次,就完成了冒泡排序。
通過一個圖來簡單理解一下一次冒泡的過程【注意:圖中每一豎列是一次比較交換】:
圖中可以看出,經過一次冒泡,6這個當前數組中最大的元素飄到了最上面,如果進行N次這樣操作,那么數組中所有元素也就到飄到了它本身該在的位置,就像水泡從水中飄上來,所以叫冒泡排序。
下圖就是整個飄的過程:
以上,第五第六次可以看到,其實第五次冒泡的時候,數組已經是有序的了,因此,還可以優化,即如果當次冒泡操作沒有數據交換時,那么就已經達到了有序狀態
思路理清楚了那就上代碼:
for (int i = 0; i <a.length-1; i++) {
for (int j = i+1; j < a.length-i-1; j++) {
System.out.println(a[i]+"---"+a[j]);
if(a[i]<a[j]){
b=a[i];
a[i]=a[j];
a[j]=b;
}
}
for (int i1 = 0; i1 < a.length; i1++) {
System.out.print(a[i1]+",");
}
}
通過代碼的輸出可以看出來,每次都是兩個相林的數進行比較,如果外層循環的數小於里層循環的數則進行互換位置
這樣第一輪比較出的結果就是最大的數換到了第一個,第二輪比較就開始從第二個數比較,第三輪是第三個數,直至結束;
5)Continue 與 break的區別 switch語句用法
①Continue與break的用法和區別:
Continue是跳出本次循環進行下一次循環,break是直接跳出,結束循環,看代碼:
運行結果
break的運行結果
由上圖可以看出不論是break還是Continue都具有跳出循環的功能,它們下面的輸出語句都沒執行,但是Continue的循環循環了5次,break只循環了一次。
由此可以得出結論,Continue具有跳出循環的功能,但是它只是跳出了本次循環,下一次循環還是會繼續執行,直到循環結束。而break是直接結束了循環,讓循環終止。
6)switch語句的用法
能用於switch判斷的類型有:byte、short、int、char(JDK1.6),還有枚舉類型,但是在JDK1.7后添加了對String類型的判斷
case語句中少寫了break,編譯不會報錯,但是會一直執行之后所有case條件下的語句而不再判斷,直到default語句
若果沒有符合條件的case就執行default下的代碼塊,default並不是必須的,也可以不寫。廢話不多說,看代碼:
int i=0;
switch (i) {
case 0:
System.out.println(0);
break;
case 1:
System.out.println(1);
break;
default:
System.out.println("負數");
break;
}
switch只能判斷相等。case語句后邊一定要加break,不然一旦匹配到某個case之后,它后面的所有case都會默認執行,而不管是否匹配;