Java語法

類:類是一個模板,描述一類對象的行為和狀態(tài)

對象:對象是類的一個實(shí)例,有狀態(tài)和行為;比如說。一只狗,狀態(tài)就是他有品種,名字,顏色等,行為

有搖尾巴,叫,吃等

方法:方法就是行為,一個類可以有很多方法,邏輯運(yùn)算,數(shù)據(jù)



修改等都是在方法中完成的

實(shí)例變量:每個對象都有自己的實(shí)例變量,對象的狀態(tài)就是由這些實(shí)例變量的值決定的



Java基本數(shù)據(jù)類型

變量是申請內(nèi)存來儲值,當(dāng)創(chuàng)建變量的時候需要在內(nèi)存中申請空間

根據(jù)變量的類型來為變量分配存儲空間,只用來儲存該類型數(shù)據(jù)

Java兩大數(shù)據(jù)類型

內(nèi)置數(shù)據(jù)類型和引用數(shù)據(jù)類型



內(nèi)置數(shù)據(jù)類型

八種內(nèi)置數(shù)據(jù)類型(六種數(shù)字?jǐn)?shù)據(jù)類型,一種字符類型還有一種布爾類型)

不用記范圍,直接打印輸出? Inteager.size 這樣就可以打印出范圍



引用數(shù)據(jù)類型

引用數(shù)據(jù)類型類似于指針,引用類型指向一個對象,指向?qū)ο蟮淖兞烤褪且米兞俊?/p>

這些變量在聲明時被指定為一個特定的類型,一旦申明變量,類型就不能改變。

對象,數(shù)組都是引用數(shù)據(jù)類型

所有引用類型的默認(rèn)值都是null


變量類型

類變量:獨(dú)立與方法之外的變量,用ststic修飾

實(shí)例變量:獨(dú)立與方法之外的變量,不用ststic修飾

局部變量:類的方法中的變量



Java 局部變量

局部變量聲明在方法、構(gòu)造方法或者語句塊中;

局部變量在方法、構(gòu)造方法、或者語句塊被執(zhí)行的時候創(chuàng)建,當(dāng)它們執(zhí)行完成后,變量將會被銷毀;

訪問修飾符不能用于局部變量;

局部變量只在聲明它的方法、構(gòu)造方法或者語句塊中可見;

局部變量是在棧上分配的。

局部變量沒有默認(rèn)值,所以局部變量被聲明后,必須經(jīng)過初始化,才可以使用。



java修飾符



Java方法

方法定義的格式:

修飾符 返回值類型 方法名稱 (參數(shù)類型? 參數(shù)名稱){

方法體

return? 返回值;

}

解釋:

修飾符:目前有固定寫法。兩個關(guān)鍵字 public static

返回值類型:方法最終的數(shù)據(jù)是什么類型

方法名稱:自定義的名字,首字母小寫,從第二個單詞開始每個單詞首字母大寫

參數(shù)類型:進(jìn)入方法的數(shù)據(jù)是什么類型

參數(shù)名稱:進(jìn)入方法的數(shù)據(jù),對應(yīng)的名稱

方法體:需要執(zhí)行的若干行代碼

return :第一個作用一旦執(zhí)行結(jié)束當(dāng)前方法,第二帶著后面的返回值交給調(diào)用處

返回值:方法的最終數(shù)據(jù)

注意事項(xiàng):

返回值類型必須和返回值對應(yīng)

如果參數(shù)多個,那么使用都用逗號分隔

如果不需要參數(shù),那么小括號可以留空

定義一個沒有返回值的方法

修飾符 void 方法名稱 (參數(shù)類型 參數(shù)名稱){

方法體

return ;//最后一行的return一般都是省略不寫

}

注意事項(xiàng)

1.返回值沒有不代表沒有參數(shù),參數(shù)和返回值沒有必然聯(lián)系

2.不能return一個具體的返回值

viod沒有返回值

3.如果最后一行是“return”,那么可以不寫,寫與不寫完全等效

