筆記來自尚硅谷老師-康老師
學習教程:https://www.bilibili.com/video/BV1PY411e7J6/?spm_id_from=333.337.search-card.all.click
1、Java基礎全程脈絡圖
1.1 本章專題與脈絡
2. 抽絲剝繭話Java
2.1 當前大學生就業形勢
麥可思研究院
發布了《2022年中國大學生就業報告》,針對2021屆畢業生收入較高的本科專業排行榜:
麥可思研究院
發布過《2021年中國大學生就業報告》,應屆本科畢業生就業數量較大的前十位行業類的就業質量:
- 報告還對畢業三年后的2017屆畢業生所在十大行業進行了統計:
- 從國家統計局發布的2021年全國平均工資來看,不管在城鎮非私營單位還是私營單位,
IT``業均為最高
。
2.2 IT互聯網是否依舊靠譜
過去不能代表未來!互聯網是否依舊靠譜?!
2014 年至 2018 年間,我國網民規模從 6.49 億增長為 8.29 億,增幅為
27.5%
。同一時間段,全國移動互聯網接入的流量卻從 20.6EB 增長到了 711.1EB,增幅達3352%
(獲取和處理的信息量大幅增加)。隨著 5G 技術進一步拓寬移動互聯網的速度和容量,
產業互聯網
將在消費型流量的基礎上創造生產型流量,根據報告的預測,至 2024 年,全國移動互聯網的接入流量將達到 127663.8EB,流量規模達到``2018``年的``179.5``倍
。當下,5G、物聯網、人工智能、產業互聯網都是國家政策大方向,需要大量
能與機器對話
的中高端人才。
2.3 IT行業崗位分析
軟件開發,是進入互聯網IT圈最好的選擇之一!
-
起始薪資高
-
工作環境好
-
漲薪幅度高
-
行業更公平
2.4 軟件開發之Java開發
移動應用領域(集成Android平臺):Java在Android端是主要開發的語言,占有重要的地位。
企業級應用領域(JavaEE后臺):用來開發企業級的應用程序,大型網站如淘寶、京東、12306,以及各大物流、銀行、金融、社交、醫療、交通、各種OA系統等都是用JavaEE技術開發的。
大數據分析、人工智能領域:流行的大數據框架,如Hadoop、Flink都是用Java編寫的。Spark使用Scala編寫,但可以用Java開發應用。
Eversoft公司在提到2022年Java發展趨勢時寫道:
Java ``是用于開發大數據項目的最主流的語言
。我們可以輕松地預測它也將在之后繼續主導大數據
!
**游戲領域、桌面應用、嵌入式領域:**很多大型游戲的后臺、桌面應用等也是Java開發的。
2.5 到底多少人在用Java
2020年,根據 IDC 的報告“Java Turns 25”顯示,超過
900 ``萬
名開發人員(全球專職開發人員中的69%
)在使用 Java——比其他任何語言都多。該報告指出,大多數企業業務服務都依靠 Java 來實現。… Java 一直是開發人員中最流行的編程語言,被譽為“
宇宙第一語言
”。我想告訴大家:
“市場的需求比較大,市場的供給比較大”
“如果你在Java領域里持續積累5-7年以上,那么你至少會成為這個行業的一個專家!”
2.6 八卦一下程序員
還可以是:
2.7 Java系列課程體系
見02_學習路線圖之《Java中高級程序員全程學習路線圖.xmind》
2.8 Java職業晉升路線圖
薪資數據統計來源:拉勾網
3. 計算機的硬件與軟件
3.1 計算機組成:硬件+軟件
3.2 CPU、內存與硬盤
CPU(Central Processing Unit,中央處理器)
- 人靠大腦思考,電腦靠CPU來運算、控制。
硬盤(Hard Disk Drive)
-
計算機最主要的存儲設備,容量大,斷電數據不丟失。
-
正常分類:
機械硬盤(``HDD``)
、固態硬盤(``SSD``)
以及混合硬盤(``SSHD``)
-
固態硬盤在開機速度和程序加載速度遠遠高于機械硬盤,缺點就是貴,所有無法完全取代機械硬盤。
內存(Memory)
-
負責硬盤上的數據與CPU之間數據交換處理
-
具體的:保存從硬盤讀取的數據,提供給CPU使用;保存CPU的一些臨時執行結果,以便CPU下次使用或保存到硬盤。
-
斷電后數據丟失。
3.3 輸入設備:鍵盤輸入
熟悉指法
不熟悉鍵盤的小伙伴,可以“金山打字通
”走起了。堅決杜絕二指禪
!!
4. 軟件相關介紹
4.1 什么是軟件
軟件,即一系列按照特定順序組織
的計算機數據
和指令
的集合。有系統軟件和應用軟件之分。
Pascal之父Nicklaus Wirth: “Programs = Data Structures + Algorithms”
系統軟件:
應用軟件:
4.2 人機交互方式
圖形化界面(Graphical User Interface,GUI),這種方式簡單直觀,使用者易于接受,容易上手操作。
命令行方式(Command Line Interface,CLI),需要在控制臺輸入特定的
指令
,讓計算機完成一些操作。需要記憶一些指令,較為麻煩。
4.3 常用的DOS命令
DOS(Disk Operating System,磁盤操作系統)是Microsoft公司在Windows之前推出的一個操作系統,是單用戶、單任務(即只能執行一個任務)的操作系統。現在被Windows系統取代。
對于Java初學者,學習一些DOS命令,會非常有幫助。
進入DOS操作窗口:
按下Windows+R鍵盤,打開運行窗口,輸入cmd回車,進入到DOS的操作窗口。
常用指令:
操作``1``:進入和回退
操作 | 說明 |
---|---|
盤符名稱: | 盤符切換。E:回車,表示切換到E盤。 |
dir | 列出當前目錄下的文件以及文件夾 |
cd 目錄 | 進入指定單級目錄。 |
cd 目錄1\目錄2\… | 進入指定多級目錄。cd atguigu\JavaSE |
cd … | 回退到上一級目錄。 |
cd \ 或 cd / | 回退到盤符目錄。 |
操作``2``:增、刪
操作 | 說明 |
---|---|
md 文件目錄名 | 創建指定的文件目錄。 |
rd 文件目錄名 | 刪除指定的文件目錄(如文件目錄內有數據,刪除失敗) |
操作``3``:其它
操作 | 說明 |
---|---|
cls | 清屏。 |
exit | 退出命令提示符窗口。 |
← → | 移動光標 |
↑ ↓ | 調閱歷史操作命令 |
Delete和Backspace | 刪除字符 |
5. 計算機編程語言
5.1 計算機語言是什么
**語言:**是人與人之間用于溝通的一種方式。例如:中國人與中國人用普通話溝通。而中國人要和英國人交流,可以使用英語或普通話。
**計算機編程語言:**就是人與計算機交流的方式。人們可以使用
編程語言
對計算機下達命令
,讓計算機完成人們需要的功能。計算機語言有很多種。如:C 、C++、Java、Go、JavaScript、Python,Scala等。
體會:語言 = 語法 + 邏輯
5.2 計算機語言簡史
第一代:機器語言(相當于人類的石器時代)
- 1946年2月14日,世界上第一臺計算機
ENAC
誕生,使用的是最原始的穿孔卡片
。這種卡片上使用的是用二進制代碼
表示的語言,與人類語言差別極大,這種語言就稱為機器語言
。比如一段典型的機器碼:
?
1. 0000,0000,000000010000 代表 LOAD A, 162. 0000,0001,000000000001 代表 LOAD B, 13. 0001,0001,000000010000 代表 STORE B, 16
- 這種語言本質上是計算機能識別的唯一語言,人類很難理解。可以大膽想象"
此時的程序員``99.9%``都是異類!
"
第二代:匯編語言(相當于人類的青銅&鐵器時代)
使用英文縮寫的
助記符
來表示基本的操作,這些助記符構成了匯編語言的基礎。比如:LOAD
、MOVE
等,使人更容易使用。因此,匯編語言也稱為符號語言
。
-
優點:能編寫
高效率
的程序 -
缺點:匯編語言是
面向機器的
,不同計算機機型特點不同,因此會有不同的匯編語言,彼此之間不能通用
。程序不易移植,較難調試。
比起機器語言,匯編大大進步了,是機器語言向更高級的語言進化的
橋梁
。目前仍然應用于工業電子編程領域、軟件的加密解密、計算機病毒分析等。第三代:高級語言(相當于人類的信息時代)
高級語言發展于20世紀50年代中葉到70年代,是一種
接近于人們使用習慣
的程序設計語言。它允許程序員使用接近日常英語
的指令來編寫程序,程序中的符號和算式也與日常用的數學式子
差不多,接近于自然語言和數學語言,容易為人們掌握。比如:
高級語言
獨立于機器
,有一定的通用性;計算機不能直接識別和執行用高級語言編寫的程序,需要使用編譯器或者解釋器,轉換為機器語言
才能被識別和執行。
此外,高級語言按照程序設計方法的不同,又分為:面向過程的語言
、面向對象的語言
。
-
C、Pascal、Fortran面向過程的語言
-
C++面向過程/面向對象
-
Java跨平臺的純面向對象的語言
-
C#、Python、JavaScript、Scala…
目前以及可預見的將來,計算機語言仍然處于“第三代高級語言”階段。但是不管是什么語言,最后都要向機器語言靠近,因為CPU只認識0和1。
5.3 計算機語言排行榜
TIOBE (https://www.tiobe.com/tiobe-index/)是一個流行編程語言排行,每月更新。排名權重基于世界范圍內 工程師數量,Google、Bing、Yahoo! 、Wikipedia、Amazon、Youtube和百度這些主流的搜索引擎,也將作為排名權重的參考指標。
計算機語言走勢
5.4 編程語言,該學哪個?
網傳的編程語言鄙視鏈:
C語言:萬物之源
-
誕生于
1972``年
,由AT&T公司旗下貝爾實驗室
創建完成,用于構建Unix操作系統。 -
偏向計算機底層操作(操作系統、網絡、硬件驅動等)。
-
優勢:幾乎所有現代編程語言都脫胎于C
-
劣勢:相當陡的學習曲線;不支持面向對象編程
C++語言:難學的語言
-
誕生于1983年,作為C語言的增強方案、
升級版本
。C++是C語言的超集,C語言的大部分知識也適用于C++。 -
用途:windows 或 MacOS UI、office全家桶、主流的瀏覽器、Oracle、MySQL、著名的游戲引擎(如星際爭霸、魔獸世界)等
-
優勢:很多公司都用 C++ 開發核心架構,如 Google、騰訊、百度、阿里云等;面向對象性
-
劣勢:體系極為龐大,這是世界目前來說
最復雜
也是最難
的編程語言。 -
C#語言:背靠大樹的語言
-
誕生于
2000``年
,一款強大而靈活的編程語言。靠著微軟
這棵大樹,是多年來windows平臺的一門主流編程語言。 -
用途:windows桌面應用開發、Windows Azure、游戲開發
PHP語言:最好的語言?
-
誕生于1994年,一款
服務器端腳本語言
。最初表示個人主頁(Personal Home Page) -
PHP語法和C類似,有很多的模板和框架,簡單易懂,也許你可以在短短幾天做出web app。它主要用于web端,快速建站網絡開發
-
劣勢:學習門檻太低;其代碼運行速度低于大部分編程語言黨爭對手
Python:易學的語言
-
誕生于1991年,一種面向對象的語言,雖然運行效率不高,但是
開發效率非常高
。 -
Python被稱為
膠水語言
,哪里都可以用。
JavaScript語言:前端為王
-
誕生于1995年,網景公司開發完成。
-
JavaScript是JavaScript 是目前
所有主流瀏覽器
上唯一支持的腳本語言。在前端開發中,占有不可替代的地位。
Java語言:需求旺盛
-
創建于1995年,Java是一種面向對象、基于類的編程語言。
-
Java可能是目前
運用最廣的項目語言
。代碼穩定性超過 C 和 C++,生產力遠超 C 和 C++。有 JVM 在,可以輕松地跨平臺。 -
具有強大的開源開發工具,大量的開源共享庫。
-
Java擁有世界上
數量最多
的程序員,最不缺人。
Go語言:夾縫中生存
-
Go 語言現在很受關注,它是取代 C 和 C++ 的另一門有潛力的語言。
- C 語言太原始了,C++ 太復雜了,Java 太高級了,所以 Go 語言就在這個夾縫中出現了。
-
Go語言已成為
云計算領域
事實上的標準語言,尤其是在 Docker/Kubernetes 等項目中。 -
Go 語言語法特別簡單,你有了 C 和 C++ 的基礎,學習 Go 的學習成本基本為零。
-
Go社區從Java社區移植了各種優秀的框架或庫。
總結:
-
程序設計語言有很多種,每種語言都是為了實現某個特定的目的而發明的。
-
沒有“最好”的語言,只有在特定場景下相對來說,最適合的語言而已。
-
如果你掌握了一種編程語言,也會更容易上手其它的編程語言。關鍵是學習如何使用程序設計方法來解決問題。這也是本套課程的主旨。
-
Talk is cheap,Show me the code。
6. Java語言概述
6.1 Java概述
-
是
SUN
(Stanford University Network,斯坦福大學網絡公司 )1995``年
推出的一門高級編程語言。 -
是一種面向Internet的編程語言。Java一開始富有吸引力是因為Java程序可以在
Web``瀏覽器
中運行。這些Java程序被稱為Java``小程序
(applet),內嵌在HTML代碼中。 -
伴隨著互聯網的迅猛發展,以及Java技術在web方面的不斷成熟,已經成為Web應用程序的首選開發語言。
6.2 Java語言簡史
起步階段:
1991年,Sun公司的工程師小組想要設計一種語言,應用在電視機
、電話
、鬧鐘
、烤面包機
等家用電器的控制和通信。由于這些設備的處理能力
和內存
都很有限,并且不同的廠商會選擇不同的中央處理器(CPU),因此這種語言的關鍵是代碼短小
、緊湊
且與平臺無關
(即不能與任何特定的體系結構捆綁在一起)。
Gosling團隊率先創造了這個語言,并命名為“Oak
"(起名的原因是因為他非常喜歡自己辦公室外的橡樹)。后因智能化家電的市場需求沒有預期的高,Sun公司放棄了該項計劃。
隨著20世紀90年代互聯網的發展,Sun公司發現該語言在互聯網上應用的前景,于是改造了Oak,于1995年5月以Java的名稱正式發布。(Java是印度尼西亞爪哇島
的英文名稱,因盛產咖啡而聞名。)
發展階段:
發行版本 | 發行時間 | 備注 |
---|---|---|
Java 1.0 | 1996.01.23 | Sun公司發布了Java的第一個開發工具包 |
Java 1.1 | 1997.02.19 | JavaOne會議召開,創當時全球同類會議規模之最。 |
Java 1.2 | 1998.12.08 | Java拆分成:J2SE(標準版)、J2EE(企業版)、J2ME(小型版) |
Java 1.3 | 2000.05.08 | |
Java1.4 | 2004.02.06 | |
Java 5.0 | 2004.09.30 | ①版本號從1.4直接更新至5.0;②平臺更名為JavaSE、JavaEE、JavaME |
Java 6.0 | 2006.12.11 | 2009.04.20 Oracle宣布收購SUN公司 |
2009.04.20 | Oracle公司收購SUN,交易價格74``億 美元。 | |
Java 7.0 | 2011.07.02 | |
Java 8.0 | 2014.03.18 | 此版本是繼Java 5.0以來變化最大的版本。是長期支持版本(LTS) |
Java 9.0 | 2017.09.22 | ①此版本開始,每半年更新一次;②Java 9.0開始不再支持windows 32位系統 |
Java 10.0 | 2018.03.21 | |
Java 11.0 | 2018.09.25 | JDK安裝包取消獨立JRE安裝包,是長期支持版本(LTS) |
Java 12.0 | 2019.03.19 | |
… | … | |
Java17.0 | 2021.09 | 發布Java 17.0,版本號也稱為21.9,是長期支持版本。 |
… | … | |
Java19.0 | 2022.09 | 發布Java19.0,版本號也稱為22.9。 |
6.3 Java之父
-
詹姆斯``·``高斯林``(James Gosling)
先生以“Java 技術之父”而聞名于世。他是Java 技術的創始人,他親手設計了Java語言,并開發了Java編譯器和Java虛擬機,使Java成為了世界上最流行的開發語言。 -
James Gosling于1984 年加入Sun公司,并一直服務于Sun公司,直至2010年前后,Sun被Oracle并購而加入Oracle,擔任客戶端軟件集團的首席技術官; 2010年4月從Oracle離職。
6.4 公司八卦
SUN 與 Oracle
SUN是一家
極具創新能力
的公司,2001年 “9.11”以前,SUN公司市值超過``1000``億
美元。 但是沒能利用Java構建一個強有力、可變現的生態系統,沒打好Java這張牌。此后,互聯網泡沫破裂,硬件需求大幅減少,它的市值在一個月之內跌幅超過90%。SUN公司的成長用了20年,而衰落只用了1年!
Oracle 與 Google
Google和Oracle的侵權事件:
2010 年 8 月,Oracle 起訴 Google 的 Android 系統侵權,要求賠償 26 億美元。
-
Oracle認為Google的代碼中使用了Java的
37``個``API
,并且認為Google是故意為之,因為這樣做的好處是可以讓更多的Java程序員更容易接受Android的代碼。 -
Oracle認為Android 中有
9``行代碼
直接抄襲了Java的實現。這9行牛氣哄哄的代碼都出自一人之手,他就是Java 大牛------Joshua Bloch
。
2018 年 3 月,美國聯邦巡回上訴法院裁決,谷歌侵犯了甲骨文的版權,支付高達
88``億美元
的賠償金。2021 年 4 月,美國最高法院給出了最終裁決:谷歌勝訴,其代碼屬于“合理使用”的范疇。為期十多年的軟件行業“第一版權案”落幕。
//Code In OpenJDK / Android :
1. private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
2. if (fromIndex > toIndex)
3. throw new IllegalArgumentException("fromIndex(" + fromIndex +
4. ") > toIndex(" + toIndex+")");
5. if (fromIndex < 0)
6. throw new ArrayIndexOutOfBoundsException(fromIndex);
7. if (toIndex > arrayLen)
8. throw new ArrayIndexOutOfBoundsException(toIndex);
9. }
6.5 Java技術體系平臺
Java SE(Java Standard Edition)標準版
-
支持面向
桌面級應用
(如Windows下的應用程序)的Java平臺,即定位個人計算機的應用開發。 -
包括用戶界面接口AWT及Swing,網絡功能與國際化、圖像處理能力以及輸入輸出支持等。
-
此版本以前稱為J2SE
Java EE(Java Enterprise Edition)企業版
-
為開發企業環境下的應用程序提供的一套解決方案,即定位
在服務器端的``Web``應用開發
。 -
JavaEE是JavaSE的擴展,增加了用于服務器開發的類庫。如:Servlet能夠延伸服務器的功能,通過請求-響應的模式來處理客戶端的請求;JSP是一種可以將Java程序代碼內嵌在網頁內的技術。
-
版本以前稱為J2EE
Java ME(Java Micro Edition)小型版
-
支持Java程序運行在
移動終端(手機、機頂盒)上的平臺
,即定位在消費性電子產品的應用開發 -
JavaME是JavaSE的內伸,精簡了JavaSE 的核心類庫,同時也提供自己的擴展類。增加了適合微小裝置的類庫:javax.microedition.io.*等。
-
此版本以前稱為J2ME
注意:Android開發不等同于Java ME的開發
7. Java開發環境搭建(掌握)
7.1 什么是JDK、JRE
JDK (
J
avaD
evelopmentK
it):是Java程序開發工具包,包含JRE
和開發人員使用的工具。JRE (
J
avaR
untimeE
nvironment) :是Java程序的運行時環境,包含JVM
和運行時所需要的核心類庫
。如下是Java 8.0 Platform:
小結:
JDK = JRE + 開發工具集(例如Javac編譯工具等)
JRE = JVM + Java SE標準類庫
7.2 JDK版本選擇
-
自Java 8版本發布以來,其后的每次更新,都會有小伙伴高呼:Java8 YYDS!
-
論壇的聲音:“
你發任你發,我用
Java 8`!”
數據說話1:
JRebel 于2022年4月前后發布了《2022 年Java生態系統狀況報告》,報告中提到使用Java11 的占比最多,Java 8 緊隨其后,如下圖。而此前2020年的報告顯示,Java8占比達到了84.48%
。
我的分析:
G1是最受歡迎的GC算法。Java 11及更高版本的G1收集器是默認的GC,而Java 8中并不是。出于對G1的喜愛,很多開發者才會選擇拋棄Java 8。
數據說話2:
此外,某美國軟件開發商在對近千名專業的Java開發者調研后,發布的《2022年Java開發者生產力報告》稱:八年前發布的Java 8依然是Java中應用最廣泛的版本,占比 37%
,其次是 Java 11,占比29%
。
高斯林說話:
Spring框架說話:
在Java 17正式發布之前,Java開發框架Spring率先在官博宣布,Spring Framework 6和Spring Boot 3計劃在2022年第四季度實現總體可用性的高端基線:
-
Java 17+(來自 Spring Framework 5.3.x 線中的 Java 8-17)
-
Jakarta EE 9+(來自Spring框架5.3.x 線中的 Java EE 7-8)
Spring 官方說明:https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-now-available
意味著:springboot3.0 是需要用java17和spring6.0為基礎建設。如果從企業選型最新springboot3.0作為架構來說,它搭配jdk17肯定是標配了。
7.3 JDK的下載
-
下載網址(Oracle公司官網):www.oracle.com
-
下載步驟:如圖所示,在官網底部選擇Developers開發者
(1)在Developers頁面中間的技術分類部分,選擇Java
,單擊進入,如圖所示:
(2)這里展示的是最新Java版本,例如Java17。單擊Download Java
,然后選擇具體的版本下載。
(3)選擇Download Java按鈕后
(4)如果想安裝Java8 可以選擇如下位置:
(5)選擇Accept License Agreement,
(6)注冊或登錄后下載:
(7)如果需要安裝其它版本,可以選擇Java archive:
接著進行選擇下載即可:
7.4 JDK的安裝
安裝說明:
傻瓜式安裝,下一步即可。
建議:安裝路徑不要有中文或者空格等特殊符號。
本套課程會同時安裝JDK8 和 JDK17,并以JDK17為默認版本進行講解。
安裝步驟:
(1)雙擊jdk-17_windows-x64_bin.exe
文件,并單擊下一步,如圖所示:
(2)修改安裝路徑,單擊更改,如圖所示:
(3)將安裝路徑修改為D:\develop_tools\jdk\jdk-17.0.2\
,并單擊下一步,如圖所示:
(4)稍后幾秒,安裝完成,如圖所示:
7.5 配置path環境變量
7.5.1 理解path環境變量
什么是path環境變量?
答:window操作系統執行命令時,所要搜尋的路徑。
為什么配置path?
答:希望在命令行使用javac.exe等工具時,任意目錄下都可以找到這個工具所在的目錄。
以JDK為例演示
我們在C:\Users\songhk
目錄下使用javac命令,結果如下:
我們在JDK的安裝目錄的bin目錄下使用javac命令,結果如下:
我們不可能每次使用java.exe,javac.exe等工具的時候都進入到JDK的安裝目錄下,太麻煩了。這時就需要配置path環境變量。
7.5.2 JDK8配置方案1:只配置path
步驟:
(1)打開桌面上的計算機,進入后在左側找到此電腦
,單擊鼠標右鍵
,選擇屬性
,如圖所示:
(2)選擇高級系統設置
,如圖所示:
(3)在高級
選項卡,單擊環境變量
,如圖所示:
(4)在系統變量
中,選中Path
環境變量,雙擊
或者點擊編輯
,如圖所示:
(5)點擊新建
,填入D:\develop_tools\jdk\jdk1.8.0_271\bin
,并將此值上移
到變量列表的首位。如圖所示:
- 編輯模式1:
- 編輯模式2:(注意,結尾需要有英文模式下的;)
(6)環境變量配置完成,重新開啟DOS命令行,在任意目錄下輸入javac
或java
命令或java -version
,運行成功。
7.5.3 JDK8配置方案2:配置JAVA_HOME+path(推薦)
- 步驟:
(1)打開桌面上的計算機,進入后在左側找到計算機
,單擊鼠標右鍵
,選擇屬性
,如圖所示:
(2)選擇高級系統設置
,如圖所示:
(3)在高級
選項卡,單擊環境變量
,如圖所示:
(4)在系統變量
中,單擊新建
,創建新的環境變量,如圖所示:
(5)變量名輸入JAVA_HOME
,變量值輸入 D:\develop_tools\jdk\jdk1.8.0_271
,單擊確定
,如圖所示:
(6)選中Path
環境變量,雙擊
或者點擊編輯
,如圖所示:
(7)在變量值的最前面,鍵入%JAVA_HOME%\bin
。如圖所示:
注意:強烈建議將%JAVA_HOME%\bin聲明在path環境變量中所有變量的最前面!
(8)環境變量配置完成,重啟DOS命令行,在任意目錄下輸入javac
或java
命令或java -version
,運行成功。
我想說:
有的書籍、論壇、視頻上還提到配置classpath,用于指名class文件識別的路徑。其實是沒必要的,反而建議大家如果配置了classpath環境變量,要刪除。對于初學者,反而不友好。
小結如下:
7.5.4 JDK17配置方案:自動配置
不管大家有沒有提前安裝JDK8或其它版本JDK,在我們安裝完JDK17之后,理應按JDK8的方式配置path環境變量。但是,我們發現在安裝完JDK17以后,配置環境變量之前,執行CMD指令:
竟然成功了!而且是17.0.2版本。因為JDK17在安裝之后,自動進行了環境變量的配置。如下:
這里建議,將JDK17安裝的路徑,設置為JAVAHOME,并將`%JAVAHOME%\bin`上移到首位。
思考:如果你仍然希望在JDK8下開發Java程序?如何做呢?
8. 開發體驗:HelloWorld(掌握)
JDK安裝完畢,我們就可以開發第一個Java程序了,習慣性的稱為:HelloWorld。
8.1 開發步驟
Java程序開發三步驟:編寫、編譯、運行。
-
將 Java 代碼編寫到擴展名為 .java 的源文件中
-
通過 javac.exe 命令對該 java 文件進行編譯,生成一個或多個字節碼文件
-
通過 java.exe 命令對生成的 class 文件進行運行
8.2 編寫
(1)在D:\JavaSE\chapter01
目錄下新建文本文件,完整的文件名修改為HelloWorld.java
,其中文件名為HelloWorld
,后綴名必須為.java
。
(2)用記事本或editplus等文本編輯器打開(雖然記事本也可以,但是沒有關鍵字顏色標識,不利于初學者學習)
(3)在文件中輸入如下代碼,并且保存:
class HelloChina {public static void main(String[] args) {System.out.println("HelloWorld!!");}
}
-
友情提示1:每個字母和符號必須與示例代碼一模一樣,包括大小寫在內。
-
友情提示2:
或
第一個HelloWord
源程序就編寫完成了,但是這個文件是程序員編寫的,JVM是看不懂的,也就不能運行,因此我們必須將編寫好的Java``源文件
編譯成JVM可以看懂的字節碼文件
,也就是.class
文件。
8.3 編譯
在DOS命令行中,進入D:\JavaSE\chapter01
目錄,使用javac
命令進行編譯。
使用文件資源管理器打開D:\JavaSE\chapter01
目錄,然后在地址欄輸入cmd。
命令:
javac Java源文件名.后綴名java
舉例:
javac HelloWorld.java
編譯成功后,命令行沒有任何提示。打開D:\JavaSE\chapter01
目錄,發現產生
了一個新的文件 HelloChina.class
,該文件就是編譯后的文件,是Java的可運
行文件,稱為字節碼文件,有了字節碼文件,就可以運行程序了。
8.4 運行
在DOS命令行中,在字節碼文件目錄下,使用java
命令進行運行。
命令:
java 主類名字
主類是指包含main方法的類,main方法是Java程序的入口:
public static void main(String[] args){}
舉例:
java HelloChina
錯誤演示:
java HelloChina.class
9. Java開發工具
9.1 都有哪些開發Java的工具
級別一:文本開發工具
級別二:集成開發環境(Integrated Development Environment,IDE)
把代碼編寫,編譯,執行,調試等多種功能綜合到一起的開發工具。
9.2 如何選擇
前期我們先使用文本開發工具,培養代碼感
,利于公司筆、面試。
后期我們使用IDE,提供更強大的功能支持
。
10. HelloWorld案例常見錯誤
10.1 拼寫問題
-
單詞拼寫問題
-
正確:class 錯誤:Class
-
正確:String 錯誤:string
-
正確:System 錯誤:system
-
正確:main 錯誤:mian
-
-
Java語言是一門嚴格區分大小寫的語言
-
標點符號使用問題
-
不能用中文符號,英文半角的標點符號(正確)
-
括號問題,成對出現
-
10.2 編譯、運行路徑問題
舉例1:
-
源文件名不存在或者寫錯
-
當前路徑錯誤
-
后綴名隱藏問題
舉例2:
-
類文件名寫錯,尤其文件名與類名不一致時,要小心
-
類文件不在當前路徑下,或者不在classpath指定路徑下
10.3 語法問題
舉例1:
聲明為public的類應與文件名一致,否知編譯失敗。
舉例2:
編譯失敗,注意錯誤出現的行數,再到源代碼中指定位置改錯
10.4 字符編碼問題
當cmd命令行窗口的字符編碼與.java源文件的字符編碼不一致,如何解決?
解決方案一:
- 在Notepad++等編輯器中,修改源文件的字符編碼:
- 在EditPlus中可以將Java源文件另存為ANSI編碼方式(中文操作系統下即為GBK字符集)
解決方案二:
在使用javac命令式,可以指定源文件的字符編碼
javac -encoding utf-8 Review01.java
10.5 建議
-
注意縮進!
-
一定要有縮進。縮進就像人得體的衣著一樣!
-
只要遇到{}就縮進,縮進的快捷鍵tab鍵。
-
-
必要的空格
- 變量類型、變量、賦值符號、變量值之間填充相應空格,更美觀。比如: int num = 10;
11. HelloWorld小結
11.1 Java程序的結構與格式
結構:
類{方法{語句;}
}
格式:
(1)每一級縮進一個Tab鍵
(2){}的左半部分在行尾,右半部分單獨一行,與和它成對的"{"的行首對齊
11.2 Java程序的入口
Java程序的入口是main方法
public static void main(String[] args){}
11.3 兩種常見的輸出語句
- 換行輸出語句:輸出內容,完畢后進行換行,格式如下:
?
- System.out.println(輸出內容);
?
- 直接輸出語句:輸出內容,完畢后不做任何處理,格式如下
?
- System.out.print(輸出內容);
注意事項:
換行輸出語句,括號內可以什么都不寫,只做換行處理
直接輸出語句,括號內什么都不寫的話,編譯報錯
11.4 源文件名與類名
(1)源文件名是否必須與類名一致?public呢?
如果這個類不是public,那么源文件名可以和類名不一致。但是不便于代碼維護。如果這個類是public,那么要求源文件名必須與類名一致。否則編譯報錯。我們建議大家,不管是否是public,都與源文件名保持一致,而且一個源文件盡量只寫一個類,目的是為了好維護。
(2)一個源文件中是否可以有多個類?public呢?
一個源文件中可以有多個類,編譯后會生成多個.class字節碼文件。但是一個源文件只能有一個public的類。
12. 注釋(comment)
什么是注釋?
- 源文件中用于解釋、說明程序的文字就是注釋。
注釋是一個程序員必須要具有的良好編程習慣。實際開發中,程序員可以先將自己的
思想
通過注釋整理出來,再用代碼
去體現。
-
程序員最討厭兩件事:
一件是自己寫代碼被要求加注釋
另一件是接手別人代碼,發現沒有注釋
?
- 不加注釋的危害
?
?
-
Java中的注釋類型:
- 單行注釋
?
- //注釋文字
?
- 多行注釋
?
- /*
注釋文字1
注釋文字2
注釋文字3
*/
?
- 文檔注釋 (Java特有)
?
- /**
@author 指定java程序的作者
@version 指定源文件的版本
*/
-
注釋的作用
-
它提升了程序的可閱讀性。(不加注釋的危害性,見圖。)
-
調試程序的重要方法。
-
具體使用1:單行注釋、多行注釋
-
對于單行和多行注釋,被注釋的文字,不會不會出現在字節碼文件中,進而不會被JVM(java虛擬機)解釋執行。
-
多行注釋里面不允許有多行注釋嵌套。
-
一個段子
?
- A:嘿 //是什么意思啊?
B:嘿.
A:呃 我問你//是什么意思?
B:問吧.
A:我剛才不是問了么?
B:啊?
A:你再看看記錄…
B:看完了.
A:…所以//是啥?
B:所以什么?
A:你存心耍我呢吧?
B:沒有啊 你想問什么?
……
不斷循環之后,A一氣之下和B絕交,自己苦學程序。
N年之后,A終于修成正果,回想起B,又把聊天記錄翻出來看,這時,他突然發現B沒有耍他……
而他自己也不知道當年他問B的究竟是什么問題……
具體使用2:文檔注釋(Java特有)
-
文檔注釋內容可以被JDK提供的工具 javadoc 所解析,生成一套以網頁文件形式體現的該程序的說明文檔。
-
操作方式。比如:
?
- javadoc -d mydoc -author -version HelloWorld.java
案例:
//單行注釋
/*
多行注釋
*/
/**
文檔注釋演示。這是我的第一個Java程序!^_^
@author songhk
@version 1.0
*/
public class HelloWorld{/**Java程序的入口@param args main方法的命令參數*/public static void main(String[] args){System.out.println("hello");}
}
13. Java API文檔
-
API (Application Programming Interface,應用程序編程接口)是 Java 提供的基本編程接口。
-
Java語言提供了大量的基礎類,因此 Oracle 也為這些基礎類提供了相應的說明文檔,用于告訴開發者如何使用這些類,以及這些類里包含的方法。大多數Java書籍中的類的介紹都要參照它來完成,它是編程者經常查閱的資料。
-
Java API文檔,即為JDK使用說明書、幫助文檔。類似于:
新華字典
-
下載API文檔:
-
在線看:https://docs.oracle.com/en/java/javase/17/docs/api/index.html
-
離線下載:https://www.oracle.com/java/technologies/javase-jdk17-doc-downloads.html
-
14. Java核心機制:JVM
14.1 Java語言的優缺點
Java確實是從C語言和C++語言繼承了許多成份,甚至可以將Java看成是類C語言發展和衍生的產物。“青出于藍,而勝于藍”。
14.1.1 優點
**跨平臺性:**這是Java的核心優勢。Java在最初設計時就很注重移植和跨平臺性。比如:Java的int永遠都是32位。不像C++可能是16,32,可能是根據編譯器廠商規定的變化。
-
通過Java語言編寫的應用程序在不同的系統平臺上都可以運行。“
Write once , Run Anywhere
”。 -
原理:只要在需要運行 java 應用程序的操作系統上,先安裝一個Java虛擬機 (
J
VM ,JavaV
irtualM
achine) 即可。由JVM來負責Java程序在該系統中的運行。
JVM的跨平臺性
面向對象性:
- 面向對象是一種程序設計技術,非常
適合大型軟件的設計和開發
。面向對象編程支持封裝、繼承、多態等特性,讓程序更好達到高內聚
,低耦合
的標準。
**健壯性:**吸收了C/C++語言的優點,但去掉了其影響程序健壯性的部分(如指針、內存的申請與釋放等),提供了一個相對安全的內存管理和訪問機制。
安全性高:
- Java適合于網絡/分布式環境,需要提供一個安全機制以防惡意代碼的攻擊。如:
安全防范機制
(ClassLoader類加載器),可以分配不同的命名空間以防替代本地的同名類、字節代碼檢查。
簡單性:
- Java就是C++語法的
簡化版
,我們也可以將Java稱之為“C++--
”。比如:頭文件,指針運算,結構,聯合,操作符重載,虛基類等。
高性能:
-
Java最初發展階段,總是被人詬病“
性能低
”;客觀上,高級語言運行效率總是低于低級語言的,這個無法避免。Java語言本身發展中通過虛擬機的優化提升了幾十倍運行效率
。比如,通過JIT(JUST IN TIME)即時編譯技術提高運行效率。 -
Java``低性能的短腿,已經被完全解決了
。業界發展上,我們也看到很多C++應用轉到Java開發,很多C++程序員轉型為Java程序員。
14.1.2 缺點
-
語法過于復雜、嚴謹
,對程序員的約束比較多,與python、php等相比入門較難。但是一旦學會了,就業崗位需求量大,而且薪資待遇節節攀升
。 -
一般適用于大型網站開發,
整個架構會比較重
,對于初創公司開發和維護人員的成本比較高(即薪資高),選擇用Java語言開發網站或應用系統的需要一定的經濟實力。 -
并非適用于所有領域
。比如,Objective C、Swift在iOS設備上就有著無可取代的地位。瀏覽器中的處理幾乎完全由JavaScript掌控。Windows程序通常都用C++或C#編寫。Java在服務器端編程和跨平臺客戶端應用領域則很有優勢。
14.2 JVM功能說明
JVM(J
ava V
irtual M
achine ,Java虛擬機):是一個虛擬的計算機,是Java程序的運行環境。JVM具有指令集并使用不同的存儲區域,負責執行指令,管理數據、內存、寄存器。
14.2.1 功能1:實現Java程序的跨平臺性
我們編寫的Java代碼,都運行在JVM 之上。正是因為有了JVM,才使得Java程序具備了跨平臺性。
使用JVM前后對比:
14.2.2 功能2:自動內存管理(內存分配、內存回收)
-
Java程序在運行過程中,涉及到運算的
數據的分配
、存儲
等都由JVM來完成 -
Java消除了程序員回收無用內存空間的職責。提供了一種系統級線程跟蹤存儲空間的分配情況,在內存空間達到相應閾值時,檢查并釋放可被釋放的存儲器空間。
-
GC的自動回收,提高了內存空間的利用效率,也提高了編程人員的效率,很大程度上
減少了
因為沒有釋放空間而導致的內存泄漏
。
面試題:
Java程序還會出現內存溢出和內存泄漏問題嗎? Yes!
15. 章節案例
案例1:個人信息輸出
class Exercise1{public static void main(String[] args){System.out.println("姓名:康師傅");System.out.println();//換行操作System.out.println("性別:男");System.out.println("家庭住址:北京程序員聚集地:回龍觀");}
}
案例2:輸出:心形
結合\n(換行),\t(制表符),空格等在控制臺打印出如下圖所示的效果。
方式一:
//方式一:
class Exercise2{public static void main(String[] args){System.out.print("\t");System.out.print("*");System.out.print("\t");System.out.print("\t");System.out.print("\t");System.out.print("\t");System.out.print("\t");System.out.print("\t");System.out.print("\t");System.out.println("*");
?
? System.out.print(““);
? System.out.print(”\t");
? //System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“I love java”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.println("”);
?
? System.out.print(“\t”);
? System.out.print(““);
? System.out.print(”\t");
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
?
? System.out.println("”);
?
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(““);
? System.out.print(”\t");
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
?
? System.out.println("”);
?
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(““);
? System.out.print(”\t");
? System.out.print(“\t”);
? System.out.print(“\t”);
?
? System.out.println("”);
?
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(““);
? System.out.print(”\t");
?
? System.out.println("”);
?
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(“\t”);
? System.out.print(" “);
? System.out.print(”*");
?
? }
?
}
方式二:
class Exercise3{public static void main(String[] args){ System.out.print("\t"+"*"+"\t\t\t\t\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n");System.out.print("*"+"\t\t"+"*"+"\t\t\t\t"+"I love Java"+"\t\t\t\t"+"*"+"\t\t\t"+"*"+"\n");System.out.print("\t"+"*"+"\t\t\t\t\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n");System.out.print("\t\t"+"*"+"\t\t\t\t\t\t\t\t\t\t"+"*"+"\t\t"+"\n");System.out.print("\t\t\t"+"*"+"\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n");System.out.print("\t\t\t\t"+"*"+"\t\t\t\t\t\t"+"*"+""+"\t"+"\n");System.out.print("\t\t\t\t\t"+"*"+"\t\t\t\t"+"*"+""+"\t\t"+"\n");System.out.print("\t\t\t\t\t\t"+"*"+"\t\t"+"*"+""+"\t\t"+"\n");System.out.print("\t\t\t\t\t\t\t"+"*"+"\n");}}