欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

怎樣學(xué)習(xí)Java如何逐步提升?

感謝邀請(qǐng)。

我自己也是一名軟件開發(fā)工程師,目前在杭州某電子商務(wù)公司進(jìn)行中間件軟件的開發(fā)。職業(yè)生涯中用過C++,C#,Java,Python,Go等語(yǔ)言,使用最多的也是Java語(yǔ)言。接下來(lái)我就談?wù)勎覍?duì)Java開發(fā)的一些理解,談一下我是怎么學(xué)習(xí)Java的吧,希望能對(duì)想學(xué)習(xí)Java的有些幫助,能夠拋磚引玉就很開心了。

Java語(yǔ)言

學(xué)習(xí)Java語(yǔ)言之前,先來(lái)認(rèn)識(shí)一下Java語(yǔ)言吧,這樣對(duì)我們學(xué)習(xí)會(huì)有好處。

Java是一門面向?qū)ο缶幊陶Z(yǔ)言,即經(jīng)常說(shuō)的OOP(ObjectOrientedProgramming)。說(shuō)起面向?qū)ο缶幊蹋蟛糠秩嗽诖髮W(xué)時(shí)應(yīng)該都學(xué)過了C++語(yǔ)言,C++是很經(jīng)典的面向?qū)ο笳Z(yǔ)言。Java吸收了C++的OOP思想,同時(shí)也摒棄了C++中一些難以理解的元素,比如指針,多繼承等。所以,Java語(yǔ)言同時(shí)具有了功能強(qiáng)大和簡(jiǎn)單易用的優(yōu)點(diǎn)。

JVM

說(shuō)起Java,就不得不說(shuō)Java的一個(gè)很重要的特性了,那就是JVM(JavaVirtualMachine)。Java語(yǔ)言一經(jīng)發(fā)布就收到了巨大的關(guān)注和歡迎,一門新的語(yǔ)言,能夠迅速流行,肯定是在某些方面有著巨大的進(jìn)步。尤其是在老前輩C,C++面前。

JVM是Java語(yǔ)言和同時(shí)代語(yǔ)言相比的一個(gè)重大突破。Java的口號(hào)是“WriteOnce,Runeverywhere”。用Java語(yǔ)言編寫的應(yīng)用,只需編寫一次,可以在各個(gè)平臺(tái)運(yùn)行,包括Window,Linux,Mac等。簡(jiǎn)言之,Java應(yīng)用可以跨平臺(tái)。目前有很多的跨平臺(tái)語(yǔ)言,但是在當(dāng)時(shí),這可謂是一個(gè)巨大的突破。使用Java語(yǔ)言可以極大的減少跨平臺(tái)應(yīng)用的開發(fā)成本,收廣大開發(fā)者和企業(yè)的歡迎。

JVM是如何做到跨平臺(tái)呢?軟件是運(yùn)行在操作系統(tǒng)之上的,而不同的操作系統(tǒng)的內(nèi)核,系統(tǒng)API都是不同的。這也導(dǎo)致了不同操作系統(tǒng)的軟件不能在其他系統(tǒng)上直接運(yùn)行。比如Windows的exe文件在Mac上無(wú)法運(yùn)行。Mac的app軟件在Windows上也無(wú)法運(yùn)行。

計(jì)算機(jī)系統(tǒng)軟件體系結(jié)構(gòu)采用一種層的結(jié)構(gòu),有人說(shuō)過一句名言:

計(jì)算機(jī)科學(xué)領(lǐng)域的任何問題都可以通過增加一個(gè)間接的中間層來(lái)解決

JVM也是采用了這種方法。即Java代碼不是編譯成可在各平臺(tái)直接運(yùn)行的二進(jìn)制文件,而是編譯為一種Class文件。Class文件運(yùn)行在JVM中,JVM負(fù)責(zé)將Class文件翻譯成各平臺(tái)的二進(jìn)制文件。通過引入JVM中間層,Java應(yīng)用實(shí)現(xiàn)了跨平臺(tái)功能。

JVM工作原理如下圖所示:

在學(xué)習(xí)Java的時(shí)候,要記住Java的JVM特性。這樣對(duì)后續(xù)的Java學(xué)習(xí)很有好處,比如后面我將要提到的動(dòng)態(tài)代理,AOP等特性。

Java開發(fā)環(huán)境搭建

知道了Java的JVM原理之后,搭建Java開發(fā)環(huán)境就很簡(jiǎn)單了。不同的操作系統(tǒng)上需要安裝平臺(tái)相關(guān)的Java開發(fā)工具,即常說(shuō)的JDK,或JRE。

JDK=JRE+開發(fā)工具。JRE是Java應(yīng)用的運(yùn)行時(shí)環(huán)境,是必須的。JDK包含了JRE和開發(fā)工具(比如調(diào)試,日志,監(jiān)控等)。

安裝Java有兩種方式:

  1. 安裝文件安裝:手動(dòng)去Oracle官網(wǎng)下載安裝文件,進(jìn)行安裝。

  2. 包管理工具安裝:在Mac平臺(tái)推薦使用Homebrew安裝;Linux上使用apt-get或yum來(lái)安裝。

JavaIDE推薦

工欲善其事必先利其器

一個(gè)好的開發(fā)工具,能為我們提升效率。

JavaIDE有很多,比較主流的有Eclipse和IntelliJIDEA。強(qiáng)烈推薦IntelliJIDEA,比Eclipse要強(qiáng)大很多,唯一的缺點(diǎn)是IntelliJIDEA完整功能是收費(fèi)的。不過,作為日常開發(fā),社區(qū)辦已經(jīng)足夠強(qiáng)大,滿足我們的需求了。如果想使用IntelliJIDEA商業(yè)版,可以購(gòu)買,獲得更好的體驗(yàn)。

另外,如果資金不足,可以去網(wǎng)上找找破解版本,作為學(xué)習(xí)使用。不過,還是推薦使用正版軟件哦。

Java一些容易混淆的概念

我是從C#轉(zhuǎn)Java的。C#是微軟閉環(huán)的一個(gè)開發(fā)語(yǔ)言,剛開始接觸Java時(shí),還沒開始寫代碼,就已經(jīng)被Java各種概念弄的暈頭轉(zhuǎn)向。接下來(lái)我就理清一下那些容易混淆的概念。

  • Java1.6和Java6:關(guān)于Java的版本,經(jīng)常看到Java1.6和Java6的說(shuō)法。其實(shí)Java1.6和Java6是同樣的版本,只是叫法不一樣。目前在使用的版本一般都是Java6或以上了。

  • JavaSE,JavaEE,JavaME:是很早的時(shí)候提出來(lái)的一些概念,現(xiàn)在基本已廢棄了,其實(shí)可以不用關(guān)注了。但我還是簡(jiǎn)單說(shuō)明一下吧,JavaSE:JavaStandardEdition,可以認(rèn)為是Java的核心。JavaEE:JavaEnterpriseEdittion:Java企業(yè)版,基于JavaSE,添加了一些企業(yè)開發(fā)的特性,用于開發(fā)企業(yè)級(jí)的大項(xiàng)目。JavaME:JavaMobileEdition:移動(dòng)端開發(fā)版本?,F(xiàn)在基本沒有這樣的區(qū)分了,在Oracle下載Java時(shí),也只有JavaSE。JavaSE就是Java。

  • J2EE:J2EE就是JavaEE。這個(gè)概念也基本被廢棄了。不用太關(guān)心。

  • Apache:Apache是一個(gè)開源軟件基金會(huì),也是一款Web服務(wù)器,同時(shí)還是一種武裝直升機(jī)。。。。

學(xué)Java即學(xué)習(xí)Java的生態(tài)