4.沒有返回值的方法,只能使用單獨(dú)調(diào)用,不能使用打印調(diào)用或者賦值調(diào)用【重要】







返回值

只能有一個或者沒有




demo 遍歷數(shù)組

1.將數(shù)組中的元素逐一打印出來

2’定義一個數(shù)組

*返回值類型:只是打印顯示而已,沒有結(jié)果數(shù)據(jù),所以用void

*方法名稱:printArray

*參數(shù)列表:需要給我一個數(shù)組,我才能遍歷它,所以需要一個int【】數(shù)組

3.調(diào)用方法:傳入一個數(shù)組



有無返回值的對比

對比兩種情況:

1.定義一個方法,用來【求出】數(shù)組元素的總和(告訴我最終的結(jié)果)

2.定義一個方法,用來【打印】數(shù)組元素的總和(自己打印就得了,不用告訴我結(jié)果)

結(jié)論:

需要計算的有返回值

只需要打印的就沒有返回值



方法的重載(Overload )

方法重載:方法的名稱相同,但是參數(shù)列表不同(Overload)

達(dá)到效果:對于類似功能的多個方法,只要記住一個相同的名字即可,可以根據(jù)參數(shù)列表的不同自動適配

注意事項(xiàng):

1.參數(shù)個數(shù)不同

2.參數(shù)類型不同

3.參數(shù)的多類型的順序不同(表達(dá)式當(dāng)中需要運(yùn)算的數(shù)據(jù)類型不一樣,怎么辦?誰的數(shù)據(jù)范圍大,結(jié)果就是誰):比如先int后double,先double后int

重載與下列因素?zé)o關(guān):

1.與返回值類型無關(guān),無法根據(jù)返回值的不同進(jìn)行重載;

2.與參數(shù)的名稱無關(guān),比如int a,int b和int x,int y;



參數(shù)傳遞

參數(shù)傳遞:在調(diào)用方法的時候,向方法內(nèi)傳入一些數(shù)據(jù)的動作

【形式參數(shù)】:在“定義”方法的時候,寫在小括號之內(nèi)的參數(shù)

例如:public static? int sum(int a,int b){...}這里的a和b是在定義的時候?qū)懙?,所以就是形式參?shù)

【實(shí)際參數(shù)】;在“調(diào)用”方法的時候,真正傳入方法里的數(shù)據(jù),叫做實(shí)際參數(shù)

例如:int num=sum(10,20),這里的10和20是在調(diào)用方法的時候傳入方法的,所以他們是實(shí)際參數(shù)


參數(shù)傳遞的過程中,有兩項(xiàng)規(guī)則

1.對于基本數(shù)據(jù)類型(以及String)來說,形式參數(shù)的操作不會影響實(shí)際參數(shù)

2.對于引用數(shù)據(jù)類型(除了String)來說,形式參數(shù)的操作會影響到實(shí)際參數(shù)



類的定義

類是用來模仿現(xiàn)實(shí)事物的代碼手段,事物分為屬性,行為兩個部分,類中也對應(yīng)的包含了兩個部分

1.成員變量(屬性):將變量位置直接定義在類中,在方法外即為成員變量

2.成員方法(行為):將普通的方法去掉stataic關(guān)鍵字,即為成員方法



兩個對象內(nèi)存圖

一個對象


對比局部變量和成員變量的不同

1.定義的位置不同【重點(diǎn)記憶】

局部變量:定義在方法內(nèi)部

成員變量:直接定義在類中,在方法外面的


2.內(nèi)存中的位置不一樣

局部變量:在棧內(nèi)存中,stack

成員變量:在堆內(nèi)存中,heap


3.生命周期不一樣

局部變量:隨著方法的進(jìn)棧而出現(xiàn),隨著方法的出棧而消失

成員變量:隨著對象被創(chuàng)建而出現(xiàn),隨著對象被JVM回收而消失


4.默認(rèn)值不一樣【重點(diǎn)記憶】

局部變量:沒有默認(rèn)值,必須賦值之后才能使用

成員變量:如果沒有賦值,那么會有一個默認(rèn)值



