怎樣學習Java?如何逐步提升?

黃權衝


1、先學習語言基礎語法、面向對象、IO、線程進程這種編程基礎。

2、學習linux常用語法、MySQL數據庫等

3、學習高級框架的使用,比如SSM,這三個還是現在java最主流的框架,還有現在企業裡面非常火的,springboot,springcloud,dubbo,這些微服務的框架。

4、建議同步學習前端技術,現在企業裡面,前後端崗位還沒那麼分離,學習前端對你有好處,而且難度也不大。

當然你在學習的時候一定不要太重視理論部分,還是要以動手為主。其實java並沒有那麼簡單,尤其是自學起來,所以如果你要是想很系統的學習,建議還是自己去報個班去學習一下。像現在的一些大的培訓機構,比如中公之類的,都有IT培訓的班。


我也不知道叫啥了哈哈



我自己也是一名軟件開發工程師,目前在杭州某電子商務公司進行中間件軟件的開發。職業生涯中用過C++,C#,Java,Python,Go等語言,使用最多的也是Java語言。接下來我就談談我對Java開發的一些理解,談一下我是怎麼學習Java的吧,希望能對想學習Java的有些幫助,能夠拋磚引玉就很開心了。



Java語言

學習Java語言之前,先來認識一下Java語言吧,這樣對我們學習會有好處。

Java是一門面向對象編程語言,即經常說的OOP(Object Oriented Programming)。說起面向對象編程,大部分人在大學時應該都學過了C++語言,C++是很經典的面嚮對象語言。Java吸收了C++的OOP思想,同時也摒棄了C++中一些難以理解的元素,比如指針,多繼承等。所以,Java語言同時具有了功能強大和簡單易用的優點。

JVM

說起Java,就不得不說Java的一個很重要的特性了,那就是JVM(Java Virtual Machine)。Java語言一經發布就收到了巨大的關注和歡迎,一門新的語言,能夠迅速流行,肯定是在某些方面有著巨大的進步。尤其是在老前輩C,C++面前。

JVM是Java語言和同時代語言相比的一個重大突破。Java的口號是“Write Once, Run everywhere”。用Java語言編寫的應用,只需編寫一次,可以在各個平臺運行,包括Window,Linux,Mac等。簡言之,Java應用可以跨平臺。目前有很多的跨平臺語言,但是在當時,這可謂是一個巨大的突破。使用Java語言可以極大的減少跨平臺應用的開發成本,收廣大開發者和企業的歡迎。

JVM是如何做到跨平臺呢?軟件是運行在操作系統之上的,而不同的操作系統的內核,系統API都是不同的。這也導致了不同操作系統的軟件不能在其他系統上直接運行。比如Windows的exe文件在Mac上無法運行。Mac的app軟件在Windows上也無法運行。

計算機系統軟件體系結構採用一種層的結構,有人說過一句名言:

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

JVM也是採用了這種方法。即Java代碼不是編譯成可在各平臺直接運行的二進制文件,而是編譯為一種Class文件。Class文件運行在JVM中,JVM負責將Class文件翻譯成各平臺的二進制文件。通過引入JVM中間層,Java應用實現了跨平臺功能。

JVM工作原理如下圖所示:

在學習Java的時候,要記住Java的JVM特性。這樣對後續的Java學習很有好處,比如後面我將要提到的動態代理,AOP等特性。

Java開發環境搭建

知道了Java的JVM原理之後,搭建Java開發環境就很簡單了。不同的操作系統上需要安裝平臺相關的Java開發工具,即常說的JDK,或JRE。

JDK = JRE + 開發工具。JRE是Java應用的運行時環境,是必須的。JDK包含了JRE和開發工具(比如調試,日誌,監控等)。

安裝Java有兩種方式:

  1. 安裝文件安裝:手動去Oracle官網下載安裝文件,進行安裝。

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

Java IDE推薦

工欲善其事必先利其器

一個好的開發工具,能為我們提升效率。

Java IDE有很多,比較主流的有Eclipse和IntelliJ IDEA。強烈推薦IntelliJ IDEA,比Eclipse要強大很多,唯一的缺點是IntelliJ IDEA完整功能是收費的。不過,作為日常開發,社區辦已經足夠強大,滿足我們的需求了。如果想使用IntelliJ IDEA商業版,可以購買,獲得更好的體驗。

另外,如果資金不足,可以去網上找找破解版本,作為學習使用。不過,還是推薦使用正版軟件哦。



Java一些容易混淆的概念

