一名苦逼程序員的thinking in java 之路


 

      這篇文章是閱讀完了thinking in java的第一章做的非總結性的總結隨筆. 希望對某些人有所幫助.

      首先有必要說一個本人的背景,本人是一只非計算機專業出身,在計算機行業苦逼了2年的苦逼程序猿,弱勢群體?

      Thinking in java這本書我壓根就沒想過會看它, 納尼? 太特么厚了... 不知道那天怎么的心血來潮的就翻了翻,就不小心翻了一章.

      看完我就想盡量寫點什么,通俗易懂的,省着時間長了,自己很多東西忘了,還能找點東西看看. 為什么不翻書看?  答曰:老外那語法實在不敢恭維啊!(可能是翻譯的事,大牛建議看English版).

      好了,閑話不多說了,Let's go!

      第一章建議新手最好還是別看了, 當然了作者也是這么建議的(那你還寫在第一章). 不過可以看看第一章最后的總結,里面說的一句話我感覺還是挺坦誠的.大體意思就是 "選好你自己的路(深思熟慮),再去選擇語言,沒有必要非得去學習java" , 中國的一句老話"謀而后動" 就是這個道理.

      記得千萬要深思熟慮. 本人就是因為干了一年java,右"轉行"做了一年前端,導致薪水一直止步不前.

------ 正文傳送門 -----

1. 抽象過程

       抽象在某種意義上講就是"想象"(當然要合理). 從 "抽象"<---->"具體"    就產生里面向對象語言了.   舉個例子來說:

       'A&V女U' < --- >  '蒼老師'   (這就是一個抽象到具體的概念了.)

       而什么是對象呢? 當然了,不是你女/男朋友, '蒼老師'就是對象,就是所謂的'具體'.

       而什么是類呢? 必須就是 'A&V女U'....

       所以,對男同胞而言,  我們喜歡的是'類'(包括好多個對象,對象多了多好啊! 你懂得.);

       類是封裝性的表現,對象是封裝性的具體實現!

2. 聊一聊關於類即Class吧!

       我以前一直有一個困擾. Class 為什么是數據類型?

       以前我總是想,類,類,里面有好多屬性,好多方法,屬性有int 類型,String 類型, boolean 類型. 這么多類型,那怎么Class還是數據類型呢?  現在我懂了,都是騙子,想類的時候,什么都不要想,我就問你,int b = 1, 說明的b 是int 類型.  boolean flag = false,說明flag是boolean類型. 那Class cl,不就說明cl是Class類型的嗎. 那Class不是數據類型是什么.千萬別被類里面的亂七八糟的東西干擾了.

3. 每個對象都提供服務

      我感覺這個問題再好理解不過了. '蒼老師'不就為廣大的宅男同志提供服務嘛,所以說對象肯定是為我們服務的,所以,你需要什么樣的服務,就是創建什么樣的對象,當然了,首先你得確保你找到了正確的類(你不能找 '程序猿類' ---> '蒼老師' 吧!)

4. 說說可視范圍吧

    public(都能訪問到) > propected(繼承關系 可訪問) > default(本包 可以訪) > private(誰也訪問不到) .

    通常新手都喜歡用public ,編譯不容易出錯嘛! 不過切記,要根據具體的需求去用, 編譯報錯你還可以去modify ,運行時出問題,你就傻眼了.

5. 封裝 繼承 多態

    封裝上面已經提了,這里就不說了.繼承和多態是老生常談的問題了. 因為本人也不敢說完全理解了繼承和多態.所以從新人的角度分析分析.

    曾經有一次面試,有這么一個問題, 讓我說說類和接口的區別?  我當時回答的亂78遭的引來了面試官的強烈BS!

    先說說我此時的想法吧!  先說說抽象的東西吧!

    (1) 類提供的是服務(對象嘛! 還記得不!)  接口提供的是一組標准.(一組當然就是相關的東西了)

    (2) 一個類只能繼承一個類,卻可是實現多個接口.

    (3)類中的服務(方法)是實現的(當然也可以不實現,加abstract去修飾方法,這種情況的類 叫做抽象類),接口中的方法一定不能實現(當然 如何你用Eclipse IDE的話,是會提示編譯錯誤的).

    當然了,以上都是寫書面的東西,不知道為什么面試者就愛問這些東西.

    說說工作中的體會吧. 繼承一般是用來"建模"的. 什么是建模?

    建模就是建立類與類之間關系的, 也就是幾個類之間的繼承關系.建模好壞直接影響你的編碼水平,有時候我就感覺,建模更像是設計.不是你寫了個extends,擴展了一些東西就OK的.有時候更需要一些經驗的.說實在的,我現在用到繼承很少,其一是公司的系統建模架構師基本都搭建好了,你只要添加邏輯就OK,另一方面也許是自己的功力還不到家吧!

 

 

     如圖就是一組建立好的模型,一層一層的.看着多清晰啊.

 

     說的可能有點嚴重了,其實大可不怕,不能在工作中用,我自己練手還不行嗎,繼承隨便用,多用用就知道怎么設計更好了. 不過所說的多用,不是說不經大腦的就亂用,要思考,總結,不然永遠只是個猿崽子.

     繼承就說道這吧, 當然了,多態也建立在繼承的基礎之上的.

     編程的時候,經常想把一個對象不當它所屬的特定類型來對待,而是將其當做基類的對象來對待. 這句是書上原話 .

     什么意思呢.我寫一段代碼闡述一下吧!

    

public class PolymorphismTest {
	public static void main(String[] args) {
		Bird bird = new SpringCuckoo();
		callFly(bird);
	}
	
	public static void callFly(Bird whickBird/*就寫了Bird 就是所謂的基類*/) {
		whickBird.fly();
	}
}

/**
 *SpringCuckoo 春娟 ,杜鵑的一種
 *
 */
class SpringCuckoo extends Cuckoo{
	
	public void fly() {
		System.out.println("*** Spring Cuckoo **** 正在飛....");
	}
}

/**
 *Cuckoo 是布谷鳥就是杜鵑
 *
 */
class Cuckoo extends Bird {
	public void fly() {
		System.out.println("22222222222");
	}
}


/**
 *Bird是鳥 
 *
 */
class Bird {
	public void fly() {
		System.out.println("111111111111111");
	}
}

 首先看一下他們之間的層次關系吧! 如下圖.

  一般我就是這么用多態的... 就是參數直接寫成父類的. 然后其實new的時候是子類的,就可以調用子類的方法了.可能理解的不透徹,希望大牛們能幫着指點一下.

 

 

 6.關於創建對象中的內存體現

   java中new對象是動態的,什么是動態的呢?  就是對象是在程序運行時才知道創建哪些對象,然后開辟相應的內存空間存放這些對象(這些都是在內存里的heap中完成的,heap),而像C++ 是在程序編譯的時候就知道要創建哪些類,然后可能是在內存中穿件了一個類似於表似的東西記錄下來(存放在內存的Stack區),然后在運行的時候在開辟出相應的空間.我個人是這么理解的.

  C++: 1. 記錄對象表(編譯時)  2. 開辟空間(運行時)

  Java:  1. 記錄對象表 ,開辟空間(運行時)

    從以上可以看出 在運行階段 Java要比C++多干一件事, 所以要比C++慢一些(當然是對計算機來說). 不過對於現在越來越寬裕的內存來說,我不知道這種差異到底有多大. 

 

     希望寫的東西能給大家一些啟發,也歡迎大家指出我的錯誤.


免責聲明!

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



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