private關(guān)鍵字

一旦使用了private關(guān)鍵字對成員進(jìn)行了修飾,那么超出了本類范圍之外,就不能訪問了

如果需要使用private修飾的成員變量,可以使用“間接訪問”

為private成員變量編寫一對兒Setter Getter方法

例如:

在最前方加上一個private?

專門定義了一個成員方法用來設(shè)置成員變量的數(shù)據(jù),Setter方法

public void setAge (int num){

? ? ?age = num;

}

專門定義了一個方法用來獲取成員變量的數(shù)據(jù),Getter方法

public void getAge(){

return age;

}



this關(guān)鍵字

當(dāng)局部變量與和成員變量重名的時候,方法中會根據(jù)“就近原則”使用局部變量

如果希望區(qū)分一下

this.成員變量名


this關(guān)鍵字的靜電作用:將重名的成員變量和局部變量區(qū)分開


擴(kuò)展:

this關(guān)鍵字其實(shí)代表的是“當(dāng)前對象”:通過誰調(diào)用了方法,誰就是this



構(gòu)造方法:

專門用來創(chuàng)建對象的方法,當(dāng)通過new關(guān)鍵字創(chuàng)建對象時,其實(shí)就是在調(diào)用構(gòu)造方法

格式:

public 構(gòu)造方法名 (參數(shù)類型 參數(shù)名稱){

方法體

return? //通常最后一行return省略不寫

注意:

1.構(gòu)造方法不能寫放回值類型,連void都不能寫

2.構(gòu)造方法的名稱必須和所在的類名完全一樣,連大小寫也要一樣

}

3.構(gòu)造方法的調(diào)用格式就是創(chuàng)建對象的格式?


構(gòu)造方法重載的好處:

定義一個無參數(shù)的構(gòu)造方法,可以直接new對象

定義一個重載的全參數(shù)的構(gòu)造方法,可以在new對象的同時方便對成員變量進(jìn)行賦值

注意事項(xiàng):

1.構(gòu)造方法根本不寫返回值類型,連void都不寫

2.構(gòu)造方法的名稱和所在類名稱必須完全相同,連大小寫都要一樣

3.構(gòu)造方法也是可以進(jìn)行承載的

4.構(gòu)造方法如果沒有自定義,那么將會默認(rèn)贈送一個,如果自定義了至少一個,那么就不再贈送默認(rèn)的


如何定義一個標(biāo)準(zhǔn)的類:

1.所有的成員變量都需要使用private關(guān)鍵字私有化

2.為每一個成員變量編寫一對Getter Setter 方法

3.編寫一個無參數(shù)的構(gòu)造方法

4.編寫一個全參數(shù)的構(gòu)造方法



布爾類型的boolean值,那么setXxx規(guī)則不變,而getXxx余姚寫成isXxx的形式

private boolean male;

public void setMale(boolean male){

? ? this.male = male;

}

public boolean isMale (){

return male;

}



字符串的兩個問題

1.對象肯定有一個類與之對應(yīng),那么字符串對應(yīng)的類是誰,String

為什么String這個類,不需要導(dǎo)包就可以直接用?


所有的類都需要導(dǎo)包才能使用,除了兩種情況

a. 要使用的目標(biāo)類,和當(dāng)前類位于同一個包下

b.要使用的目標(biāo)類,位于java.lang包下,但是不包含子包內(nèi)容


2.既然字符串是對象,那么為什么直接打印出來就是內(nèi)容呢?

打印println方法 邏輯:

1.如果是字符串類型,那么就直接顯示內(nèi)容

2. 如果不是字符串類型,那么就想辦法內(nèi)部轉(zhuǎn)換成字符串,然后再顯示

一般的對象都是使用“類型信息+@+地址值”作為字符串內(nèi)容的



字符串池

字符串是最為常用的對象,所以在程序設(shè)計中往往會出現(xiàn)很多個重復(fù)的字符串

為了節(jié)省內(nèi)存,所以引入了“字符串池”的設(shè)計,可以重復(fù)利用字符串


關(guān)于字符串池的幾點(diǎn)描述

1.字符串池是位于堆內(nèi)存中的一小塊空間,用來保存若干個字符串的地址值

2.字符串池當(dāng)中絕對不會重復(fù)的字符串對應(yīng)的地址,保證字符串不重復(fù)

3.凡是直接雙引號的字符串默認(rèn)都在池中,而new出來的字符串默認(rèn)不在池中


對于基本類型來說,==是進(jìn)行數(shù)據(jù)內(nèi)容的相同比較,但是對于引用類型來說,==是進(jìn)行地址值的相同比較

如果是兩個對象,那么地址值必然不同,如果地址值相同,那么必然是同一個對象




字符串的內(nèi)容不可變

字符串對象在內(nèi)存中一旦被創(chuàng)建,那么內(nèi)容不可以改變

字符串的內(nèi)容不會發(fā)生改變,每當(dāng)你覺得昊想是變了的時候,一定是創(chuàng)建了新的字符串



字符串的比較方法

如果使用 == 進(jìn)行比較,那么是進(jìn)行地址值的相同判斷

如果希望進(jìn)行字符串的內(nèi)容比較,則需要使用String當(dāng)中的成員方法


public? boolean equals (object obj); 進(jìn)行字符串的內(nèi)容比較,嚴(yán)格區(qū)分大小寫。參數(shù)obj就是另一個對象(跟誰比 )。object也是一種類型,可以接受任何類型的數(shù)據(jù)

public boolean equalsIgnoreCase(String str);進(jìn)行字符串的內(nèi)容比較,但是忽略大小寫?


注意事項(xiàng):

1.要想進(jìn)行字符串的內(nèi)容比較,一定要使用equals方法,你要使用==運(yùn)算

2.equals方法具有對稱性,a.equals(b)和b.equals(a)效果一樣

3. 小技巧,如果equals方法需要比較的兩個字符串當(dāng)中,有一個是常量,那么盡量將常量寫在前面

4.直接寫上的雙引號就是字符串對象,所以用雙引號直接點(diǎn)兒也能調(diào)用方法。



字符串的替換方法(敏感詞過濾)

如果希望將字符串當(dāng)中指定的部分進(jìn)行替換操作,需要使用


public String replace (CharSequence olderStr,CharSequence newStr);將字符串當(dāng)中所有出現(xiàn)的older部分,替換成為newOlder部分

參數(shù)olderStr代表需要替換的老字符串部分

參數(shù)newStr代表需要替換成為的新字符串部分

參數(shù)類型CharSequence現(xiàn)階段可以簡單地認(rèn)為就是字符串String



字符串切割方法

使用方法

public String[] split(String regex);將regex作為標(biāo)記進(jìn)行切刀,返回切分之后的若干段字符串(字符串?dāng)?shù)組)

注意事項(xiàng):

現(xiàn)階段強(qiáng)烈推薦不要使用英文句點(diǎn)作為分割的標(biāo)記

因?yàn)橛⑽木潼c(diǎn)在正則表達(dá)式中有特殊含義

如果一定要使用英文句點(diǎn),切割的標(biāo)記應(yīng)該使用“//.”(現(xiàn)階段的固定寫法)

而參數(shù)regex其實(shí)就是一個正則表達(dá)式??



集合

集合和已經(jīng)學(xué)過的數(shù)組比較類似,本身也是一種引用類型。也可以存放很多個數(shù)據(jù)

區(qū)別在于數(shù)組的長度不可以改變,集合的長度可以任意改變

集合包含很多種,ArrayList,HashSet,LinkedList,HashMap......

現(xiàn)階段我們只學(xué)習(xí)最為簡單的ArrayList一種即可,其他的集合類似


使用:

java.util.ArrayList是一個類,使用三步,導(dǎo)包,創(chuàng)建,使用??

1.導(dǎo)包

import java.util.ArrayList

2.創(chuàng)建?

類名稱 對象名 = new 類名稱();

ArrayList<泛型> Array = new ArrayList<>();

