9Java基礎總結
- 2021 年 7 月 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 異常信息)。