我是從C#轉Java的。C#是微軟閉環的一個開發語言,剛開始接觸Java時,還沒開始寫代碼,就已經被Java各種概念弄的暈頭轉向。接下來我就理清一下那些容易混淆的概念。


  • Java1.6和Java6:關於Java的版本,經常看到Java 1.6和Java6的說法。其實Java 1.6和Java6是同樣的版本,只是叫法不一樣。目前在使用的版本一般都是Java 6或以上了。

  • Java SE,Java EE,Java ME:是很早的時候提出來的一些概念,現在基本已廢棄了,其實可以不用關注了。但我還是簡單說明一下吧,Java SE:Java Standard Edition,可以認為是Java的核心。Java EE:Java Enterprise Edittion:Java企業版,基於Java SE,添加了一些企業開發的特性,用於開發企業級的大項目。Java ME:Java Mobile Edition:移動端開發版本。現在基本沒有這樣的區分了,在Oracle下載Java時,也只有Java SE。Java SE就是Java。

  • J2EE:J2EE就是Java EE。這個概念也基本被廢棄了。不用太關心。

  • Apache:Apache是一個開源軟件基金會,也是一款Web服務器,同時還是一種武裝直升機。。。。


學Java即學習Java的生態

這是我自己感觸最深的一點,學習Java最重要的就是要學習Java的生態。這也是剛學習Java時,大部分人比較迷茫的。學習其他語言時,主要的精力可能在學習語言本身。而學習Java,將會需要花費大量的精力來學習Java生態中的各個組件,類庫,框架,產品等。當然Java語言本身也是很重要的,需要花很多時間來學習。下面我就列一下Java常用的組件吧:


  1. Tomcat:Web容器。用於運行Java的Web應用。

  2. Jetty:Web容器。

  3. Maven:項目構建工具。大多數的項目都是使用maven構建的。

  4. Gradle:角色同Maven,是Maven的下一代,升級版。但市場普及度不如Maven。

  5. Spring:Java中最常用的框架。幾乎所有的項目都會使用。我會在後面單獨介紹。

  6. Mysql:數據庫。Java應用一般選擇Mysql作為數據庫。

  7. Mybatis:數據庫訪問框架,簡化數據庫訪問。

  8. Netty:網絡通信組件。簡化網絡編程。

  9. log4j:Log for Java的縮寫,一款日誌框架。

  10. junit:Java Unit的縮寫,Java的單元測試框架。

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

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

Spring

Spring框架,是目前Java生態中最重要,也是使用最廣的一個框架了。Spring框架由最初提供的一些核心功能,發展到今天,已經是一個非常完整的生態了。

Java是一個大生態,Spring是這個大生態中的另一個大生態。

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

Spring最重要,最核心,最有價值的地方其實就兩點:

  1. IoC:Inverse of Control,控制反轉。

  2. AOP:Aspect Orentied Programming,面向切面編程。


什麼是IoC?

我第一次接觸IoC時,我是一臉蒙圈的,我問了隔壁搞了一年多Java的哥們,什麼是IoC,他噼裡啪啦和我說了一通,什麼解耦,依賴注入,Bean。完了我說,這個IoC有什麼關係。

IoC是什麼?如果要好理解,先從IoC這三個字母說起,Inverse of Control,控制反轉。

那就要解釋什麼是控制反轉了。我們來看下面這兩段代碼:

MysqlDB是Mysql數據庫操作實現類

public class UserRepository {

private MysqlDB db;

public void insert(User user) {

db.insert(user);

}

}

IDB是一個接口,可能有Mysql,Oracle,Mondo等實現。

public class UserRepository {

private IDB db;

public void insert(User user) {

db.insert(user);

}

}

這兩段代碼的唯一區別就是一個使用了MysqlDB,一個使用了IDB。他們都是UserRepository的依賴。UserRepository依賴他們來實現數據庫操作。

使用MysqlDB的代碼中,UserRepository自己控制它依賴的組件是什麼,是很明確的MysqlDB。注意這裡出現了控制的字眼哦。

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

本來UserRepository依賴誰是它自己控制的,這也是絕大部分其他語言和Java代碼使用的方式。但是使用IDB的代碼中,控制權不在UserRepository自己這裡,而是有外部來控制的。這個外部可能是其他類,可能是其他框架,總之,不是UserRepository自己。這就是控制反轉。

所以,控制反轉說的主要是類之間的依賴關係。當一個類將它依賴的一個具體類,變成一個抽象的接口時,這是控制反轉的表現形式。那控制反轉有什麼好處呢?

