一個大三學生的學習之悟

  也許大家(學生黨)跟我擁有差很少的經歷:通過了高中三年的奮發圖強,度過了無數個挑燈夜讀的夜晚,終於考進了大學(這裏就不說是考進了理想的大學了,畢竟現實很殘酷)。因而在進入了大學後,你就會發現本身愈來愈懶了,爲啥呢?那是由於大學並不像高中那樣,上課井井有理,老師時常在你身邊督促着你,上了大學,你會發現,大部分的時間都是由你決定的,就這樣,你就會漸漸的變得懶散,作什麼事情都幾乎擡不起勁,固然,這不包括你在期末考試時的「復高三」狀態。可是,此時的你有沒有想到在這大學的幾年裏,你可得爲本身的將來的價值的實現提供那必要的技能。程序員

  本人是軟件工程專業學生,學的是Java這一塊,做爲一個代碼編輯者(不敢自稱程序員,畢竟不是每一個學編程的人就是程序員了),如下主要談談本人對Java編程的一些見解,若是你是初學者,請以質疑而且在將來的實踐中記得時時去跟本人所寫的見解進行對比的態度來看看這篇文章,若是你是Java這一塊的程序員(真正的程序員),歡迎各位前輩的拍磚。web

  本人以爲,學習一個領域的東西,最重要的是有個方向,知道它包括了什麼,能解決什麼的問題,而咱們又該學習什麼。算法

  如下以Java這一塊爲例,先上圖先。編程

                     

  若是你想學習Java這一塊,而且如今還在不知道該學習什麼,本人建議你能夠先像上面所列的那樣先學習,固然這是往Javaweb這一方向的,若是你想往Android開發方向,J2SE這一部分是基礎,因此學好這一塊也是很重要的,這裏淡淡的說一句,要麼不學,要學就不要半途而廢。併發

  對於學一門語言,感受不要僅僅只侷限於語法,要是如今你問我,Java的全部保留字是什麼,說真的,我也不能完完整整的說出來,但這有很大的關係嗎?若是你是怕本身定義的變量跟Java保留字相同,那麼大可放心,Java IDE會友好的提示你,若是你是大牛,用記事原本寫Java,那麼在編譯的時候,Java編譯器會提示你相關錯誤,也大可放心,這樣的好處是鍛鍊你查bug的勇氣和能力,塞翁失馬啊!要是真的不行,果斷Google或者百度。ide

  如何學習Java,本人以爲你須要作到如下幾點:函數

  1.從內存結構去分析程序: 先問一下,平時你是如何去思考這段代碼的?工具

 1 public class Hello {
 2    public void static void main(String[] args) {
 3          int i = 10;
 4          Test t = new Test();
 5          t.setName(new String("xiao"));  //這裏是爲了說明另外一個知識點,故new了一個對象 
 6          System.out.println(t.getName());       
 7 
 8     }              
 9 }