泛型,也就是集合當(dāng)中存放的都是同意類型的數(shù)據(jù)

注意:泛型只能是引用類型,不能是基本類型


3.使用 :



如何在集合中存儲基本數(shù)據(jù)類型

基本類型? ? ? ?對應(yīng)的包裝類

byte? ? ? ? ? ? ? ? ? Byte

short? ? ? ? ? ? ? ? ?Short

int? ? ? ? ? ? ? ? ? ? Integer? ? ?【特殊】

long? ? ? ? ? ? ? ? ? Long

float? ? ? ? ? ? ? ? ? Float

double? ? ? ? ? ? ?Double

char? ? ? ? ? ? ? ? Character? ? 【特殊】

boolean? ? ? ? ? ?Boolean

從jdk1.5開始,基本數(shù)據(jù)類型可以和對應(yīng)的包裝類進(jìn)行自動裝箱拆箱

裝箱:基本類型-->包裝類

拆箱:包裝類 -->基本類型



如何在集合中儲存自定義數(shù)據(jù)類型



io流:

I:input,輸入

o:output,輸出

流:數(shù)據(jù)流



FileWriter 寫文件

1.導(dǎo)包:

import java.io.FileWhiter;

2.創(chuàng)建,構(gòu)造方法

public FileWriter(String fileName); 參數(shù)字符就是文件的路徑名稱

FileWriter fw = new FileWrite(“file01.txt”);

文件擴(kuò)展名只能決定默認(rèn)用什么軟件打開軟件,不能決定其內(nèi)容


3.使用:成員方法

寫數(shù)據(jù):public void write (String str);參數(shù)就是需要寫到文件中的字符串

關(guān)閉流:public void close();關(guān)閉釋放相關(guān)資源


總結(jié):

FileWriter基本使用步驟:創(chuàng),寫,關(guān)

注意事項(xiàng):

1.千萬不要忘記最后調(diào)用close方法進(jìn)行關(guān)閉

2.創(chuàng)建的時候,如果提示可能有異常,那么就點(diǎn)擊add throws...即可



FileWriter寫數(shù)據(jù)的覆蓋與追加

在使用FileWriter的時候:

1.如果指定的文件不存在,那么會自動創(chuàng)建該文件

2.如果指定的文件已經(jīng)存在,那么將會覆蓋寫入

3.如果必須希望進(jìn)行覆蓋寫入,而是希望追加,那么要用另外一種重載形式的構(gòu)造方法

public FileWriter (String fileName , boolean append);第二個參數(shù)為true值,那么將會追加寫入



文本文字就是數(shù)字

計算機(jī)當(dāng)中一切都是數(shù)字,文本文件當(dāng)中保存的就是數(shù)字

能夠看到文字圖形,是因?yàn)檐浖臀覀冞M(jìn)行了翻譯,翻譯的規(guī)則就是:

ASCii碼表,還有另外一張更大的表叫做Unicode碼表

后者包含了全世界所有數(shù)以萬計的文字


FileWriter提供了一種重載形式的write方法,可以直接根據(jù)數(shù)字寫文件

public void write(int ch);參數(shù)就是單個文字所對應(yīng)的數(shù)字值



FileWriter的重載形式



FileReader讀數(shù)據(jù)的一般步驟

用來將文本文件中的字符讀取到程序當(dāng)中

1.導(dǎo)包

import java.io.FileReader;

2.創(chuàng)建

public FileReader(String fileName);參數(shù)任然是文件的路徑名

FileReader fr = new FileReader("fileXxx.txt");

如果指定的文件名不存在,那么會直接報錯?

3.使用

讀取單個字符:public int read();讀取下一個字符,得到對應(yīng)的ASCII或者Unicode值

關(guān)閉流,釋放資源:public void close;

三個步驟:創(chuàng),讀,關(guān);



如何使用FileReader讀取字符數(shù)組

為了提高效率。FileReafer提供了另外一種重載形式的read方法


public int read(char[] buf);

參數(shù)是一個字符數(shù)組,用來承載讀取到的多個字符

