一個大三學生的學習之悟


  也許你們(學生黨)跟我擁有差不多的經歷:經過了高中三年的奮發圖強,度過了無數個挑燈夜讀的夜晚,終於考進了大學(這里就不說是考進了理想的大學了,畢竟現實很殘酷)。於是在進入了大學后,你就會發現自己越來越懶了,為啥呢?那是因為大學並不像高中那樣,上課井然有序,老師時常在你身邊督促着你,上了大學,你會發現,大部分的時間都是由你決定的,就這樣,你就會漸漸的變得懶散,做什么事情都幾乎抬不起勁,當然,這不包括你在期末考試時的“復高三”狀態。但是,此時的你有沒有想到在這大學的幾年里,你可得為自己的未來的價值的實現提供那必要的技能。

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

  本人覺得,學習一個領域的東西,最重要的是有個方向,知道它包括了什么,能解決什么的問題,而我們又該學習什么。

  以下以Java這一塊為例,先上圖先。

                     

  如果你想學習Java這一塊,並且現在還在不知道該學習什么,本人建議你可以先像上面所列的那樣先學習,當然這是往Javaweb這一方向的,如果你想往Android開發方向,J2SE這一部分是基礎,所以學好這一塊也是很重要的,這里淡淡的說一句,要么不學,要學就不要半途而廢。

  對於學一門語言,感覺不要僅僅只局限於語法,要是現在你問我,Java的所有保留字是什么,說真的,我也不能完完整整的說出來,但這有很大的關系嗎?如果你是怕自己定義的變量跟Java保留字相同,那么大可放心,Java IDE會友好的提示你,如果你是大牛,用記事本來寫Java,那么在編譯的時候,Java編譯器會提示你相關錯誤,也大可放心,這樣的好處是鍛煉你查bug的勇氣和能力,因禍得福啊!要是真的不行,果斷Google或者百度。

  如何學習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.最后引用馬老師對對象的思考方法:面向對象的方法是當你考慮一個問題時,你首先思考的是在這一個項目中,有哪些對象、這些對象各自有什么屬性和方法、這些對象之間有什么關系(繼承、組合、聚集、實現等等)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM