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的知識體量很大,不過總算是入門了,再接再厲!