返回值代表的是數(shù)組中讀取到的有效個數(shù)



BufferWriter的緩沖原理

BufferWriter和FileWriter差不多,也是一種用來寫文件的類,屬于字符輸出類

區(qū)別與BufferWriter肚子里有一個長度為8192的char[]性字符數(shù)組,當(dāng)作緩沖區(qū)使用

每次在寫數(shù)據(jù)時,實(shí)際上都是在不斷地向緩沖數(shù)組中添加字符

如果緩沖數(shù)組已經(jīng)滿了,那么將會統(tǒng)一的寫入到硬盤中去

如果還未寫滿,那么就等待下一次的寫入

如果最終關(guān)閉流的時候,數(shù)組任未滿,那么也會將剩余的有效部分寫到硬盤文件里



如何使用BufferedWriter?

1.首先創(chuàng)建一個普通的BufferedWriter

2.將這個普通的FileWriter包裝成為緩沖的BufferedWriter,用構(gòu)造方法

3.后面的BufferedWriter使用的方法和FileWriter基本一致

構(gòu)造方法

public Buffered(FileWriter fw);參數(shù)就是一個普通的FileWriter對象



BufferedReader的緩沖原理




接口

接口的好處:通用性,隔離性

?通用性:無論是醫(yī)生還是警察還是司機(jī)

通用全都當(dāng)作的學(xué)生對待

隔離性:無論是醫(yī)生還是警察還是司機(jī)

特有的功能與我無關(guān),我只關(guān)心學(xué)生相關(guān)的功能



接口的格式和組成部分

格式:

public interface 接口名稱{

? //

}

接口中的組成成分

1.抽象方法[學(xué)習(xí)重點(diǎn)]

2.常量

3.默認(rèn)方法(java8)

4.靜態(tài)方法(java8)

5.私有方法(java9)



接口中抽象方法定義

格式:

public abstract 返回值類型 方法名稱(參數(shù)類型 參數(shù)名稱);

注意:

1.接口中的抽象方法,修飾如果寫必須是public abstract

2.接口中的抽象方法,修飾符可以省略不寫。默認(rèn)就是public abstract

3.抽象方法只有方法頭,沒有方法體大括號



接口實(shí)現(xiàn)類的定義

如果想要使用定義好的接口,必須有一個接口的實(shí)現(xiàn)類

定義實(shí)現(xiàn)類格式為:

public class 實(shí)現(xiàn)類的名稱 implements? 接口名稱 {

? ? ?//一定要覆蓋寫所有的抽象方法

}

注意:

什 么是覆蓋重寫Override 抽象方法

1.也就是將接口當(dāng)中的抽象方法抄寫過來

2.去掉abstract關(guān)鍵字

3.寫上大括號方法體?


package day09demo01;

public class Catimplements Animal{

public? void eat (){

System.out.println("貓吃魚");

};//吃東西

? ? public void sleep (){

System.out.println("貓睡覺");

};//睡覺

}


Cat就是Animal接口的實(shí)現(xiàn)類,Cat類實(shí)現(xiàn)了Animal接口。



接口與實(shí)現(xiàn)類的基本使用

創(chuàng)建:

接口名稱 引用名 = new 實(shí)現(xiàn)類名稱();

調(diào)用:

引用名.抽象方法名(參數(shù));? ??

注意:

1.左面是接口類型,那么只能調(diào)用接口中定義好的內(nèi)容,無法調(diào)用左側(cè)實(shí)現(xiàn)類專有的方法

2.當(dāng)調(diào)用接口當(dāng)中的抽象方法時,真正進(jìn)行運(yùn)行的是右側(cè)new的時候類的具體實(shí)現(xiàn)方法內(nèi)容

3.總結(jié)記住一句話:調(diào)用的時候看左邊,運(yùn)行的時候看右邊



面向接口編程

使用接口作為左側(cè)類型的好處所在

屏蔽掉了右側(cè)的個性特有的內(nèi)容,達(dá)到隔離,統(tǒng)一的目的。


面向接口編程:

