OO中,先有對象還是先有類?


就是問,在面向對象思想里,先有對象還是先有類,乍一看和先有雞蛋還是先有雞是一類問題,其實不然!這個問題,在lz考研復試的時候被面試官問過,一模一樣,如今又在一個筆試題里看到了類似的題目,眨一下,有人會說,沒有類,哪里來對象呢?其實不然,這個問題很經典,考的就是oo思想和軟件工程的意識。

我經歷之后的收獲:面對問題,首先分析提問的角度,看清問題

這樣問,顯然對方是在考察被考者,oo思想掌握程度和軟件工程的意識,都說在OO中,換句話就是在面向對象思想里(包含各行各業)……自然不需要在亂想什么內存角度,計算機角度,底層機制,甚至匯編都來,沒意義……這樣想的思路本身就錯的!

提問者考的不是這個,而且不是每一個面試官或者老師提問都要一字一字的說明白,當時時間有限,思考時間也有限,必須快速作答,給出結論。他們沒這個義務和必要,選拔性質嘛!就比如孫悟空能理解菩提老祖,打三下,扭頭看月亮的含義,別人理解不了,還以為孫悟空那樣想是傻x呢……

故我們需要一定的分析提問和找准角度的技能!既然是去求職,或者被考察,自然要學會如何搔到對方的癢處,lz記得,當初這個問題,本科科班出身的,沒回答對的,幾乎都被刷了……本科階段去面試過的那家公司,同樣的問題,回答者就和評論一樣,千奇百怪,振振有詞者不少。但是少有說到點子上的,或者說少有騷到了面試官癢處的人。包括lz,當初回答的理由也不讓人滿意。

問題本身來看:這個問題本身不難

屬於知道就是知道,不知道就是不知道。屬於看清問題,具有oo思想和軟件工程意識就能答對,看不清問題就亂說一氣的問題類型。

評論說:

這個問題很無聊,or lz遇到的問這個問題的人是傻x ,or 這是沒有解的題,非要標准答案,屬於強加觀點給別人,or lz是sb……唉,看了看刪除了一些出口就是臟字的非人類評論。

我個人認為,不能有問題上來就想到code,如果不是逆向和硬件,那么對於應用程序開發者,一上來就思考計算機的底層,並不是好事。故有人抬杠,一直說沒有類,怎么new對象的反問來反駁……

lz在那之前,沒有思考提問問題角度 or 回答思路的習慣。題目看不懂,總是抱怨對方為什么不說明白了,問題角度不同,答案不同,總是一籌莫展,不知回答哪個。

后來見到了實驗室的老板,包括一些公司的部門老大,真的,當你周圍存在一些競爭對手,且水平有的比你還高的時候,回答人家的問題,必須要思考對方提問的角度和回答的思路,否則死的很慘。不論什么樣的問題,當lz躊躇,猶豫,罵提問者腦殘,傻x的時候,總有人比你快,先你一步,得出對方滿意的答案,不服不行,這就是能力!lz吃過虧。

確實是因為問題角度不同,所以答案不同。比如一個很無聊但是能說明問題的例子,如果是面試小學數學老師,問你1+1=多少,自然是2,面試哲學老師,答案就不一定是2,面試文藝類的老師職位,答案更可能千奇百怪。

但是我們這個問題的環境來看,角度很明確。環境是求職面試,或者研究生復試,前提是各行各業都可能有的面向對象思想,故你沒得理由上來就辱罵對方是傻x,你必須給出個所在領域的合適的結果。對方就是在問,思想境界里,先有對象還是先有類……如此而已,不用扯什么匯編和其他OO語言的程序設計。比如,lz就知道在綜合面向過程和面向對象的c++語言里,類是不被分配內存的,編譯器把類看成一種新的數據類型來理解,只有生成對象的時候,對象是被分配內存的。好比,int類型不會被分配內存空間但是在其他OO語言里,不一定是這樣的。

想綜合自己的看法分析下,我也不是技術大牛,我只是結合我的經歷和認知在分析。還有,除了上述的幾類,如有不同意見,歡迎文明評論!

軟件開發的過程

先經過需求分析,然后概要設計,詳細設計,之后才是編碼,測試等,那么開始的分析和設計階段,面向對象思想的程序,必然是先設計類,類的設計來源於對象的抽象。

類的定義

類的定義:類(Class)實際上是對某種類型的對象定義變量和方法的原型。是具有相同屬性和操作的一組對象的集合!它表示對現實生活中一類具有共同特征的事物的抽象,是面向對象編程的基礎。看到這里,已經無需多言,標准答案,是先有對象,再有類

面向過程簡單說明

從功能角度出發去分析問題,把問題解決方案分解為步驟或者說是模塊!這類結構化的思維特點是自頂向下去設計程序,盡量的結構化組織架構,把各個模塊的各部分元素實現低耦合,高內聚(相對來說),編寫程序主要使用結構化的語法——順序,分支,循環。通俗的說:程序= 數據結構 + 算法。把各個模塊或者步驟分開設計,編碼,測試,最后再統一為一個有機整體!故面向過程語言也叫命令型語音。使用函數分解法,把函數分解的盡量小,足夠簡單,一種類似迭代的設計。實現高度模塊化!

好處:一目了然,有條理

缺點:不利於維護,因為軟件開發最難的地方在於后期維護(包括營銷推廣、bug修正,和軟件的升級等),因為面向過程把數據和方法分離!導致了數據管理混亂,理解困難,重用性差,容易產生串聯改變!

面向對象簡單說明

oop,ood,是一種接近或者相似於我們人的思考方式的一種程序設計方法,OO,重點就是類的設計!比如造汽車,不需要第一關心去設計一步步的制造步驟,而是先去設計類,假如車門類,發動機類,外形類,輪胎類,動力類,顏色類,容量類,排量類等,不需要第一就去關心各個組織模塊的功能如何實現,而是先去關心各個類的設計,把數據和方法封裝不分離!獨立為一個整體,讓類的實體——對象,通過給各個獨立的這些類發送消息,驅動他們有機的運轉!

在OO里,程序=對象+消息,且至少要有三大特點(遞進關系):封裝,繼承(多態的基礎),多態。

再次強調,OO中,先有對象后有類。

總結:

類似“OO中,or OO思想,先有對象還是先又類”,不存在什么爭議,考察的就是OO思想和軟件工程的意識,因為它流行,很多軟件在使用。如果有企業面試,問這個問題,結果不是這個,那么你可以扭頭就走。

 

歡迎關注

 

dashuai的博客是終身學習踐行者,大廠程序員,且專注於工作經驗、學習筆記的分享和日常吐槽,包括但不限於互聯網行業,附帶分享一些PDF電子書,資料,幫忙內推,歡迎拍磚!

 

 

 

 


免責聲明!

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



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