9Java基礎總結

小島的每一段verse發表於2021-07-25

1.psvm定義的意義

public:保證了方法的訪問許可權

static:保證在類未被例項化的時候就能呼叫(載入的時機)

void:不需要返回值

main:約定俗成的名字

String[] args:提供控制檯傳入的引數

2.程式碼塊

程式碼塊分為構造程式碼塊和靜態(類)程式碼塊。

構造程式碼塊隨著物件的建立而執行,在每次例項化物件時執行,且載入時機優先於建構函式。可以在構造程式碼塊中初始化成員變數和常量。(常量不賦初值會報錯,JVM不會給他賦初值,但是可以在構造程式碼塊中賦初值。)常量的宣告可以放在構造程式碼塊的後面。

 

 

 靜態程式碼塊隨類載入而載入,順序上靜態程式碼塊優於構造程式碼塊,優於建構函式。

在類方法/靜態程式碼塊中不能使用this,因為static先載入,不可能有物件存在,所以也不可能有物件呼叫方法。靜態程式碼塊中可以初始化靜態變數和靜態常量。常量的初始化可以放在靜態構造塊下面。

 

順序練習:

 

 在沒有建構函式的情況下,靜態變數是按照語句順序執行賦值的。

 

 

在有建構函式的情況下,訪問物件的靜態變數,結果一定是建構函式中傳入的值。因為建構函式的順序在最後。

 

 

3.常用API

Math.random():返回【0.0,1.0)之間的浮點數。

System.currentTimeMillis():返回當前時間(距1970.01.01 0點的毫秒數)。經常用來計算一個方法的執行時間。

System.arraycopy(Object[] src,int srcPos,Object[] dest,int destPos,int length):從第一個陣列的起始位置複製到第二個陣列的起始位置,一共複製給定長度個元素。

Date date  = new Date(); :返回當前時間的Date()物件。

date.getTime():返回毫秒數

SimpleDateFormat formatter = new SimpleDateFormat(格式);:建立一個格式器。

formatter.format(date);:格式化Date物件,返回一個格式化的字串。

formatter.parse(dateString); :解析字串,返回一個符合格式的Date。如果大於等於格式,就不會報錯。如果小於格式,就會報ParseException。

Calendar.getInstance() :返回一個Calendar物件。

calendar.get(欄位名);:返回日曆物件對應的欄位值。欄位名是Calandar類中定義的常量,注意Calandar.MONTH返回的是0-11月份,Calandar.HOUR_OF_DAY返回的是24小時制。

BigDecimal():建構函式的引數可以是int,字串,浮點數。BigDecimal可以對超過16位有效位的數進行精確運算。但是儲存浮點數時還是非精確的,所以建議用字串儲存。

bigDecimal.加減乘除();:devide()如果除以0會報ArithmeticException。

 4.包裝類(八種基本資料型別的包裝類)

常用方法:

  • 建構函式(已棄用)
  • 基本型別Value() :返回基本型別
  • 兩個數的最大值/最小值
  • parse基本型別:將字串解析為基本型別,常用方法,如果含有不符合的符號會報NumberFormatException。
  • toString():
  • valueOf(基本型別/字串):返回包裝型別,和parse基本型別方法都是可以將字串轉換為基本型別的方法。

5.自動裝箱和自動拆箱(java5之後出現)

自動裝箱是指基本型別可以直接賦值為封裝型別。JVM自動完成型別轉換。自動裝箱的過程實際是底層呼叫量valueOf()這個方法。

自動拆箱指封裝型別可以直接賦值為基本型別。

6.包裝類的快取問題

 

 

 以Integer類為例,valueOf()方法返回的是包裝類,而底層實現採用了快取機制。如果這個簡單型別在[-128,127]之間,就會使用IntegerCache的cache陣列中的物件進行返回(快取陣列,在[0,255]的下標中存放了每個物件)。