這是我自己感觸最深的一點(diǎn),學(xué)習(xí)Java最重要的就是要學(xué)習(xí)Java的生態(tài)。這也是剛學(xué)習(xí)Java時(shí),大部分人比較迷茫的。學(xué)習(xí)其他語(yǔ)言時(shí),主要的精力可能在學(xué)習(xí)語(yǔ)言本身。而學(xué)習(xí)Java,將會(huì)需要花費(fèi)大量的精力來(lái)學(xué)習(xí)Java生態(tài)中的各個(gè)組件,類庫(kù),框架,產(chǎn)品等。當(dāng)然Java語(yǔ)言本身也是很重要的,需要花很多時(shí)間來(lái)學(xué)習(xí)。下面我就列一下Java常用的組件吧:

  1. Tomcat:Web容器。用于運(yùn)行Java的Web應(yīng)用。

  2. Jetty:Web容器。

  3. Maven:項(xiàng)目構(gòu)建工具。大多數(shù)的項(xiàng)目都是使用maven構(gòu)建的。

  4. Gradle:角色同Maven,是Maven的下一代,升級(jí)版。但市場(chǎng)普及度不如Maven。

  5. Spring:Java中最常用的框架。幾乎所有的項(xiàng)目都會(huì)使用。我會(huì)在后面單獨(dú)介紹。

  6. Mysql:數(shù)據(jù)庫(kù)。Java應(yīng)用一般選擇Mysql作為數(shù)據(jù)庫(kù)。

  7. Mybatis:數(shù)據(jù)庫(kù)訪問框架,簡(jiǎn)化數(shù)據(jù)庫(kù)訪問。

  8. Netty:網(wǎng)絡(luò)通信組件。簡(jiǎn)化網(wǎng)絡(luò)編程。

  9. log4j:LogforJava的縮寫,一款日志框架。

  10. junit:JavaUnit的縮寫,Java的單元測(cè)試框架。

  11. ApacheCommons:Apache提供的通用功能的類庫(kù)。比如字符串處理,集合處理等。

上面列出的是現(xiàn)在使用比較多的框架,一些過時(shí)了的比如Structs,Hibernate就不列舉了。框架太多了,一些過時(shí)的就不要去學(xué)習(xí)了,不要迷失在眼花繚亂的框架中。有時(shí)間可以慢慢了解。

Spring

Spring框架,是目前Java生態(tài)中最重要,也是使用最廣的一個(gè)框架了。Spring框架由最初提供的一些核心功能,發(fā)展到今天,已經(jīng)是一個(gè)非常完整的生態(tài)了。

Java是一個(gè)大生態(tài),Spring是這個(gè)大生態(tài)中的另一個(gè)大生態(tài)。

為什么Spring如此重要,Spring提供了什么功能呢?

Spring最重要,最核心,最有價(jià)值的地方其實(shí)就兩點(diǎn):

  1. IoC:InverseofControl,控制反轉(zhuǎn)。

  2. AOP:AspectOrentiedProgramming,面向切面編程。

什么是IoC?

我第一次接觸IoC時(shí),我是一臉蒙圈的,我問了隔壁搞了一年多Java的哥們,什么是IoC,他噼里啪啦和我說(shuō)了一通,什么解耦,依賴注入,Bean。完了我說(shuō),這個(gè)IoC有什么關(guān)系。

IoC是什么?如果要好理解,先從IoC這三個(gè)字母說(shuō)起,InverseofControl,控制反轉(zhuǎn)。

那就要解釋什么是控制反轉(zhuǎn)了。我們來(lái)看下面這兩段代碼:

MysqlDB是Mysql數(shù)據(jù)庫(kù)操作實(shí)現(xiàn)類

publicclassUserRepository{

privateMysqlDBdb;

publicvoidinsert(Useruser){

db.insert(user);

}

}

IDB是一個(gè)接口,可能有Mysql,Oracle,Mondo等實(shí)現(xiàn)。

publicclassUserRepository{

privateIDBdb;

publicvoidinsert(Useruser){

db.insert(user);

}

}

這兩段代碼的唯一區(qū)別就是一個(gè)使用了MysqlDB,一個(gè)使用了IDB。他們都是UserRepository的依賴。UserRepository依賴他們來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作。

使用MysqlDB的代碼中,UserRepository自己控制它依賴的組件是什么,是很明確的MysqlDB。注意這里出現(xiàn)了控制的字眼哦。

使用IDB的代碼中,UserRepository自己不能控制它依賴的組件是什么,可能是MysqlDB,可能是OracleDB,也可能是MondoDB。

