本文是我和xqnode聯合創作,已收錄至我們的GitHub,歡迎大家給個Star:https://github.com/nxJava/nx_java
我們會持續更新,歡迎監督!
微信搜索:武哥聊編程,關注這個Java菜鳥~
文章目錄
地攤小故事
大家好,我是node哥哥,不知道你們最近有沒有發現,地攤經濟火了!
都說,站在風口上,豬都能飛得起來。這不,你看我們武哥就非常有生意頭腦,敏銳地嗅查到了這一波商機,準備乘着這個風口表演一把飛豬跳龍門。
這天,武哥早早的開車過來找我,準備聊聊一起合夥擺攤的事,武哥這個人非常厚道,有好事總是不忘記帶兄弟一把,情深義重,但是缺點也很明顯,太騷!
老遠的看到武哥梳着油頭,點一根菸45°仰望天空,彷彿這個世界上就他最迷人的樣子(其實很欠扁,路人看到都想踹他兩jio),我慌忙上去打招呼。
我:(假裝奉承)武哥,來啦?許久不見,還是那麼帥啊!
武哥:(轉頭看我一眼,挑一下眉毛,笑容逐漸放肆開來):哎喲,這不是node小哥哥嗎?上次一別,多日未見,真是有點想念啊!還記得那個夜晚嗎?我們在咖啡廳裏,聽着浪漫的音樂,一起探討人生和理想…
我:(突然背後發涼,打了一個激靈)打住打住!什麼人生?什麼理想?你也太扯了。咱們上次不是學的Java數據類型嗎?你忘了嗎?4類8種,你還舉了幾個小例子。雖然你講的不錯,但這不代表你可以胡言亂語啊,光天化日,朗朗乾坤的,注意點自己大佬的身份好不好?
武哥:害!開個玩笑嘛~ 哈哈~ 看把你急的,小臉都開始泛紅了。(說着就往我這邊靠近)
我:(有點方,但故作鎮定,氣場不能輸)臥槽?武哥,你不會真有那方面的癖好吧?…
武哥:啥癖好?(不動聲色的扣了下鼻屎)
我:(一陣嫌棄)咳咳… 沒啥,對了,你來不是說商量一起擺地攤嗎?是有什麼好想法嗎?
武哥:(一拍大腿,鼻屎恰好落在褲子上)對!差點忘了正事。我這次來就是爲了跟你商量下襬地攤的事兒。你看了嗎?最近微信朋友圈都在轉擺地攤的文章,說地攤經濟要火了。
我:看了啊,確實是,很多類似這樣的:
武哥:哈哈~ 這個圖太形象了,可是我怎麼看這個賣假髮的有點殺馬特的意思?難道這年頭流行返璞歸真嗎?不過我感覺這個賣假髮的要火!大家都知道,程序猿最寶貴的就是頭髮了,平時加個班熬個夜都是家常便飯,搞不好遇到項目上線還得來個通宵。這熬的太狠了,傷肝傷腎傷頭髮,眼看着20幾歲的小夥子變成大爺的模樣,他們也愁啊。咱們可以地攤帶貨,就賣生髮洗髮水啊,護髮素啊這些的,甚至可以來一個全方位洗護套餐,標題我都想好了: 關愛程序員,從頭開始! 艾,甚至像什麼匯仁腎寶,印度神油也可以多進幾盒!你想現在多少人因爲那方面問題搞的家庭不和睦,生活不幸福的?咱們就是要解決用戶的痛點問題!而且專挑在科技園的門口賣,肯定賺!
我:臥槽?武哥,這你都想得到?莫不是你也有那方面的難言之隱?
武哥:(翻了個白眼)你妹的!你纔有,我還年輕着呢!我這可是真真切切從用戶需求出發!給他們送福利來的!
我:對,科技園程序猿還是很多的,每天的流量也大,咱們這個又是剛需,說不定到時候供不應求,趁機漲一波價,大賺一筆!哈哈哈~
武哥:我彷彿聞到了錢的味道…哈哈~ 我真是個商業天才!
我:先別高興太早啊。咱們擺攤,可是這啥也沒有啊,搞啥子?你有貨源嗎?你有車嗎?你知道哪裏可以賣哪裏違規嗎?到時候搞不好違規了還被逮到了就完蛋了。
武哥:哦。也是。咱們得好好合計合計啊。不過你也不用太擔心,聽說現在城管們都有指標,每個人發展三個地攤商家。
我:這麼牛皮嗎?那我們就可以放心幹了!不過我個人覺得吧,咱們先去做個市場調研,看看哪些東西好賣,一般在哪個地段比較火,每天收入支出的比例大概是多少。咱們不打無準備的仗,你覺得呢?
武哥:你說的很對,我們先去看看,這個不着急,需要從長計議。
我:對啊,反正現在禿了半邊的程序員太多了,搞個相關的產業肯定得火。
武哥:對,搞起搞起。
…
從那以後,我跟武哥開始了到處聯繫商家搞貨賣貨的日子,每天東奔西跑,過得很充實…
就這麼過了一陣子,本來做着發財夢的我們卻沒想到我們的地攤倒閉了…
原因是武哥太騷,經常跑過去找路過的小姐姐要微信,勾搭妹子,推銷他那個什麼印度神油,說這玩意兒可以塗在身上按摩,還保證用完皮膚光澤潤滑,嚇得小姐姐去消費者協會舉報,然後…我們就這麼失業了。
武哥只能被迫把車賣了還債,大佬變屌絲,開始了跟我一起流浪的生活…
偶然一次,看到一個地攤的UP主在直播Java,我們偷偷跑過去聽了一會,臥槽,居然滿滿的乾貨?嚇得我們趕緊點贊關注,學習學習成功人士的經驗。
只見那位大佬講的是Java的關鍵字這個知識點,我又回憶起我當初學Java的場景,肚中一陣飢餓感襲來,伴隨着咕嚕咕嚕的聲響。算了一下,2天沒喫飯了,突然眼淚不爭氣地流了下來。如果當初我好好學習Java,我也不至於流落至此啊!我好恨啊!
這次,爲了讓更多的人不餓肚子,我決定分享出大佬的講課筆記。不要感謝我,要謝就謝武哥吧。他是真不容易,爲了要一份講課資料,一把鼻涕一把眼淚的,塗得大佬滿身都是,大佬很絕望,無奈下分享出乾貨,武哥這才罷休,開心的像一個一百斤的孩子(瘦的只剩一百了)…
乾貨
Java 有一系列的關鍵字,在代碼中各自有自己的重要用途與意義,今天就帶着大家一起來了解一下 Java 的關鍵字!
Java 的關鍵字特別多,本文先主要介紹一下各個關鍵字的用途,然後重點介紹一下 final、static 和 this 這三個常用的關鍵字,其他的關鍵字大家用到的時候可以去網上查一下。
Java關鍵字彙總
數據類型 | 含義 |
---|---|
abstract | 表明類或者成員方法具有抽象屬性 |
assert | 斷言,用來進行程序調試 |
boolean | 基本數據類型之一,布爾類型 |
break | 提前跳出一個塊 |
byte | 基本數據類型之一,字節類型 |
case | 用在switch語句之中,表示其中的一個分支 |
catch | 用在異常處理中,用來捕捉異常 |
char | 基本數據類型之一,字符類型 |
class | 聲明一個類 |
const | 保留關鍵字,沒有具體含義 |
continue | 回到一個塊的開始處 |
default | 默認,例如,用在switch語句中,表明一個默認的分支 |
do | 用在do-while循環結構中 |
double | 基本數據類型之一,雙精度浮點數類型 |
else | 用在條件語句中,表明當條件不成立時的分支 |
enum | 枚舉 |
extends | 表明一個類型是另一個類型的子類型,這裏常見的類型有類和接口 |
final | 用來說明最終屬性,表明一個類不能派生出子類,或者成員方法不能被覆蓋,或者成員域的值不能被改變,用來定義常量 |
finally | 用於處理異常情況,用來聲明一個基本肯定會被執行到的語句塊 |
float | 基本數據類型之一,單精度浮點數類型 |
for | 一種循環結構的引導詞 |
goto | 保留關鍵字,沒有具體含義 |
if | 條件語句的引導詞 |
implements | 表明一個類實現了給定的接口 |
import | 表明要訪問指定的類或包 |
instanceof | 用來測試一個對象是否是指定類型的實例對象 |
int | 基本數據類型之一,整數類型 |
interface | 接口 |
long | 基本數據類型之一,長整數類型 |
native | 用來聲明一個方法是由與計算機相關的語言(如C/C++/FORTRAN語言)實現的 |
new | 用來創建新實例對象 |
package | 包 |
private | 一種訪問控制方式:私用模式 |
protected | 一種訪問控制方式:保護模式 |
public | 一種訪問控制方式:共用模式 |
return | 從成員方法中返回數據 |
short | 基本數據類型之一,短整數類型 |
static | 表明具有靜態屬性 |
strictfp | 用來聲明FP_strict(單精度或雙精度浮點數)表達式遵循IEEE 754算術規範 [1] |
super | 表明當前對象的父類型的引用或者父類型的構造方法 |
switch | 分支語句結構的引導詞 |
synchronized | 表明一段代碼需要同步執行 |
this | 指向當前實例對象的引用 |
throw | 拋出一個異常 |
throws | 聲明在當前定義的成員方法中所有需要拋出的異常 |
transient | 聲明不用序列化的成員域 |
try | 嘗試一個可能拋出異常的程序塊 |
void | 聲明當前成員方法沒有返回值 |
volatile | 表明兩個或者多個變量必須同步地發生變化 |
while | 用在循環結構中 |
是不是不列不知道,一列嚇一跳,原來 Java 裏還有這麼多關鍵字,大部分我們平時都在用,只是沒有特意去注意這個而已。所以大部分大家都很熟了,有些不常用的我也不總結了,我接下來主要總結幾個比較有代表性的關鍵字。
final 關鍵字
Java 中的 final 關鍵字可以用來修飾類、方法和變量(包括實例變量和局部變量)
final 修飾類
使用final修飾類則該類不能被繼承,同時類中的所有成員方法都會被隱式定義爲final方法(只有在需要確保類中的所有方法都不被重寫時才使用final修飾類)。final修飾類的成員變量是可以更改的
public final class FinalClass{
int i = 1;
void test(){
System.out.println("FinalClass:test");
}
public static void main( String[] args ){
FinalClass ficl = new FinalClass();
System.out.println("ficl.i = " + ficl.i);
ficl.i = 2;
System.out.println("ficl.i = " + ficl.i);
}
}
final 修飾方法
使用final修飾方法可以將方法“鎖定”,以防止任何繼承類對方法的修改,也即使用final修飾方法,則子類無法重寫(但並不影響繼承和重載,即子類調用父類方法不受影響)。
final 修飾變量
使用final關鍵字修飾變量是使用最多的情況。
使用final修飾變量的值不能做再次更改,即不能重新賦值。
- 如果final修飾的變量是基本數據類型,則變量的值不可更改;
- 如果final修飾的變量是引用數據類型,則該變量不能再次指向其他引用(如重新指向新的對象或數組)但是該變量本身的內容可以再做修改(如數組本身的內容,或者對象的屬性的修改)。
無論final修飾實例變量還是局部變量,都必須在使用前顯式賦初值。
- Java中的實例變量系統會對其默認賦初值,但是局部變量必須先聲明後賦值再使用。
- 雖然對於實例變量,系統會默認賦初值,但是Java仍然規定final修飾的實例變量必須顯式賦初值。實例變量顯式賦值的時機可以是在聲明時直接賦值,也可以先聲明,後在構造方法中賦值(對於含有多個構造方法,必須在每個構造方法中都顯示賦值)。
我們來看個例子:
public void fun(){
//BufferedImage src = null;//0. 聲明的同時賦值
BufferedImage src;//1. 這裏不用賦初值,也不會出錯
try{
src = ImageIO.read(new File("1.jpg"));//2.
} catch (Exception e){
//3. 如果出異常了就會進入這裏,那麼src可能無法被賦值
}
System.out.println(src.getHeight()); //4. src不一定有值,所以無法使用
}
如果靜態變量同時被final修飾則可以將變量視爲全局變量,即在整個類加載期間,其值不變。(static保證變量屬於整個類,在類加載時只對其分配一次內存;final保證變量的值不被改變)
static 關鍵字
static方法一般稱作靜態方法,由於靜態方法不依賴於任何對象就可以進行訪問,因此對於靜態方法來說,是沒有this的,因爲它不依附於任何對象,既然都沒有對象,就談不上this了。並且由於這個特性,在靜態方法中不能訪問類的非靜態成員變量和非靜態成員方法,因爲非靜態成員方法/變量都是必須依賴具體的對象才能夠被調用。
但是要注意的是,雖然在靜態方法中不能訪問非靜態成員方法和非靜態成員變量,但是在非靜態成員方法中是可以訪問靜態成員方法/變量的。也就是說,反過來是可以的。
如果說想在不創建對象的情況下調用某個方法,就可以將這個方法設置爲static。static修飾成員方法最大的作用,就是可以使用"類名.方法名
"的方式調用方法,避免了new出對象的繁瑣和資源消耗。
我們最常見的static方法就是main方法。至於爲什麼main方法必須是static的,這是因爲程序在執行main方法的時候沒有創建任何對象,因此只有通過類名來訪問。
static 變量
static變量也稱作靜態變量,靜態變量和非靜態變量的區別是:靜態變量被所有的對象所共享,在內存中只有一個副本,它當且僅當在類初次加載時會被初始化。而非靜態變量是對象所擁有的,在創建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。
static成員變量的初始化順序按照定義的順序進行初始化。
static 代碼塊
static塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被加載的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。爲什麼說static塊可以用來優化程序性能,是因爲它的特性:只會在類加載的時候執行一次。
所謂的代碼塊就是當我們初始化static修飾的成員時,可以將他們統一放在一個以static開始,用花括號包裹起來的塊狀語句中。例如:
class Person{
private Date birthDate;
public Person(Date birthDate){
this.birthDate = birthDate;
}
boolean isBornBoomer(){
Date startDate = Date.valueOf("1946");
Date endDate = Date.valueOf("1964");
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}
isBornBoomer是用來這個人是否是1946-1964年出生的,而每次isBornBoomer被調用的時候,都會生成startDate和birthDate兩個對象,造成了空間浪費,如果改成這樣效率會更好:
class Person{
private Date birthDate;
private static Date startDate,endDate;
static{
startDate = Date.valueOf("1946");
endDate = Date.valueOf("1964");
}
public Person(Date birthDate){
this.birthDate = birthDate;
}
boolean isBornBoomer(){
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}
將一些只需要進行一次的初始化操作都放在static代碼塊中進行。
this 關鍵字
this代表它所在函數所屬對象的引用。簡單說:哪個對象在調用this所在的函數,this就代表哪個對象。this關鍵字主要有以下三個作用:
- this調用本類中的屬性,也就是類中的成員變量;
- this調用本類中的其他方法;
- this調用本類中的其他構造方法,調用時要放在構造方法的首行。(this語句只能定義在構造函數的第一行,因爲在初始化時須先執行)
引用成員變量
public class Person{
String name; //定義成員變量name
private void SetName(String name) { //定義一個參數(局部變量)name
this.name=name; //將局部變量的值傳遞給成員變量
}
}
雖然我們可以看明白這個代碼的含義,但是作爲Java編譯器它是怎麼判斷的呢?到底是將形式參數name的值傳遞給成員變量name,還是反過來將成員變量name的值傳遞給形式參數name呢?也就是說,兩個變量名字如果相同的話,那麼Java如何判斷使用哪個變量?此時this這個關鍵字就起到作用了。this這個關鍵字其代表的就是對象中的成員變量或者方法。也就是說,如果在某個變量前面加上一個this關鍵字,其指的就是這個對象的成員變量或者方法,而不是指成員方法的形式參數或者局部變量。
調用類的構造器方法
public class Person {
public Person(){ //無參構造器方法
this(“Hello!”);
}
public Person(String name){ //定義一個帶形式參數的構造方法
}
}
在上述代碼中,定義了兩個構造方法,一個帶參數,另一個沒有帶參數。在第一個沒有帶參數的構造方法中,使用了this(“Hello!”)這句代碼,這句代碼表示什麼含義呢?在構造方法中使this關鍵字表示調用類中的構造方法。
如果一個類中有多個構造方法,因爲其名字都相同,跟類名一致,那麼這個this到底是調用哪個構造方法呢?其實,這跟採用其他方法引用構造方法一樣,都是通過形式參數來調用構造方法的。
注意的是:利用this關鍵字來調用構造方法,只有在無參數構造方法中第一句使用this調用有參數的構造方法。否則的話,翻譯的時候,就會有錯誤信息。這跟引用成員變量不同。如果引用成員變量的話,this關鍵字是沒有位置上的限制的。
返回對象的引用
public HttpConfig url(String url) {
urls.set(url);
//return this就是返回當前對象的引用(就是實際調用這個方法的實例化對象)
return this;
}
return this就是返回當前對象的引用(就是實際調用這個方法的實例化對象),就像我們平時使用StringBuilder一樣,可以一直.append()
,因爲每次調用,返回的都是該對象的引用。
關於關鍵字,這篇文章就總結這麼多,大佬的直播也剛好結束了。跟大佬互加了微信,聊了幾句才知道原來大佬也是CSDN博客專家,半天才認出來武哥,畢竟武哥當初也是盛名在外,要不是搞什麼神油…哎,不說了,都是淚水啊!
如果覺得有幫助,希望老鐵們來個三連擊,給更多的人看到這篇文章
1、關注我的原創微信公衆號「武哥聊編程」,專注於Java、數據結構和算法、微服務、中間件等技術分享,保證你看完有所收穫。
2、給俺點個贊唄,可以讓更多的人看到這篇文章,順便激勵下我繼續寫作,嘻嘻。
作者info
【作者】:武哥
【公衆號】:武哥聊編程。歡迎大家關注~
【作者簡介】:同濟大學,碩士。先後在華爲、科大訊飛、拼多多采坑。一個自學 Java 的菜鳥,期待你的關注。
點贊是對我最大的鼓勵
↓↓↓↓↓↓