而Float和Double類的valueOf()方法沒有使用快取,直接new 了物件。     Integer s = new Integer(9) ;//分配堆記憶體,地址。Java不推薦,推薦使用自動裝箱的方法。

        Integer t = new Integer(9) ;//分配堆記憶體,地址。
        Long u = new Long(9) ;//分配堆記憶體,地址
       // System.out.println(s==u);//Operator '==' cannot be applied to 'java.lang.Integer', 'java.lang.Long'
        System.out.println(s==t);//false,兩個不同地址的比較。
        System.out.println(s.equals(t));//true
        System.out.println(s.equals(9));//true
        System.out.println(s.equals(new Integer(9)));
Integer a
= 9;//相等於Integer a = Integer.valueOf(9); Integer b = 9; System.out.println(a==b);//true,兩個都是cache陣列的下標地址 a= 128; b= 128; System.out.println(a==b);//false,超過了快取範圍,new的新物件
    
Character c = 128;
Character d = 128;
System.out.println(c==d);//false,超過快取範圍
     Character e = -1;//注意char類的範圍是0~2^16-1。

 7.異常

異常是程式執行過程中出現的不正常情況。(開發中的語法錯誤和邏輯錯誤不屬於異常。)

異常分為:

  • Error:JVM無法處理的嚴重問題。如記憶體錯誤,資源耗盡。
  • Exception:因為程式設計錯誤和偶然原因出現的一般性問題。一般使用try-catch塊或throw、throws關鍵字處理。如果不處理異常,JVM會在控制檯列印堆疊資訊,並且程式會自動終止。

Exception分為:執行時異常和檢查時異常。(只有RunTimeException子類,沒有CheckedException子類)。

執行時異常是編譯器不要求強制處理的異常,通常指程式設計錯誤。有常見的ArithmeticException、ClassCastException(not instanceof時)、IndexOutOfBoundsException、NullPointerException。

編譯器異常是編譯器要求處理的異常,即一般性異常,如果不處理則程式不允許執行。

 

 

 8.try-catch-finally 和return順序:

public class test {
    public int add(int a,int b) {
        try {
            return a+b;
        }catch(Exception e){
            System.out.println("catch語句塊");
        }finally {
            System.out.println("finally語句塊");
        }
        return 0;
    }
    public static void main(String[] args) {
        test t=new test();
        System.out.println("和是"+t.add(9, 34));//finally語句塊,和是43
    }
 
}

當try塊中有return語句,又有finally塊時,會先把try塊中的return 返回值儲存到一個棧中。當finally塊執行完時,再調出這個棧的內容返回。

public class test {
    public int add(int a,int b) {
        try {
            return a+b;
        }catch(Exception e){
            System.out.println("catch語句塊");
        }finally {
            System.out.println("finally語句塊");
            a=1;
        }
        return 0;
    }
    public static void main(String[] args) {
        test t=new test();
        System.out.println("和是"+t.add(9, 34));//finally語句塊 和是43
    }
 
}

在finally塊中又對a進行賦值,但是並沒有影響到棧中的內容,只改變了a的值,返回值沒有變。

如果catch塊中有return語句,finally塊中沒有return語句,情況也是類似的。

如果finally中也有return語句,最終會返回finally的返回語句。

 try-catch塊中,可以有多個catch塊,但是隻能進入一個catch塊,並列catch塊可以是同級型別,如果有父類異常應該放在最後。catch塊捕捉的是異常物件。

 9.throws/throw

throws丟擲的是異常的型別,丟擲異常可以是多個型別。

throws和throw的區別:

  • 編寫的位置:throw在方法體中,throws在方法宣告上。
  • 丟擲的型別:throw丟擲一個物件,throws丟擲的是異常的型別。
  • 丟擲的個數:throw丟擲一個物件,throws可以丟擲多個型別。

 

 

10.自定義異常

自定義異常需要繼承Exception類,在有異常的方法體中寫throw 異常物件語句,並在這個方法的宣告上標註throws 異常型別。(標註的地方是在引數列表後面)。

自定義異常需要重寫無參構造和有參構造(String 異常資訊)。  

 

相關文章