如果使用的功能,接口已經(jīng)可以滿足,那么就不在乎具體的類是誰,只在乎接口即可



Lambda表達(dá)式:(a,b)-> a + b

method方法需要一個Calaulator接口類型的參數(shù)

Lambda表達(dá)式就是充當(dāng)了Calculator接口類型的參數(shù)

初步理解:

1.Lambda表達(dá)式前面的小括號,其實(shí)就是接口抽象方法的小括號

2.箭頭代表拿著小括號的數(shù)據(jù)做什么事情,是一個指向的動作

3.箭頭后面就代表這拿到了參數(shù)之后做什么事


Lambda表達(dá)式的語義本身就是代表了怎么做這件事情,沒有對象概念在里面。



函數(shù)式接口

Java中使用Lambda表達(dá)式的前提是,必須有“函數(shù)式接口”

概念:有且僅有一個抽象方法的接口,叫做函數(shù)式接口?


如何才能萬無一失地檢測一下當(dāng)前的接口是不是函數(shù)式接口呢?

用一個固定的格式寫在public interface前一行即可

@FunctionalInterface

public interface 函數(shù)式接口名 {

? //? ...

}



Lambda的標(biāo)準(zhǔn)格式

Lambda表達(dá)式要想使用,一定要有函數(shù)式接口的推斷環(huán)境

1.要么通過方法的參數(shù)類型來確定是哪個函數(shù)式接口

要么通過賦值操作來確定哪個是函數(shù)式接口


Lambda的格式就是為了將抽象方法,翻譯成一下三點(diǎn)

1.一些參數(shù)(方法參數(shù))

2.一個箭頭

3.一些代碼(方法體)


例如抽象方法

public abstract int sum(int a,int b);


翻譯成為Lambda的標(biāo)準(zhǔn)格式

(int a,int b) -> {return a + b; }



Lambda表達(dá)式上下文推斷

調(diào)用方法的時候,參數(shù)類型是函數(shù)式接口,所以Lambda可以推斷出來是哪個接口

也可以根據(jù)賦值語句左側(cè)的類型來進(jìn)行Lambda上下文推斷



Lambda的簡便格式

1.在Lambda表達(dá)式當(dāng)中凡是可以推導(dǎo)的,都是可以省略的?

2.如果參數(shù)有且僅有一個,那么小括號可以省略

3.如果語句只有一個,那么大括號和return也可以省略



前面學(xué)習(xí)的代碼實(shí)現(xiàn)案例分析


1.創(chuàng)建一個集合用來存儲5個英雄

創(chuàng)建一個Hero類,代表英雄

把集合內(nèi)的對象換成hero對象

2.讀文件,吧數(shù)據(jù)加到集合當(dāng)中

3.判斷一下集合中有沒有內(nèi)容,是不是新的


如果是新的隊伍,沒有人,就需要創(chuàng)建五個對象加入到集合中

如果不是新的隊伍,已經(jīng)有人了,就不需要創(chuàng)建了

遍歷集合,輸出其中的每一個對象的具體信息//循環(huán)5次進(jìn)行遍歷//統(tǒng)計一下綜合戰(zhàn)斗力是多少

判斷一下集合是不是新的

