天天看點

JavaSe一個月一些筆記和感想

部分常識

dos指令(win和Linux上删除指令不太一樣

java環境變量設定,盡量不要設定出中文名稱變量,後續會影響路徑讀取

public隻能修飾一個類,且該類的名稱和檔案名稱一緻,同一檔案中可以有多個類

類、方法、常量的基本命名規範和規則

辨別符:java 對類名 方法名 變量名 包名 等命名時采用的字元序列。

在java中凡是需要自己命名的位置都是辨別符

辨別符命名規則:

由字母數字下劃線美元符組成,且數字不能開頭

不能用保留字和關鍵字

嚴格區分大小寫

命名規範

看到名字要知道這玩意大概啥意思

類名各個單詞首字母大寫

方法(函數)名第二個單詞首字母大寫(其之後的所有單詞首字母大寫)

包名小寫

常量全部大寫

命名規則:

1.字母數字下劃線 美元符 組成

2.數字不能開頭

3.不能是java中的關鍵字或者保留字

4.嚴格區分大小寫

命名規範:

1.見名之意

2.類 每一個單詞的首字母大寫

3.方法 變量 等 第一個單詞的首字母小寫 從第二個單詞開始 首字母大寫

4.包 所有字母小寫

5.常量 所有的字母大寫 多個單詞組成 使用下劃線連接配接

局部變量需要初始化,即放在方法中的變量要初始化

放在方法外的因為其是類變量是以可以不做初始化

ASCLL碼:0:48,A:65,a:97

byte,short,char三者任意之間運算,結果都會轉換為int類型

+=,-=,/=,%=之類的指派運算符不會改變原有的資料類型

charAt方法隻能接收空格前的資料

nextLine隻能跟随nextLine的輸入,如果上一輸入不是nextLine則會中斷

随機數公式

Math.random()*(n-m+1)+m

取值範圍[m,n]

循環控制部分

switch(資料){}

資料中可以放的資料類型char,int,String,short,byte,枚舉

do{循環體}while();

一般先執行一次循環體的内容,再進行條件判斷

循環選擇

for适用條件 循環次數固定

while 循環次數不固定

do while 初始化條件不滿足循環條件,但仍執行一次循環

嵌套循環内break

如果沒有标簽,則結束目前break所在層循環,如果有标簽,結束标簽所在循環

标簽

l: for(i=0;i<x;i++){

for(j=0;j<x;j++){

if(a==b)

brake l;}}

嵌套循環内continue

面向對象

包(package)命名

名稱小寫

子產品名+網址(不用www倒叙:com.baidu)

靜态成員變量與非靜态成員變量

相同

都有預設值

都是類變量

方法

形參:

存在:方法聲明處

規定調用出傳遞的實參類型、個數、順序

在定義方法時方法名後面括号中聲明的變量稱為形式參數(簡稱形參)即形參出現在方法定義時。

形參是基本資料類型,

那麼實參給形參的是資料值的副本,形參的修改不影響實參;

重載

定義:同一個類中,允許存在多個同名方法,隻要其參數個數或參數類型不同

兩同一不同

同一個類,同一個方法名

不同的參數類型或參數個數

對象數組

類似二維數組,但其内部存儲的是一個對象(對象内部又有其他的屬性)

遞歸

直接遞歸

間接遞歸

注意點

遞歸需要有出口

不斷的向出口靠近

當遞歸次數過多時,會出現StackOverflowError錯誤

封裝

通路控制權限

封裝的作用

防止出現垃圾資料,可以對屬性進行封裝

private 資料類型 變量名,同時也要提供方法去改變或者擷取該變量

利用this差別成員變量和局部變量

構造器

建構方法

[修飾符] 類名(形參清單){方法體}

繼承

注意點:

繼承的子類在使用資源時,一般現在本類中尋找,如果沒有則到父類(上一級)中尋找,不斷往上,直到object

一個類沒有顯示的繼承一個類,那麼這個類預設繼承object類

Java中的繼承是單繼承,一個類隻能直接繼承另一個類。但可以多重繼承(深度,一脈單傳)

關于私有屬性,其子類不能直接調用和使用(但可以通過getXxxxx/setXxxxx整活)

成員初始化指派

預設指派

顯示指派

和代碼塊看誰在前,誰前誰先(靜态例外)

多态

前提

有繼承

有方法重寫

native

被native 修飾的方法

本地方法

public native int hashCode();

final

final修飾的類 不能被繼承 不能有子類 聲明方式 final class 類名

final 修飾的方法 不能被重寫 聲明方式 public final void eat(){}

final的注意點

修飾的變量 變為 常量

修飾的對象 位址值不能改變

修飾的成員變量 可以顯示指派 也可以通過構造器指派

但需要注意的是:這個隻能指派一次,類似初始化,之後就不能修改了

object

其為所有類的根父類

任意對象 都可以使用Object類中的方法

數組也是對象 也可以使用

除了Object 類之外 所有的類 都可以寫出向上轉型的關系

抽象類

抽象:既不具體,也無法具體

抽象類聲明方法:abstract class 類名{}

抽象方法:規定子類行為

權限修飾符 abstract 傳回值類型 方法名(形參);

接口

用來定義規範 has a 的關系

接口聲明:interface 接口名{ }

使用:class 類名 implements 接口名{ }

接口成員

接口屬性是全局靜态常量,其預設被public static final修飾

接口的抽象方法,預設被public、abstract修飾

接口内可以有靜态的方法,預設被public修飾

接口内有預設方法 哪一個實作類需要重寫 直接重寫即可 不會對其他類造成影響,其預設被 public 修飾

聲明方式【public 可有可無】 default 傳回類型 方法名

那個實作類需要則重寫,不會對其他類造成影響

内部類

成員内部類(不常用)

常見于源碼

聲明方式

外部類名{ class 内部類名{ } }

單元測試

@Test,有網絡的情況下

單元測試必須是公共的類

單元測試必須是公共的方法

方法名無要求

不要混雜其他無關内容

數組

一維數組

初始化:

動态:type[] var=new type[length];var[0]=x;var[1]=y;····

通俗講就是聲明與指派分開進行,相對常用點。即隻知道數組長度,不知道具體元素内容

異常

異常的體系結構

Throwable

Error:程式員不需要處理的異常

Exception : 程式員處理的異常(這個是編譯時異常)

運作時異常:代碼真正跑起來 才會出現的異常

數組下标越界

空指針

算數異常

類型轉換

輸入不比對

兩個比較好用的方法

getMessage();擷取發生異常的原因

printStackTrace();發生異常的原因

異常的抛出

try { 可能發生異常的代碼 }catch(異常類型 變量名){ 異常解決方案 }

注意

1.try中發生了異常 那麼 異常下面的代碼不會執行 直接進到 catch内

2.try{} 是有作用域限制 想要在其他位置使用需要進行作用域提升

3.隻有發生了對應的異常類型 才可以進行捕獲

4.想要捕獲多個異常

4.1 使用 | 進行連接配接 catch(異常類型1 | 異常類型2 | .... 變量名)

4.2多重catch

4.3使用父類

如果存在多重catch 一定按照 從小到大的順序寫

繼承關系的異常抛出

父類抛出的是運作時異常 子類抛出異常沒有限制

父類抛出的是編譯時異常 子類不能抛出比父類更大的異常

自定義異常

1.建立一個類型 繼承一個異常類型

編譯時異常 繼承一個編譯時異常類

運作時異常 繼承一個運作時異常類

單元測試如何使用

注意:

1.單元測試方法 必須是 公共的類

2.單元測試方法必須是 公共的方法

3.方法名無要求

4.單元測試類 不要混雜其他内容

@Before 運作單元測試方法前 會執行的内容

@After 運作單元測試方法後 會執行的内容

異常處理注意事項

編譯期異常必須處理,要麼捕獲處理,要麼聲明在方法上,讓調用者處理。

運作時異常被抛出可以不處理。即不捕獲也不聲明抛出。

try語句範圍要盡量小的包圍在可能出現異常的一行或幾行代碼上,不要把大量無異常的代碼一起包起來,雖然這樣很省事。

catch語句捕獲的異常類型要盡量小,盡量精準,好針對性的做處理。

如果finally有return語句,永遠傳回finally中的結果,但要避免該情況.

如果父類方法抛出了多個異常,子類重寫父類方法時不能抛出更大異常,可以抛出和父類相同的異常或者是父類異常的子類或者不抛出異常。

父類方法沒有抛出異常,子類重寫父類該方法時也不可抛出異常。

float a=3.14f;此處需要加上f/F

long a=234l;此處需要加上l/L

輸入不比對異常,在輸入中,接收int但輸入double等

輸入

next()方法:

遇到空格等空白符,就認為輸入結束

witch不能作用long,JDK1.7可以String

break:隻能用在switch和循環内

continue:隻能在循環内

數組長度為Arr.length,其最後一個元素的索引為Arr.length-1

字元串比較中,==比較的是字元串的記憶體位址,字元串相等用q1.equals(q2)

數組定義

int[] len=new int[length]

此處動态聲明有長度

對象執行個體化要在main中

private是不同包下的子類可見,注意是在類中可見,而不是對象中可見

靜态方法沒有重寫(static)

空指針不能調用對象方法,(傳回是一個空null,不能調用一些方法,會報空指針異常)

導model時維持原檔案名一緻

建立一個類對象時,會先加載父類的資源,然後才會加載子類的資源(static另外考慮,會先加載static的,然後按照這個考慮)

靜态資源無法通過this調用

代碼塊聲明的變量有作用域

枚舉中的屬性,必須位于枚舉元素的下邊,枚舉類的構造器預設私有

泛型不能放基本資料類型

單元測試,@before 是個很好玩的東西

Comparable内部比較器

泛型隻能放包裝類型

Java 中的兩種排序方式:

Comparable 自然排序。(實體類實作)

Comparator 是定制排序。(無法修改實體類時,直接在調用方建立)

同時存在時采用 Comparator(定制排序)的規則進行比較。

對于一些普通的資料類型(比如 String, Integer, Double…),它們預設實作了Comparable 接口,實作了 compareTo 方法,我們可以直接使用。

而對于一些自定義類,它們可能在不同情況下需要實作不同的比較政策,我們可以新建立 Comparator 接口,然後使用特定的 Comparator 實作進行比較。

comparable自然順序

comparator雜亂的順序也可以

run和start不能一起調用

子類異常不能抛出,原因有子類重寫父類方法,不能抛出比父類更大的異常(父類沒抛出異常,子類也不能)

本憨憨以前學習的是Python,是以對于Java中很多問題都感覺很熟悉,但有時候會找不到解決方法,很多時候多是依靠百度,做題時,或多或少會受到之前Python文法上的苦惱(文法要求格式不同,文法也有一定差異),雖然Java學起來相對有點吃力(以前Python學的也不是很好,做的一些爬蟲和資料分析挖掘相關的,但人很菜),但總體來講還是有較大收獲,還在持續學習和梳理後面多線程那些的筆記,不确定還會不會想起來放出來。

由于是我臨時想釋出,之前用的幕布寫的,複制出來不是md格式,是以一些筆記還沒有做好排版,後續如果有時間會做下排版問題。