JAVA學習(一)——基本語法
tips:前端開發寫慣了弱型別語言,再來學強型別語言,真的是被各種修飾符、型別宣告給整的雲裡霧裡,而且java語法和javascript語言差別還是很大的,所以做好筆記,把一些需要注意的地方記下來是非常重要的,接下來就開始學習java啦。
一、 基本語法:
1、大小寫敏感 :Java是大小寫敏感的,這就意味著識別符號Hello與hello是不同的。
2、類名:對於所有的類來說,類名的首字母應該大寫。如果類名由若干單片語成,那麼每個單詞的首字母應該大寫,例如 MyFirstJavaClass 。
3、方法名:所有的方法名都應該以小寫字母開頭。如果方法名含有若干單詞,則後面的每個單詞首字母大寫。
4、原始檔名:原始檔名必須和類名相同。當儲存檔案的時候,你應該使用類名作為檔名儲存(切記Java是大小寫敏感的),檔名的字尾為.java。(如果檔名和類名不相同則會導致編譯錯誤)。
5、主方法入口:所有的Java 程式由public static void main(String args[]) 方法開始執行。
備註一下:
5.1、public static void main(String args[]){}:為java主函式,java虛擬機器會自動尋找到main方法,然後開始執行後面的程式,java程式的規定的格式寫法;
5.2、public:可外部訪問;
5.3、static:標記為靜態函式,將該函式儲存在靜態儲存區,不需要例項化(new)即可使用;
5.4、void:無返回值;
5.5、String args[]:可在命令列通過此引數給函式傳值,可在其他類呼叫這個類的main函式時傳值。
public class MyFirstJavaProgram { /* 第一個Java程式. * 它將列印字串 Hello World */ public static void main(String []args) { System.out.println("Hello World"); // 列印 Hello World } }
二、類(class)
1、區域性變數
2、成員變數:定義在類中,方法體之外的變數,和區域性變數略有不同。
3、類變數也宣告在類中,方法體之外,但必須宣告為static型別。
4、構造方法:在建立一個物件的時候,至少要呼叫一個構造方法。構造方法的名稱必須與類同名,一個類可以有多個構造方法。
public class Puppy{ public Puppy(){ } public Puppy(String name){ // 這個構造器僅有一個引數:name } }
三、型別
1、基本資料型別(內建基本型別,引用型別)
byte a = 100;—— byte資料型別是8位、有符號的,以二進位制補碼錶示的整數;
short s = 1000;—— short資料型別是16位、有符號的以二進位制補碼錶示的整數;
int a = 100000;—— int資料型別是32位、有符號的以二進位制補碼錶示的整數;
long a = 100000L;—— long資料型別是64位、有符號的以二進位制補碼錶示的整數;(後面加了L)
float f1 = 234.5f;—— float資料型別是單精度、32位、符合IEEE 754標準的浮點數;(小數,後面加了f)
double d1 = 123.4;—— double資料型別是雙精度、64位、符合IEEE 754標準的浮點數;(小數)
boolean one = true;—— boolean資料型別表示一位的資訊;(true或false)
char letter = ‘A’;—— char型別是一個單一的16位Unicode字元;
Animal animal = new Animal(“giraffe”) ; —— 引用型別變數由類的建構函式建立,可以使用它們訪問所引用的物件;
final double PI =3.1415927;—— 常量指不能改變的量。 在Java中用final標誌,宣告方式和變數類似;
2、變數型別(區域性變數,例項變數,類變數)
區域性變數:
1、 訪問修飾符不能用於區域性變數;(區域性變數本身只能區域性呼叫,外部沒法呼叫,所以不需要修飾符private ,public protend,但是能加final)
2、區域性變數是在棧上分配的。(由於程序的棧空間是有限的,所以要避免申請佔用空間過大的區域性變數,以及避免函式巢狀層數過多。這些都可能引起棧空間不夠導致程式崩潰。)
例項變數:
1、例項變數宣告在一個類中,但在方法、構造方法和語句塊之外;
2、例項變數的值應該至少被一個方法、構造方法或者語句塊引用,使得外部能夠通過這些方式獲取例項變數資訊;
3、例項變數可以宣告在使用前或者使用後;(有點型別js的變數提升)
4、訪問修飾符可以修飾例項變數;
5、一般情況下應該把例項變數設為私有。通過使用訪問修飾符可以使例項變數對子類可見;
6、例項變數具有預設值。數值型變數的預設值是0,布林型變數的預設值是false,引用型別變數的預設值是null。變數的值可以在宣告時指定,也可以在構造方法中指定;(區域性變數沒有預設值哦!)
類變數(靜態變數):
1、以static關鍵字宣告,必須在方法、構造方法和語句塊之外。
2、無論一個類建立了多少個物件,類只擁有類變數的一份拷貝。
3、靜態變數除了被宣告為常量外很少使用。常量是指宣告為public/private,final和static型別的變數。常量初始化後不可改變。
4、靜態變數儲存在靜態儲存區。經常被宣告為常量,很少單獨使用static宣告變數。
5、類變數被宣告為public static final型別時,類變數名稱必須使用大寫字母。如果靜態變數不是public和final型別,其命名方式與例項變數以及區域性變數的命名方式一致。
四、修飾符
訪問修飾符(private、public、protected)
1、private —— 只能被所屬類訪問,並且類和介面不能宣告為private。
2、public —— Java程式的main() 方法必須設定成公有的,否則,Java直譯器將不能執行該類。
3、protected —— 能被同一個包中的任何其他類訪問,也能夠被不同包中的子類訪問;不能修飾類和介面,方法和成員變數能夠宣告為protected,但是介面的成員變數和成員方法不能宣告為protected。
非訪問修飾符(static、final、abstract、synchronized、volatile)
1、static —— 區域性變數不能被宣告為static變數;可以直接使用classname.variablename和classname.methodname的方式訪問。
2、final —— final物件的引用不能改變,但是裡面的值可以改變;final修飾符通常和static修飾符一起使用來建立類常量;類中的Final方法可以被子類繼承,但是不能被子類修改;final類不能被繼承。
3、abstract —— 抽象類不能用來例項化物件;一個類不能同時被abstract和final修飾;抽象方法是一種沒有任何實現的方法,該方法的的具體實現由子類提供。抽象方法不能被宣告成final和static;任何繼承抽象類的子類必須實現父類的所有抽象方法,除非該子類也是抽象類;抽象方法的宣告以分號結尾,例如:public abstract sample();
例子:
public abstract class SuperClass{ abstract void m(); //抽象方法 } class SubClass extends SuperClass{ //實現抽象方法 void m(){ ......... } }
4、synchronized —— 方法同一時間只能被一個執行緒訪問。
5、transient —— java虛擬機器(JVM)將跳過transient修飾的例項變數。
6、volatile —— volatile修飾的成員變數在每次被執行緒訪問時,都強迫從共享記憶體中重讀該成員變數的值。而且,當成員變數發生變化時,強迫執行緒將變化值回寫到共享記憶體。這樣在任何時刻,兩個不同的執行緒總是看到某個成員變數的同一個值。(看得有點暈)
五、運算子(感覺所有語言都差不多,略)
六、包裝類或抽象類
Number類:內建資料型別,如:int、long、byte、double、float、short等對應了包裝類Integer、Long、Byte、Double、Float、Short等,它們都是抽象類Number的子類。(包裝類需要拆箱變成內建資料型別才能進行計算)
Math類:Math 的方法都被定義為 static 形式,通過 Math 類可以在主函式中直接呼叫。
Character類:對應了內建資料型別char。
String類:String類是不可改變的,所以你一旦建立了String物件,那它的值就無法改變了。如果需要對字串做很多修改,那麼應該選擇使用StringBuffer & StringBuilder類。輸出格式化數字可以使用printf()和format()方法;
轉 換 符 | 說 明 | 示 例 |
---|---|---|
%s | 字串型別 | “mingrisoft” |
%c | 字元型別 | ‘m’ |
%b | 布林型別 | true |
%d | 整數型別(十進位制) | 99 |
%x | 整數型別(十六進位制) | FF |
%o | 整數型別(八進位制) | 77 |
%f | 浮點型別 | 99.99 |
%a | 十六進位制浮點型別 | FF.35AE |
%e | 指數型別 | 9.38e+5 |
%g | 通用浮點型別(f和e型別中較短的) | |
%h | 雜湊碼 | |
%% | 百分比型別 | % |
%n | 換行符 | |
%tx | 日期與時間型別(x代表不同的日期與時間轉換符 |
StringBuffer和StringBuilder類:StringBuilder相較於StringBuffer有速度優勢,所以多數情況下建議使用StringBuilder類。然而在應用程式要求執行緒安全的情況下,則必須使用StringBuffer類。(執行緒安全就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。執行緒不安全就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料)。
陣列:
//陣列宣告 dataType[] arrayRefVar;// 首選的方法 或 dataType arrayRefVar[];// 效果相同,但不是首選方法 //陣列建立 dataType[] arrayRefVar = new dataType[arraySize]; 或 dataType[] arrayRefVar = {value0, value1, ..., valuek}; //foreach迴圈 public class TestArray { public static void main(String[] args) { double[] myList = {1.9, 2.9, 3.4, 3.5}; // 列印所有陣列元素 for (double element: myList) { System.out.println(element); } } }
Array類:能方便地運算元組,它提供的所有方法都是靜態的;(fill:給陣列賦值,sort:對陣列排序,equals:比較陣列中元素值是否相等,binarySearch:對排序好的陣列進行二分查詢法查詢陣列元素)
七、異常處理
1、異常捕獲:使用try和catch關鍵字可以捕獲異常;
try { // 程式程式碼 }catch(ExceptionName e1) { //Catch 塊 }
2、throws/throw關鍵字:如果一個方法沒有捕獲一個檢查性異常,那麼該方法必須使用throws 關鍵字來宣告。throws關鍵字放在方法簽名的尾部;可以宣告丟擲多個異常,多個異常之間用逗號隔開。
import java.io.*; public class className { public void withdraw(double amount) throws RemoteException, InsufficientFundsException { // Method implementation } //Remainder of class definition }
3、finally關鍵字:無論是否發生異常,finally程式碼塊中的程式碼總會被執行;
try{ // 程式程式碼 }catch(異常型別1 異常的變數名1){ // 程式程式碼 }catch(異常型別2 異常的變數名2){ // 程式程式碼 }finally{ // 程式程式碼 }
最後 ,把上面的這些學懂,再來看java程式碼,已經不像開始時的那樣陌生了,當然,還有一些知識點比較難,需要花更多的時間去學習研究,學得越多,越覺得java的知識體量很大,不過總算是入門了,再接再厲!