還是以上面的例子舉例:UserRepository真實想要的功能其實是“保存數據”,而不是“保存數據到Mysql”。可能今天使用Mysql,但某天發現數據量大了,需要遷移到Oracle獲取更大的吞吐量,也可能使用Nosql的Mongo實現更靈活的弱Schema存儲。如果使用具體的MysqlDB,代碼就和MysqlDB耦合了,一旦更換了數據庫,所有依賴MysqlDB的地方的代碼都需要改。而採用IDB的方式,代碼是不用修改的。是解耦的。而且使用接口還有個好處是,我們可以基於抽象的接口生成動態代理,來實現更高級的功能。也就是動態給Java類添加功能。

關於IoC下面的圖解釋的比較清楚:

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

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

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

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

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

圖一

圖二


AOP

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

使用AOP可以將一些公共的代碼從各個業務類中剝離到切面中,提高系統的可維護性和擴展性。

Java進階

有了上面這些基礎之後,基本算是Java入門了,開發基本的功能是可以了。接下來是一些進階的推薦:

  • Java多線程編程。

  • Netty網絡編程。

  • JVM調優,排查問題。

  • Spring MVC,Spring Boot。

  • RPC框架使用:Dubbo,Spring Cloud,gRPC。

  • 消息中間件的使用。可以看看RocketMQ源碼來學習。

  • 容器:Docker,k8s等。(這個不是Java特有的,但是未來的趨勢,值得學習)


以上就是我關於學習Java的一些思路吧,更多是從我自己的真實經歷出發,希望能給大家一些參考吧。能力有限,有錯誤之處,還請大家幫著指正。


遊猿會


我覺得學習java編程的話,其實是一個很好的選擇,java學起來很容易的,但是一定要學習,就是堅持下去,很多的人在學習java的時候不選擇堅持下去,反而是學習一段時間之後,就不在堅持了,這樣的話,你肯定是不能學習的很好的啊,第二個比較重要的是,去網上看一下視頻,現在網上的關於java的視頻非常的多,你自己去網上學習去看一些視頻就會提高的。最重要的是堅持,因為這代碼這種東西是很容易忘記的 啊


大俠的生活日記


做過幾年java開發,主要是客戶端的開發,最近由於工作的性質也在玩java後臺開發,國內的程序員職位目前屬於java最多,所以講現在學好java可以無數次的機會拿到高薪,也值得繼續好好的學習,對於一個java程序員如何來提升自己的編程技能。

1.java編程基礎

任何一個程序員都離不開編程語法,再厲害的框架也得依賴於基礎的編程語法,由於java開發集成開發工具的易用性很多程序員脫離開IDE就不會編程了,雖然我們脫離開IDE直接編程的可能性不大,可以在平時彌補的基礎時候嘗試一下,看看是不是常見的編程範例或者方法都能記得住,當然編程基礎的學習不僅僅是為了瞭解常見的語言語法。


基礎學習還包括常見的編程模式的學習,比如多線程的編程模式總結,單例模式適用在什麼場景,很多人可能覺得這些是高級編程類的東西,如果這些套路東西已經掌握的非常熟練,並且直接就可以拿過來使用,就是基礎性的東西了,定位不同產生的效果也會不一樣。

2.java

框架思想

這個話題如果展開會非常大,現在java由於生態鏈發展的非常好,所以各種開源框架也會非常多,很多框架兼容性強有很多專門針對解決一方面的問題,在平時項目開發過程中還會因為集合很多功能,可能就會引入很多類庫解決項目中的問題,多個類庫組合在一起是不是會無縫銜接都是要考慮做的事情,這種事情做得多了也就慢慢形成一定的框架組合。

稍微再高級一點就是研究內部如何實現,造輪子的事情不是普通程序員隨便都能搞好的事情,雖然不一定人人都能造輪子起碼可以嘗試研究輪子是如何實現的,先從使用輪子開始,稍微層次再深刻一點就定製輪子,對應到項目中來使用。

一個java程序員提升能力,主要表現在如何解決問題,解決問題首先包括解決常見的語法錯誤,還有常見項目中遇見的框架問題,以及項目中的內存洩漏或者程序性能問題,還包括如何進行技術溝通,如何和客戶溝通拿到具體的需求,以及如何的細節,都是一個程序員需要具備的素質。

一個程序員首先利用技術解決實際的中的問題,並不能脫離生活而存在,很多程序員基本上都有一種內在的清高在裡面,無形之中會推崇技術的重要性,所以java程序員提升自己的關鍵不僅僅是技術主要的是從內在上利用技術上改進產品,並且調整自己的心態如何利用積蓄自己的技術,解決實際的問題。

程序員平時多研究開源社區,多去琢磨著利用自己的技術做點讓自己服氣的事情,才是真正的程序人生。


分享到:


相關文章: