轉載(https://github.com/yangchong211/YCBlogs/blob/d21fdb30f6751ccc02642e1b0a73aef50fdd176b/java)
0.Java語言概述
-
0.1 jdk工具部分exe解釋
- jar.exe jar包
- javadoc.exe 文檔生成器
- Java.exe 解釋器
- Javac.exe 編輯器
-
0.2 開發(fā)與運行Java程序需經(jīng)過哪些過程?
- 用工具編輯源程序,也就是寫代碼,保存
- 用Java編輯器工具javac.exe編譯源程序文件,生成字節(jié)碼.class文件
- 用Java解釋器工具Java.exe解釋運行生成.class文件
-
0.3 Java是如何實現(xiàn)跨平臺的?
- 如下所示:
- 跨平臺是怎樣實現(xiàn)的呢?這就要談及Java虛擬機(Java Virtual Machine,簡稱 JVM)。
- JVM也是一個軟件,不同的平臺有不同的版本。我們編寫的Java源碼,編譯后會生成一種 .class 文件,稱為字節(jié)碼文件。Java虛擬機就是負責將字節(jié)碼文件翻譯成特定平臺下的機器碼然后運行。也就是說,只要在不同平臺上安裝對應的JVM,就可以運行字節(jié)碼文件,運行我們編寫的Java程序。
- 而這個過程中,我們編寫的Java程序沒有做任何改變,僅僅是通過JVM這一”中間層“,就能在不同平臺上運行,真正實現(xiàn)了”一次編譯,到處運行“的目的。
- JVM是一個”橋梁“,是一個”中間件“,是實現(xiàn)跨平臺的關鍵,Java代碼首先被編譯成字節(jié)碼文件,再由JVM將字節(jié)碼文件翻譯成機器語言,從而達到運行Java程序的目的。
- 注意:編譯的結果不是生成機器碼,而是生成字節(jié)碼,字節(jié)碼不能直接運行,必須通過JVM翻譯成機器碼才能運行。不同平臺下編譯生成的字節(jié)碼是一樣的,但是由JVM翻譯成的機器碼卻不一樣。
- 所以,運行Java程序必須有JVM的支持,因為編譯的結果不是機器碼,必須要經(jīng)過JVM的再次翻譯才能執(zhí)行。即使你將Java程序打包成可執(zhí)行文件(例如 .exe),仍然需要JVM的支持。
- 注意:跨平臺的是Java程序,不是JVM。JVM是用C/C++開發(fā)的,是編譯后的機器碼,不能跨平臺,不同平臺下需要安裝不同版本的JVM。
1.Java標識符規(guī)則
-
1.1 組成規(guī)則
- 英文大小寫字母
- 數(shù)字字符
- $或_
-
1.2 注意事項
- 不能以數(shù)字開頭
- 不能是Java中的關鍵字
- 區(qū)分大小寫
- 不能有空格
-
1.3 命名規(guī)范【必須見名知意】
- 下劃線式命名:my_name
- 駝峰式命名:myName
- 類,接口命名:必須是大寫字母開頭,比如PersonActivity
- 方法,變量【字符串】命名:getData(),otherName
- 常量命名:一般全是大寫,比如MAX_VALUE
2.常量和變量
-
2.1 什么是常量和變量
- 其值不可以改變的稱之為常量
- 其值會發(fā)生變化的稱之為變量
-
2.2 常量有哪些
- 字符串常量 用雙引號包括的 "hello world"
- 整型常量 所有的整數(shù) 199
- 小數(shù)常量 所有的小數(shù) 4.50
- 字符常量 用單引號包括的 'a'
- 布爾常量 true和false
- 空常量 null
-
2.3 變量
- 用來描述值可以變化的量,比如室外溫度,App活躍用戶量等
3.進制
- 3.1 進制有哪些
- 二進制
- 0和1 前綴0B或者0b 比如:0B1001 轉為十進制是9
- 八進制
- 0-7 前綴0 比如:0103
- 十進制【我們常用的】
- 0-9 沒有前綴
- 十六進制
- 0-9 和 A-F 前綴0x或者0X 比如:0x123
- 進制轉化
- 任何進制轉化為十進制公式:系數(shù) * 底數(shù) ^ 指數(shù)
0b1010 = 1 * 2^3 + 0 *2^2 + 1*2^1 + 0*2^0
= 8 + 0 + 2 + 0
= 10
0123 = 1*8^2 + 2*8^1 + 3*8^0
= 64 + 16 + 3
= 83
0x123 = 1*16^2 + 2*16^1 + 3*16^0
= 256 + 32 + 3
= 291
-
3.2 補碼
- 正數(shù)的補碼和原碼相同
5
原碼:0000 0101
補碼:0000 0101
* 負數(shù)的補碼是它的反碼加1
-5:
原碼:1000 0101
反碼:1111 1010
+ 1
------------------
補碼 1111 1011
5.字符編碼
- 常見的字符編碼
- ASCII碼
- GBK碼
- Unicode碼【占2個字節(jié)】
6.運算符
-
6.1 運算符有哪些?
- 算術運算符
- 賦值運算符
- 關系運算符
- 邏輯運算符
- 三目運算符
- 特殊運算符:位運算符
-
6.2 算術運算符
- ,- , * , / , %【取余】 , ++【自加】, --【自減】
-
6.3 賦值運算符
- = , += , -= , *= , /= , %=
-
6.4 關系運算符
- == , > , < , >= , <= , !=
-
6.5 邏輯運算符
- & ,^ ,| ,&& ,|| ,! , ^
-
6.6 三目運算符【Android中用的很多】
- a == b ? c : d
- 格式:(條件表達式)?表達式1:表達式2
-
6.7 位運算符
- & , | , ^ , ~ , << , >> , >>>
7.Java基本語句結構
-
7.1 語句結構種類
- 順序結構
- 選擇結構
- 循環(huán)結構
-
7.2 順序結構
- 從上到下依次執(zhí)行
-
7.3 選擇結構【可以嵌套】
- if , if else , if else if …… else
- switch case【支持byte,short,char,int,String】
7.4 循環(huán)結構
-
for
for(初始化語句;判斷條件語句;控制條件語句) { 循環(huán)體語句; } 第一步:先執(zhí)行初始化語句,只執(zhí)行一次 第二步:執(zhí)行判斷條件語句 第三部:執(zhí)行循環(huán)體語句 第四步:執(zhí)行控制條件語句,然后再執(zhí)行循環(huán)體語句【循環(huán)】 -
while
初始化語句; while(判斷條件語句) { 循環(huán)體語句; 控制條件語句; } -
do while
do { 循環(huán)體語句; }while((判斷條件語句);
8.Java方法
8.1 定義
-
方法就是完成特定功能的代碼塊
- 1:系統(tǒng)方法,只需要會使用,不需要知道內部的結構
- 2:自定義方法:方法的內部實現(xiàn)需要我們來寫
- 3:方法內部不能再嵌套方法
8.2 格式
-
方法格式
修飾符 返回值類型 方法名(參數(shù)類型 參數(shù) , ……){ 函數(shù)體 return 返回值 } 修飾符: public static或直接是public或是其它private
返回類型:所有的數(shù)據(jù)類型(基本類型:int ,char ,float, long, 引用類型:String)
方法名:1:見名知意 2: getMax
參數(shù)類型:所有的數(shù)據(jù)類型 ,如果一個方法沒有返回值,則返回值類型為void
參數(shù)名:變量名
返回值:就是要返回的結果(這個結果必須和返回類型一致)
9.數(shù)組
-
9.1 數(shù)組概念
- 數(shù)組是一個容器,可以存儲多個變量,這些變量數(shù)據(jù)類型要一致
- 數(shù)組既可以存儲基本數(shù)據(jù)類型,也可以存儲引用數(shù)據(jù)類型
9.2 一維數(shù)組
-
數(shù)組定義格式
- 格式1:數(shù)據(jù)類型【】 數(shù)組名
- 格式2:數(shù)據(jù)類型 數(shù)組名【】
int[] a; 定義了一個int類型的數(shù)組a; int a[]; 定義了一個int類型的a數(shù)組; 推薦使用第一種定義方式。 -
數(shù)組的初始化
- Java中的數(shù)組必須先初始化,然后才能使用。
- 所謂初始化:就是為數(shù)組中的數(shù)組元素分配內存空間,并為每個數(shù)組元素賦值。
-
初始化分類:
- a:動態(tài)初始化: 只指定長度,由系統(tǒng)給出初始化值
- b:靜態(tài)初始化: 給出初始化值,由系統(tǒng)決定長度
- 注意事項:這兩種方式,只能使用一種,不能進行動靜結合
9.3 二維數(shù)組
-
數(shù)組定義格式
- 數(shù)據(jù)類型[][] 變量名 = new 數(shù)據(jù)類型[m][n];
- m表示這個二維數(shù)組有多少個一維數(shù)組
- n表示每一個一維數(shù)組的元素個數(shù)
-
舉例:
int[][] arr = new int[3][2]; 定義了一個二維數(shù)組arr 這個二維數(shù)組有3個一維數(shù)組,名稱是arr[0],arr[1],arr[2] 每個一維數(shù)組有2個元素,可以通過arr[m][n]來獲取,表示獲取第m+1個一維數(shù)組的第n+1個元素
10.Java的內存分配以及棧和堆的區(qū)別
-
10.1 先了解幾個概念
- 棧
- 堆
- 方法區(qū)
- 本地方法去
- 寄存器
A:棧: 存放的是局部變量 局部變量:在方法定義或者方法聲明上的變量都是局部變量。 B:堆: 存放的是所有new出來的東西 特點: a: 每一個new出來的東西都會為其分配一個地制值。 b: 每一個變量都有一個默認的值 byte,short,int,long -- 0 float,double -- 0.0 char -- '\u0000' boolean -- false 引用數(shù)據(jù)類型 -- null c: 使用完畢就變成了垃圾,等待垃圾回收器對其回收 C:方法區(qū):(面向對象部分講解) D:本地方法區(qū):(和系統(tǒng)相關) E:寄存器:(cpu使用)
11.使用switch和if-else區(qū)別
-
11.1 switch語句特點
- 使用switch語句時,要注意表達式必須是符合byte,char,short,int或枚舉類型的表達式,而不能使用浮點類型或long類型。
- switch語句將表達式的值依次與每個case子語句中的常量值相比較。如果匹配成功,則執(zhí)行該case語句中的語句,直到遇到break語句為止。
- default語句是可選的,當表達式的值與任何一個case語句都不匹配時,就執(zhí)行default后的語句。
-
11.2 switch語句與if-else比較
- if-else只是單純地一個接一個比較;if...else每個條件都計算一遍;
- 使用了Binary,Tree算法;絕大部分情況下switch會快一點,除非是if-else的第一個條件就為true。編譯器編譯switch與編譯if...else...不同。不管有多少case,都直接跳轉,不需逐個比較查詢;switch只計算一次值,然后都是test , jmp……有很多else if的時候,用switch case比較清晰
- switch...case與if...else,if的根本區(qū)別在于,switch...case會生成一個跳轉表來指示實際的case分支的地址,而這個跳轉表的索引號與switch變量的值是相等的。從而,switch...case不用像if...else那樣遍歷條件分支直到命中條件,而只需訪問對應索引號的表項從而到達定位分支的目的。