菜鳥學習筆記:Java基礎篇1(基礎語法、物件導向)

呼呼哈哈嘿嘿發表於2020-10-13

寫在前面

第一次發部落格心裡還是有點小緊張啊,哈哈,先自我介紹一下,剛畢業小白一枚,接觸程式設計有兩年多了,在校期間做過各種各樣亂七八糟稀奇古怪的專案。不過大多是現學現賣的那種,這次想系統對之前學過的知識進行一次整理加強,同時釋出下自己的學習心得,加深記憶的同時,給各位剛剛接觸程式設計的同學一個參考。當然畢竟自己也是在學習的過程,書寫過程不免會有不對的地方,也歡迎各位大神的批評指正,大家共同進步!

關於學習資源

針對學習資源來說網上的資料各式各樣學習資源,但個人感覺對於小白來說還是以視訊為主,一開始不建議直接從API文件入手(除非你有足夠的天賦可以忽略我的建議),其一編寫文件的人都是有幾年工作經驗的老手,職業官話已經成為了一種習慣,要沒接觸過很多時候很難看懂。其二,跟著視訊敲程式碼學到的不僅是程式碼的API,同時還有良好的編成習慣以及一些檔案架構,對我們之後的工作很有幫助。對於視訊B站是一個不錯的資源寶庫(這裡非常感謝熱心的up主們),當然如果你有錢各大培訓機構資源數不勝數,你真的可以為所欲為。

關於學習方法

一般來說編成的學習就是理論+實踐(這不是廢話嘛),但要論重要性個人覺得理論佔四成實踐佔七成。說實話編成這東西是個熟練工,很多概念靠看是學不會的,只有你練過了、寫過了才能明白其中的道理,建議各位同學沒每學習一個階段就找一個小型專案練練手,夯實基礎的同時也能查漏補缺。
在學習過程中如果時間充裕最好可以邊看邊敲,記憶深刻。不過一般情況不會給我們那麼多時間,所以我建議先跟著視訊過一遍,到一個階段結束可以找一個小專案自己練習,肯定會有許多不明白的地方。這時候在回去看不明白的點,就會有一種溫故而知新的感覺。還有大家不要相信網上那種什麼幾個小時掌握Java之類的廣告,知識這東西沒有捷徑,全是靠一步一個腳印慢慢積累起來的。如果只想投機取巧的話不建議你走程式設計師這條道路。
好了廢話說完了,接下來就步入正題吧。

走進Java

JDK、JRE、JVM

首先小小的盜個圖。。。
JDK、JVM、JRE的關係
JDK(Java Development kit)Java開發工具包——是Sun公司針對Java開發員的產品,是整個JAVA的核心,包括了Java執行環境JRE、Java工具(javac/java/jdb等)和Java基礎的類庫。
JRE(Java Runtime Environment)Java執行時環境——是執行基於Java語言編寫的程式所不可缺少的執行環境(這裡注意一下,並不是開發環境),Java程式檔案可以執行在電腦上全部依仗它的存在。
JVM(Java Virtual Machine)Java虛擬機器它是整個java實現跨平臺的最核心的部分,所有的Java程式會首先被編譯為.class的類檔案,這種類檔案可以在虛擬機器上執行。因為JVM的存在才讓Java成為了現今最流行的後端語言。

JDK安裝教程

網上關於這方面的教程數不勝數,這裡不再過多贅述。
參考網站1
參考網站2
過程很簡單,這裡我對配置稍微解釋一下配置JAVA_HOME的過程其實就是對jdk檔案的路徑起了一個叫JAVA_HOME的別名,類似變數賦值,而在系統變數裡變數Path中的配置表示當我們開啟cmd視窗輸入javac或java命令時,系統會到Path指定的路徑中尋找javac.exe和java.exe並執行,這兩個檔案就是分別來編譯(就是把.java檔案生成.class檔案)和執行(.class檔案載入到記憶體中執行得到結果)。

HelloWorld程式

在完成上一步的配置之後我們就可以正式的開始編寫Java程式了,首先需要新建一個HelloWorld.txt文字文件之後再檔案中編寫:

// helloworld
public class HelloWorld {

    public static void main(String[] args) {

       System.out.println("Hello World");

    }

}

隨後儲存檔案並將字尾改為.java(可能會出現字尾名不存在的情況,參考這裡),然後在當前目錄(劃重點)開啟控制檯,輸入命令:
javac HelloWorld.java
如果成功執行當前目錄下會生成一個HelloWorld.class的檔案。然後輸入
java HelloWorld
如果程式成功執行控制檯就會打出如下圖所示結果。
HelloWorld執行結果
有幾個值得注意的點:

  1. 檔名必須和類名(public class 類名)相一致,否則會報錯。
  2. System.out.println();中的內容必須加上""號。
  3. 程式碼中所有符號必須是英文符號。
  4. 進入當前目錄的方法:控制檯中輸入C:(你程式在哪個盤裡就輸哪),然後cd 你的程式所在具體路徑。cmd中按up鍵可以直接使用上一條指令非常方便。

