一個大三學生的學習之悟,大三學生學習之悟

來源:互聯網
上載者:User

一個大三學生的學習之悟,大三學生學習之悟

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

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

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.