本來(lái)UserRepository依賴誰(shuí)是它自己控制的,這也是絕大部分其他語(yǔ)言和Java代碼使用的方式。但是使用IDB的代碼中,控制權(quán)不在UserRepository自己這里,而是有外部來(lái)控制的。這個(gè)外部可能是其他類,可能是其他框架,總之,不是UserRepository自己。這就是控制反轉(zhuǎn)。

所以,控制反轉(zhuǎn)說(shuō)的主要是類之間的依賴關(guān)系。當(dāng)一個(gè)類將它依賴的一個(gè)具體類,變成一個(gè)抽象的接口時(shí),這是控制反轉(zhuǎn)的表現(xiàn)形式。那控制反轉(zhuǎn)有什么好處呢?

還是以上面的例子舉例:UserRepository真實(shí)想要的功能其實(shí)是“保存數(shù)據(jù)”,而不是“保存數(shù)據(jù)到Mysql”??赡芙裉焓褂肕ysql,但某天發(fā)現(xiàn)數(shù)據(jù)量大了,需要遷移到Oracle獲取更大的吞吐量,也可能使用Nosql的Mongo實(shí)現(xiàn)更靈活的弱Schema存儲(chǔ)。如果使用具體的MysqlDB,代碼就和MysqlDB耦合了,一旦更換了數(shù)據(jù)庫(kù),所有依賴MysqlDB的地方的代碼都需要改。而采用IDB的方式,代碼是不用修改的。是解耦的。而且使用接口還有個(gè)好處是,我們可以基于抽象的接口生成動(dòng)態(tài)代理,來(lái)實(shí)現(xiàn)更高級(jí)的功能。也就是動(dòng)態(tài)給Java類添加功能。

關(guān)于IoC下面的圖解釋的比較清楚:

圖一中四個(gè)齒輪是互相嚙合在一起,在軟件的角度上,就是類互相耦合。

圖二中四個(gè)齒輪不是嚙合在一起的,而是通過IoC容器連接在一起,是解耦的。

還記得前面引用的那句話嗎?

計(jì)算機(jī)科學(xué)領(lǐng)域的任何問題都可以通過增加一個(gè)間接的中間層來(lái)解決

IoC也是通過引入了額外的IoC容器來(lái)解決類之間的耦合問題。

圖一

圖二

AOP

AOP:面向切面編程。我們可以看上面的圖。向下的三個(gè)箭頭是3個(gè)業(yè)務(wù)邏輯處理工程。他們處理了各自不同的邏輯。同時(shí)這3個(gè)業(yè)務(wù)處理都有打印日志和安全的問題。那么我們可以把這些通用的邏輯提取到一個(gè)公共的地方。就是AOP中的切面。日志和安全是兩個(gè)切面,這兩個(gè)切面是可以橫切多個(gè)業(yè)務(wù)處理邏輯的。

使用AOP可以將一些公共的代碼從各個(gè)業(yè)務(wù)類中剝離到切面中,提高系統(tǒng)的可維護(hù)性和擴(kuò)展性。

Java進(jìn)階

有了上面這些基礎(chǔ)之后,基本算是Java入門了,開發(fā)基本的功能是可以了。接下來(lái)是一些進(jìn)階的推薦:

  • Java多線程編程。

  • Netty網(wǎng)絡(luò)編程。

  • JVM調(diào)優(yōu),排查問題。

  • SpringMVC,SpringBoot。

  • RPC框架使用:Dubbo,SpringCloud,gRPC。

  • 消息中間件的使用??梢钥纯碦ocketMQ源碼來(lái)學(xué)習(xí)。

  • 容器:Docker,k8s等。(這個(gè)不是Java特有的,但是未來(lái)的趨勢(shì),值得學(xué)習(xí))

以上就是我關(guān)于學(xué)習(xí)Java的一些思路吧,更多是從我自己的真實(shí)經(jīng)歷出發(fā),希望能給大家一些參考吧。能力有限,有錯(cuò)誤之處,還請(qǐng)大家?guī)椭刚?/p>