10 
11 class Test {
12     String name;
13 
14      public void setName(String name) {
15           this.name = name;
16      }    
17 
18      public String getName() {
19           return this.name;  
20      }  
21 
22 }

 好吧,說說如何從內存結構去執行這段代碼。首先,在咱們的意識裏要創建以下的一個內存模型,當程序被加載到內存時,內存能夠被劃分爲四部分,分別是堆、棧、常量池、代碼區。堆你暫時能夠理解成你在程序中new出來的那些對象,它的特色是空間比較大,並且不會像棧那樣的有序,一旦你new出來一個對象,它就會在堆中查找一塊空間來存儲你new的對象,那麼你可能會問,那麼系統是如何調用它的呢?這在後面再解釋。堆是Java的GC工做時收集對象的地方,在這裏,GC會把對象分爲三個「代」,分別是新生代、年老代和永久代,GC主要分爲兩種:minor GC 和 Full GC,通常狀況下,minor GC 比較的活躍,它做用於新生代,採用「複製」的方式工做在新生代的eden和兩個survivor裏,缺點是採用「複製」的算法須要double area(雙倍空間),但優勢是清理速度快且沒有內存碎片;Full GC做用於整個堆中,包括新生代、年老代和永久代,它的觸發條件多是永久代空間不夠了,又或者是survivor中通過屢次的清理後仍存活的對象進階到年老代時,此時的年老代又空間不足,或者由於 System.gc()被顯示調用等別的其餘緣由,就會觸發Full GC,Full GC 發生後,若是是單處理器的系統,那麼你的運行程序就會暫停,由於此時GC在工做,或者你的系統處理器是能夠併發或並行的,但若是堆的垃圾對象太多,而且Full GC 是採用「標記-清除」算法,清理速度慢且會產生內存碎片,也會使程序必定時間的暫停,而這不可控的停頓是Java語言的一個不足之處,這也是Java運用到大型且對程序運行時沒法容忍停頓時間過長的項目的一個瓶頸,固然,G1的提出就是爲大型運用而提出的,它吸收了「增量」收集的優勢,有利於爲Java GC的改進提供一些參考,關於GC的內容,稍後本人會寫一篇文章來介紹一下(忽然發現拓展的有點多!!!正在汗顏中...)。棧,Jvm 和 操做系統共同管理的地方,你能夠理解成程序所定義的的成員變量和局部變量,這裏稍稍說一下new一個對象時,它的內存模型是系統在棧中開闢一個空間,而後在堆中開闢一個空間來存儲new出來的對象,而後這個對象所對應的堆空間的起始地址就會被系統放在你剛剛在棧中建立出來的空間中。對於常量池,你能夠理解爲存放一些常量,如字符串常量等等,而代碼區無疑是存放你的代碼的地方,有利於動態加載。單元測試

    好吧!看圖,程序從main函數開始運行,首先就會給args分配空間,注意此時的args是引用對象,因此在堆和棧中都有分配------->執行第3條語句----->執行第4條語句------>執行第5條語句(說明:當咱們new一個String對象時,因爲String是final的,因此係統會先去常量池看有沒有「xiao」這個字符串,若是沒有,它就會在常量池裏建立一個,以便下次被其餘字符串變量引用,並且它本身也會本身建立一個「xiao」對象,並指向它,這裏就能夠解釋"補充例子裏的緣由了,例子見下面" )------>執行對6條語句(此時棧中是一個匿名變量)------>程序結束後棧中變量會被清空學習

 

                                    

        

補充樣例:

 1 public class TestString {
 2 
 3    public static void main(String[] args) {
 4 
 5       String s1 = new String("xiao"); //在常量池建立了一個對象,並本身創        建一個本身如今指向的對象
 6       String s2 = new String("xiao"); //在常量池有了這個對象,不用再建立,只需本身建立一個本身如今指向的對象
 7       String s3 = "xiao";  //在常量池有了這個對象,直接指向它   
 8       String s4 = "xiao"; //在常量池有了這個對象,直接指向它 
 9 
10       System.out.println(s1==s2); //false  
11       System.out.println(s3==s4); //true 
12 
13 }
14 
15 }
View Code

 2.無論什麼語言,練是必須得,不能老是隻看不練,不要去死記硬背全部的方法,要學會去查API,你知道的不知道的類和類的方法和屬性那裏都有。

 3.遇到異常或bug,要學會本身先去讀異常和調試bug,各類IDE工具通常都有debug功能,真的解決不了再去問別人,如google、baidu及各類論壇(如博客園、csdn等),在日常的項目練習中,除了要有註釋的好習慣以外,要學會單元測試,jUnit就挺不錯的,固然還有其餘的不少工具。

 4.最後引用馬老師對對象的思考方法:面向對象的方法是當你考慮一個問題時,你首先思考的是在這一個項目中,有哪些對象、這些對象各自有什麼屬性和方法、這些對象之間有什麼關係(繼承、組合、彙集、實現等等)

相關文章
相關標籤/搜索