Java開發工具

至此HelloWorld程式編寫圓滿結束,不過生產實踐中如果用記事本去編寫程式碼不但編碼效率低而且易出錯,市面上有海量程式碼輔助工具,它們大多會支援自動填充程式碼、關鍵字高亮、自動換行等操作,大大提升我們的開發效率。一般的開發工具有編輯器和整合開發環境,編輯器可以簡單的理解為給程式碼高亮功能的文字編輯器,特點是輕量便捷,而整合開發環境則是指封裝了程式碼自動檢測、斷點除錯、自動新建專案、自動執行程式碼、專案匯入匯出等功能的綜合開發工具,一般功能比較全面但較為龐大,有的存在付費的情況,對於開發工具的選擇根據個人喜好而定,一般情況下我們會安裝一個編輯器用於除錯和一個整合開發環境用於開發,這個給大家推薦幾款好用的開發工具:
編輯器:

  • Sublime Text3 功能比較豐富。
  • notepad++ 安裝使用簡單。

整合開發環境:

  • IntelliJ IDEA 個人最喜歡的整合開發工具,沒有之一,操作順暢、快捷鍵豐富、支援現今大部分型別的Java專案建立。。。。。。可以說支援我們能想到的所有功能。但美中不足的就是需要付費(當然熱心網友給了我們大量解決方法,大家可以自行百度)。
  • eclipse Java最經典的整合開發環境,功能同樣十分強大,並且開源免費,可以直接上官網下載。

識別符號與駝峰命名法

所有的組成部分都需要名字。類名、變數名以及方法名都被稱為識別符號。
規則:

  • 所有的識別符號都應該以字母(A-Z 或者 a-z),美元符($)、或者下劃線(_)開始
  • 首字元之後可以是字母(A-Z 或者 a-z),美元符($)、下劃線(_)或數字的任何字元組合
  • 關鍵字不能用作識別符號
  • 識別符號是大小寫敏感的

對於識別符號這個問題不用過多的去糾結概念,直接建議大家在以後的程式設計中採用統一的駝峰命名法,規則如下圖。駝峰命名法
怎麼個意思那,比如我們要定義一個變數表示雞蛋的數量,那麼這個變數一定是int型別(變數型別後面說),雞蛋的單詞是egg,數量可以用num表示,那這個變數的名字就是iEggNum,很簡單吧,這樣的命名方法無論自己還是別人讀你的程式其意思都是一目瞭然。

字符集介紹

字符集(character set)是一個系統支援的所有抽象字元的集合。字元(character)就是各種文字和符號,包括國家文字、標點符號、圖形符號、數字等。
概念的習慣永遠都是把簡單的問題複雜化。。。這個東西很簡單,中文蘋果在英語中叫apple,在法語中叫Pomme,字符集也是同樣,它是指我們輸入的文字在和計算機互動時的翻譯規則,我們用UTF-8字符集輸入蘋果可能會翻譯成00010001,而用GBK輸入可能就是01000100,這裡需要注意英文26個字母、數字、符號無論在哪個字符集裡編碼都是不變的,遵從ASCII ((American Standard Code for Information Interchange): 美國資訊交換標準程式碼),但中文就比較坑了,在不同字符集中表示同一個中文漢字的編碼是不同的(像剛才蘋果的例子),在程式設計過程中出現亂碼問題基本就是字符集不統一導致的。
對於字符集問題這裡也只能簡單提一下,具體細節可以參考相關教程,一般情況下中文常用的字符集(其實也就用這兩個)有UTF-8和GBK兩個,在遇到亂碼問題時,修改程式碼字符集一般直接就可以解決問題,或者更暴力一點直接統一使用UTF-8,對於Java編成來說會處理亂碼問題足夠了。
ASCII字元程式碼表

Java基本資料型別

首先說明Java是一種強型別的語言,每個變數都必須宣告其型別。
強型別和弱型別我做個簡單的解釋。
比如:

int iNum = 123;	//這時候a只能儲存int型別的資料
iNum = "abc";	//編譯會報錯

而在Javascript(弱型別語言)中:

var iNum = 123;
iNum = "abc";	//這裡合法

注意型別轉換針對的是變數值(上例中的123),而強型別和弱型別針對的是變數(上例中的a),變數一經宣告,就只能儲存這種型別的值,其他的值則必須通過轉換之後才能付給該變數,有編譯器自動理解的轉換,也有由程式設計師明確指定的強制轉換,而弱型別的變數型別則是隨著需要不斷轉換。

Java有兩大資料型別:

內建資料型別
引用資料型別

引用資料型別在介紹物件導向的時候再做詳細介紹,內建資料型別一般包括以下8種:

取值範圍