if (isNew){

System.out.println("將集合重的數(shù)寫到文件中”);

}

//如果不是新的,就什么也不用做

System.out.println("退出游戲")



方法引用(java 8)

Stream流(java 8)

模塊化(java 9)



定義方法時,

有static的方法叫做靜態(tài)方法

沒有static的方法,叫做成員方法(實(shí)例方法)


定義靜態(tài)方法的格式:

public static 返回值類型 方法名稱(參數(shù)類型 參數(shù)名稱){

? ?//方法體

}


定義成員方法的格式:

public 返回值類型 方法名稱(參數(shù)類型 參數(shù)名稱){

? ?//方法體

}


調(diào)用靜態(tài)方法的格式

方法名(參數(shù)值);//直接調(diào)用本類中的靜態(tài)方法,本類中的靜態(tài)方法,也可以通過類名稱調(diào)用

類名稱.方法名(參數(shù)值);//調(diào)用另外一個類中的靜態(tài)方法

調(diào)用成員方法的格式:

? ? ?類名稱? 對象名? =? new 類名稱(); //首先創(chuàng)建對象

? ? ?對象名.成員方法名(參數(shù)值);? ?//通過對象名調(diào)用成員方法

同一類中直接調(diào)用:方法名(參數(shù)值);

再另外一個類中調(diào)用:類名稱.方法名(參數(shù)值);



成員方法調(diào)用

沒有static ,這是一個成員方法(實(shí)例方法,Instance Method)

需要調(diào)用成員方法就必須借助對象。


注意:

如果不創(chuàng)建對象,那么通過類名稱只能調(diào)用靜態(tài)方法。

如果創(chuàng)建了對象,那么通過對象名可以調(diào)用成員方法

通過對象名也可以調(diào)用靜態(tài)方法,然而不推薦這么做



Lambda表達(dá)式冗余場景

在某些場景之下,Lambda表達(dá)式要做的事情,其實(shí)在另外一個地方已經(jīng)寫過了

那么此時如果通過Lambda表達(dá)式重復(fù)編寫相同的代碼,就是浪費(fèi)。



方法引用的更優(yōu)寫法

在寫Lambda表達(dá)式的地方寫

方法引用:

如果Lambda表達(dá)式需要做的事情,在另一個類當(dāng)中已經(jīng)做過了,那么就可以直接拿過來進(jìn)行替換Lambda

方法引用的寫法:? ? ? ?


通過類名稱引用靜態(tài)方法的格式:

類名::靜態(tài)方法名

方法引用的另一個方法,通過對象引用成員方法格式:

對象名::成員方法名



Stream流的更優(yōu)寫法

day10Code



Stream流式思想




獲取Stream流的常用方法

java 8 當(dāng)中的“流“其實(shí)就是Stream接口的對象

JDK提供了一個流接口,java.util.stream.Stream<T>


如何獲取流?

1.根據(jù)集合獲取流:集合名稱.stream();

2.根據(jù)數(shù)組獲取流? :Stream.of(數(shù)組名稱);



Stream流的map映射方法:

獲取流之后,可以使用映射方法:map(用于轉(zhuǎn)換的Lambda表達(dá)式)

映射:就是將一個對象轉(zhuǎn)換成另一個對象,把老對象映射到新對象上



Stream流的filter過濾方法:

如果希望對流中的元素進(jìn)行過濾,可以使用過濾方法

filter(能產(chǎn)生boolean結(jié)果的Lambda),如果參數(shù)Lambda產(chǎn)生了true,則要元素;如果產(chǎn)生了false,則不要元素?



Stream流的forEach方法:

如果希望再流中進(jìn)行元素的遍歷操作,可以使用forEach方法

forEach(Lambda表達(dá)式),意思是,對流當(dāng)中的每一個元素都要進(jìn)行操作

參數(shù)Lambda表達(dá)式必須是一個能夠消費(fèi)一個參數(shù),而且不產(chǎn)生數(shù)據(jù)結(jié)果的Lambda

例如:

Lambda:? s -> System.out.println(s);

方法引用:? System::println



并發(fā)的Stream流

流當(dāng)中的元素如果特別多,那么只有一個人在逐一,挨個兒處理,肯定比較慢,費(fèi)勁

如果對流當(dāng)中的元素,使用多個人同時并發(fā)處理,這就是并發(fā)

注意事項(xiàng):

1.使用并發(fā)流的時候,到底有幾個人進(jìn)行同時操作呢?不用管,JDK自己處理

2.只要正確使用,就不會出現(xiàn)多個人搶到同一個元素的問題

3.如果已經(jīng)獲取了一個普通流,那么只要再調(diào)用一下parallel()方法也會變成并發(fā)流


總結(jié):

1.直接獲取并發(fā)流:.parallelStream()

2.已經(jīng)獲取了普通流,然后升級成為并發(fā)流:.stream().parallel()



模塊化思想概述

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容