菜鳥學習筆記:Java基礎篇1
- 寫在前面
-
- 關于學習資源
- 關于學習方法
- 走進Java
-
- JDK、JRE、JVM
- JDK安裝教程
- HelloWorld程式
- Java開發工具
- 辨別符與駝峰命名法
- 字元集介紹
- Java基本資料類型
-
- 整型資料
- 浮點數
- char類型
- boolean類型
- 類型轉換
-
- 自動類型轉換
- 強制類型轉換
- 表達式類型提升問題
寫在前面
第一次發部落格心裡還是有點小緊張啊,哈哈,先自我介紹一下,剛畢業小白一枚,接觸程式設計有兩年多了,在校期間做過各種各樣亂七八糟稀奇古怪的項目。不過大多是現學現賣的那種,這次想系統對之前學過的知識進行一次整理加強,同時釋出下自己的學習心得,加深記憶的同時,給各位剛剛接觸程式設計的同學一個參考。當然畢竟自己也是在學習的過程,書寫過程不免會有不對的地方,也歡迎各位大神的批評指正,大家共同進步!
關于學習資源
針對學習資源來說網上的資料各式各樣學習資源,但個人感覺對于小白來說還是以視訊為主,一開始不建議直接從API文檔入手(除非你有足夠的天賦可以忽略我的建議),其一編寫文檔的人都是有幾年工作經驗的老手,職業官話已經成為了一種習慣,要沒接觸過很多時候很難看懂。其二,跟着視訊敲代碼學到的不僅是代碼的API,同時還有良好的編成習慣以及一些檔案架構,對我們之後的工作很有幫助。對于視訊B站是一個不錯的資源寶庫(這裡非常感謝熱心的up主們),當然如果你有錢各大教育訓練機構資源數不勝數,你真的可以為所欲為。
關于學習方法
一般來說編成的學習就是理論+實踐(這不是廢話嘛),但要論重要性個人覺得理論占四成,實踐占六成。說實話程式設計這東西是個熟練工,很多概念靠看是學不會的,隻有你練過了、寫過了才能明白其中的道理,建議各位同學沒每學習一個階段就找一個小型項目練練手,夯實基礎的同時也能查漏補缺。
在學習過程中如果時間充裕最好可以邊看邊敲,記憶深刻。不過一般情況不會給我們那麼多時間,是以我建議先跟着視訊過一遍,到一個階段結束可以找一個小項目自己練習,肯定會有許多不明白的地方。這時候在回去看不明白的點,就會有一種溫故而知新的感覺。還有大家不要相信網上那種什麼幾個小時掌握Java之類的廣告,知識這東西沒有捷徑,全是靠一步一個腳印慢慢積累起來的。如果隻想投機取巧的話不建議你走程式員這條道路。
好了廢話說完了,接下來就步入正題吧。
走進Java
JDK、JRE、JVM
首先小小的盜個圖。。。
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成為了現今最流行的後端語言。
由于JVM跨平台的特性,現今很多其他語言也通過自己的編譯器生成可供JVM運作的class檔案,是以現在的JVM也是一個跨語言的平台。
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
如果程式成功執行控制台就會打出如下圖所示結果。
有幾個值得注意的點:
- 檔案名必須和類名(public class 類名)相一緻,否則會報錯。
- System.out.println();中的内容必須加上""号。
- 代碼中所有符号必須是英文符号。
- 進入目前目錄的方法:控制台中輸入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編成來說會處理亂碼問題足夠了。
Java基本資料類型
首先說明Java是一種強類型的語言,每個變量都必須聲明其類型。
強類型和弱類型我做個簡單的解釋。
比如:
int iNum = 123; //這時候a隻能存儲int類型的資料
iNum = "abc"; //編譯會報錯
而在Javascript(弱類型語言)中:
var iNum = 123;
iNum = "abc"; //這裡合法
注意類型轉換針對的是變量值(上例中的123),而強類型和弱類型針對的是變量(上例中的a),變量一經聲明,就隻能存儲這種類型的值,其他的值則必須通過轉換之後才能付給該變量,有編譯器自動了解的轉換,也有由程式員明确指定的強制轉換,而弱類型的變量類型則是随着需要不斷轉換。
Java有兩大資料類型:
内置資料類型
引用資料類型
引用資料類型在介紹面向對象的時候再做介紹,内置資料類型一般包括以下8種:
取值範圍
序号 | 資料類型 | 位數 | 預設值 |
---|---|---|---|
1 | byte(位) | 8 | |
2 | short(短整數) | 16 | |
3 | int(整數) | 32 | |
4 | long(長整數) | 64 | 0.0l |
5 | float(單精度) | 32 | 0.0f |
6 | double(雙精度) | 64 | |
7 | char(字元) | 16 | \u0000 |
8 | boolean(布爾值) | 8 | false |
一個位元組通常占有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"。
浮點數
float類型和double類型用來表示浮點數。其中float類型的尾數可以精确到7位有效數字,double類型可以精确到15位有效數字,一般浮點數預設為double類型,如要将其變為float類型,需要在後面加上"F"或者"f"。
最後總結一下浮點數存在舍入誤差,很多數字不能精确表示(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基礎繼續進行介紹。
下一篇:菜鳥學習筆記:Java基礎篇2(變量、運算符、流程控制語句、方法)