序號資料型別位數預設值
1byte(位)80
2short(短整數)160
3int(整數)320
4long(長整數)640.0l
5float(單精度)320.0f
6double(雙精度)640
7char(字元)16\u0000
8boolean(布林值)8false

一個位元組通常佔有8個二進位制位,一個二進位制位只能表示0或1,那麼由此可以得到不同型別資料的表示範圍,比如int型別佔用4個位元組,所以就只能表示232-1個數,也就是-231~231-1。為了節約儲存,一般在可以達到要要求的情況下選擇佔用位元組最小的資料型別。

整型資料

基本資料型別當中byte、short、int以及long型別用來表示整型常數,對於整型常數一般有三種表示形式

  • 十進位制整數,如100、32
  • 八進位制整數,要求以0開頭,如054
  • 十六進位制整數,要求以0x開頭,如0x34

還有一點要注意的是整型資料預設是int型別,要宣告long型別的資料如果數值大於int表示範圍,需要在常量後加上"l"或"L"

long lNum = 123233232323232l;	//這時候不加"l"會報錯

浮點數

float型別和double型別用來表示浮點數。其中float型別的尾數可以精確到7位有效數字,double型別可以精確到15位有效數字,一般浮點數預設為double型別,如要將其變為float型別,需要在後面加上"F"或者"f"

float fNum = 1.232f;

最後總結一下浮點數存在舍入誤差,很多數字不能精確表示(BigDecimal可以解決這個問題,詳細可查閱相關資料),所以建議在資料比較中要儘量避免浮點數。

char型別

char表示字元型資料,佔有2個位元組,用來表示Unicode表中的字符集(utf-8、utf-16等都屬於Unicode,這裡提到了Unicode、GBK、ASCII 等字符集相關的術語,大家要是剛開始接觸可能和我當初一樣又會對字符集又產生疑惑,我在找了一篇文章很清晰的對字符集進行了講解,我在這裡就不做太詳細的敘述),允許表示65536個字元。單引號一般用來表示字元常量,如’A’、’,’、‘1’都是一個字元(注意’1’和整型1不一樣,一個是數,一個是字元)。
字元還包括空格、回車換行等操作,但在程式輸入過程中無法直接鍵入這些操作,所以就需要轉義字元來表示,轉義字元一般以’/‘開頭,後面的字母表示其含義,如’/n’表示回車換行。轉義字元表

char在運算時可以直接當作整數來運算,也可以將0-65535之間的整數直接轉換為char,比如:

char c = 'a';
int iResult = c + 2;
system.out.println(iResult );  //由於a的ASCII碼為01100001,代表97,那麼輸出結果就為99
char cResult = (char)iResult;
system.out.println(cResult);  //將99轉為其ASCII碼對應結果,輸出結果為c 

多個char字元組成的陣列就是String型別了,對於String型別之後會做詳細介紹。

boolean型別

boolean型別有true和false個值,在編譯後會使用1和0來表示,僅需1位(bit)即可儲存,位是計算機最小的儲存單位。但由於計算機處理資料的最小單位是1個位元組,1個位元組等於8位,所以boolean型別實際儲存的空間是:用1個位元組的最低位儲存,其他7位用0填補。

  • true:0000 0001
  • false:0000 0000

型別轉換

自動型別轉換

一般情況對於容量小的資料型別可以自動轉換為容量大的資料型別。下圖描述了轉換的關係,需要注意的是一般整型常量只要範圍合理可以直接賦值給byte、short、char型別變數。

自動型別轉換

int i = 3;
double d = i; //合法
short s1 = 12//合法
short s2 = 7894561; //不合法

注意在int和long型別轉換為float和double型別時可能存在精度丟失的問題

強制型別轉換

在可能造成精度丟失或者溢位的情況下進行型別轉化,也稱之為造型。
在超出目標型別表示範圍的情況下強制轉型會把變數值截斷為一個截然不同的值

double d = 1.1;
int i1 = (int)d; //i的值為1
int i2 = 300;
byte b = (byte)i2; //b的值為44

表示式型別提升問題

在進行二元運算過程中當表示範圍小的資料與表示範圍大的資料進行計算會把結果自動轉換為表示範圍大的資料型別。

int i = 1; //i的值為1
long l = 2;
int iResult = i + l;   //這時會報錯,因為int型別與long型別相加,結果會提升為long型別,無法用int型別變數進行儲存。
int i = 1000000000; //i的值為1
long l = 20;
long iResult1 = i * l;   //結果為負數,因為int型別和int型別相乘結果型別沒有提升,而結果值大於int表示範圍,發生。即使用long型別變數儲存到的也是溢位之後的錯誤資料。
long iResult2 =long)i * l; //正確方法

限於篇幅先講到這裡把,寫這篇文章主要是為了自己複習用,所以文中可能存在錯誤的地方歡迎大家批評指正,如果我的筆記可以幫到大家我也非常開心啦,也希望大家不喜勿噴,在下一篇我會對Java基礎繼續進行介紹。

相關文章