A. 什麼是編程思想,java編程思想是什麼,怎麼來理解
樓主你好,編程思想其實說白了就是每一個人的用於編程的習慣與方法,比如同樣是循環,十個人的循環可能都不盡相同,我與你定的變數不也不一樣嗎?
這就是每個人不同的編程思想與風格了,我是這么理解的!
若是沒有解決你的問題可以追問的哦親!...
B. 程序員的編程思想怎麼培養
編程思想培養當然要多練習總結了,我就以編程思想中演算法 —— 邏輯思維來舉例子吧。
在具體解決問題的過程中,最關鍵的能力有兩個 ——「邏輯思維」和「調試糾錯」。
程序員圈子很流行的一個笑話。
娃媽給程序員老爸打電話:「下班順路買10個包子帶回來,如果看到賣西瓜的,就買一個。」
結果娃爸手捧一個包子進了門。娃媽怒道:「你怎麼就只買了一個包子?!」
娃爸答曰:「因為看到了賣西瓜的。」
雖然是一個黑程序猿的笑話,但也體現了很典型的編程思維。編程就是理性嚴謹地與電腦對話,因此對編程者的邏輯思維能力也有很高的要求。
邏輯思維中有個很重要的原則叫 MECE(Mutually Exclusive and Collectively Exhaustive),意思就是「相互排斥且整體完備」,也就是「不重復,不遺漏」。
在編程的演算法中,需要處處考慮MECE原則。解數學題時,也是同一個道理——我們要保證答案中考慮到所有的情況,而這些情況既不遺漏,也不重疊。
調試糾錯能力
編程的世界裡,只有對與錯,沒有模糊值。在程序運行的過程中,只要最終的結果與期望不符合,就證明演算法中肯定有錯漏。
但是,程序中的bug常常不是一下就能找到的,需要我們把程序的運行順序一步步地跟走一遍,同時觀察每一步的運行結果。這就需要很多的耐心、觀察力和專注力,對抗挫能力也是一種磨練。在這個過程中,也會逐漸懂得一個道理:犯錯很正常,糾正它,下次不再犯類似的錯誤就好。
這一點,也是優秀的人身上常常共通的一項品質。這些人總是在進步,因為他們懂得「回溯、調試、糾錯」,不斷進行自我優化和成長,不斷be better。
希望對你有所啟發幫助
C. java編程思想怎麼理解
說說我個人的理解:
java編程思想並不是一本適合初學者看的書,起碼要對面向對象有了一定的了解之後在看這本書,這本書我也有,斷斷續續的看,到現在看完一多半了,有的地方並沒有完全理解,我覺得,好書,是不可能一遍就看懂的,而且看一遍也不能完全理解,如果有時間的話,要反復的看,隨著自己編程經驗的增加,理解也會越來越深入。
如果你沒有任何的基礎,建議先學一下C語言,把變數,函數,if,else,for循環這些基本的先掌握了,這些東西,是所有編程語言所共同的。
我不知道你的時間是否充裕,想學java的話,先學基礎(j2se),如果以後想學j2ee,學完基礎後要學習java web,包括html,javascript,css,servlet,jsp,學完這些之後,開始學習一些框架,像struts,spring,hibernate等等。要學的東西挺多的,如果是自學的話,我估計最少要1年,所以如果想學java,就要做好准備,不斷學習的准備!
希望以上這些對你有幫助!
D. 高手大哥們,如何提高編程思想
第1章 對象入門
「為什麼面向對象的編程會在軟體開發領域造成如此震憾的影響?」
面向對象編程(OOP)具有多方面的吸引力。對管理人員,它實現了更快和更廉價的開發與維護過程。對分析與設計人員,建模處理變得更加簡單,能生成清晰、易於維護的設計方案。對程序員,對象模型顯得如此高雅和淺顯。此外,面向對象工具以及庫的巨大威力使編程成為一項更使人愉悅的任務。每個人都可從中獲益,至少表面如此。
如果說它有缺點,那就是掌握它需付出的代價。思考對象的時候,需要採用形象思維,而不是程序化的思維。與程序化設計相比,對象的設計過程更具挑戰性——特別是在嘗試創建可重復使用(可再生)的對象時。過去,那些初涉面向對象編程領域的人都必須進行一項令人痛苦的選擇:
(1) 選擇一種諸如Smalltalk的語言,「出師」前必須掌握一個巨型的庫。
(2) 選擇幾乎根本沒有庫的C++(注釋①),然後深入學習這種語言,直至能自行編寫對象庫。
①:幸運的是,這一情況已有明顯改觀。現在有第三方庫以及標準的C++庫供選用。
事實上,很難很好地設計出對象——從而很難設計好任何東西。因此,只有數量相當少的「專家」能設計出最好的對象,然後讓其他人享用。對於成功的OOP語言,它們不僅集成了這種語言的語法以及一個編譯程序(編譯器),而且還有一個成功的開發環境,其中包含設計優良、易於使用的庫。所以,大多數程序員的首要任務就是用現有的對象解決自己的應用問題。本章的目標就是向大家揭示出面向對象編程的概念,並證明它有多麼簡單。
本章將向大家解釋Java的多項設計思想,並從概念上解釋面向對象的程序設計。但要注意在閱讀完本章後,並不能立即編寫出全功能的Java程序。所有詳細的說明和示例會在本書的其他章節慢慢道來。
1.1 抽象的進步
所有編程語言的最終目的都是提供一種「抽象」方法。一種較有爭議的說法是:解決問題的復雜程度直接取決於抽象的種類及質量。這兒的「種類」是指准備對什麼進行「抽象」?匯編語言是對基礎機器的少量抽象。後來的許多「命令式」語言(如FORTRAN,BASIC和C)是對匯編語言的一種抽象。與匯編語言相比,這些語言已有了長足的進步,但它們的抽象原理依然要求我們著重考慮計算機的結構,而非考慮問題本身的結構。在機器模型(位於「方案空間」)與實際解決的問題模型(位於「問題空間」)之間,程序員必須建立起一種聯系。這個過程要求人們付出較大的精力,而且由於它脫離了編程語言本身的范圍,造成程序代碼很難編寫,而且要花較大的代價進行維護。由此造成的副作用便是一門完善的「編程方法」學科。
為機器建模的另一個方法是為要解決的問題製作模型。對一些早期語言來說,如LISP和APL,它們的做法是「從不同的角度觀察世界」——「所有問題都歸納為列表」或「所有問題都歸納為演算法」。PROLOG則將所有問題都歸納為決策鏈。對於這些語言,我們認為它們一部分是面向基於「強制」的編程,另一部分則是專為處理圖形符號設計的。每種方法都有自己特殊的用途,適合解決某一類的問題。但只要超出了它們力所能及的范圍,就會顯得非常笨拙。
面向對象的程序設計在此基礎上則跨出了一大步,程序員可利用一些工具表達問題空間內的元素。由於這種表達非常普遍,所以不必受限於特定類型的問題。我們將問題空間中的元素以及它們在方案空間的表示物稱作「對象」(Object)。當然,還有一些在問題空間沒有對應體的其他對象。通過添加新的對象類型,程序可進行靈活的調整,以便與特定的問題配合。所以在閱讀方案的描述代碼時,會讀到對問題進行表達的話語。與我們以前見過的相比,這無疑是一種更加靈活、更加強大的語言抽象方法。總之,OOP允許我們根據問題來描述問題,而不是根據方案。然而,仍有一個聯系途徑回到計算機。每個對象都類似一台小計算機;它們有自己的狀態,而且可要求它們進行特定的操作。與現實世界的「對象」或者「物體」相比,編程「對象」與它們也存在共通的地方:它們都有自己的特徵和行為。
Alan Kay總結了Smalltalk的五大基本特徵。這是第一種成功的面向對象程序設計語言,也是Java的基礎語言。通過這些特徵,我們可理解「純粹」的面向對象程序設計方法是什麼樣的:
(1) 所有東西都是對象。可將對象想像成一種新型變數;它保存著數據,但可要求它對自身進行操作。理論上講,可從要解決的問題身上提出所有概念性的組件,然後在程序中將其表達為一個對象。
(2) 程序是一大堆對象的組合;通過消息傳遞,各對象知道自己該做些什麼。為了向對象發出請求,需向那個對象「發送一條消息」。更具體地講,可將消息想像為一個調用請求,它調用的是從屬於目標對象的一個子常式或函數。
(3) 每個對象都有自己的存儲空間,可容納其他對象。或者說,通過封裝現有對象,可製作出新型對象。所以,盡管對象的概念非常簡單,但在程序中卻可達到任意高的復雜程度。
(4) 每個對象都有一種類型。根據語法,每個對象都是某個「類」的一個「實例」。其中,「類」(Class)是「類型」(Type)的同義詞。一個類最重要的特徵就是「能將什麼消息發給它?」。
(5) 同一類所有對象都能接收相同的消息。這實際是別有含義的一種說法,大家不久便能理解。由於類型為「圓」(Circle)的一個對象也屬於類型為「形狀」(Shape)的一個對象,所以一個圓完全能接收形狀消息。這意味著可讓程序代碼統一指揮「形狀」,令其自動控制所有符合「形狀」描述的對象,其中自然包括「圓」。這一特性稱為對象的「可替換性」,是OOP最重要的概念之一。
一些語言設計者認為面向對象的程序設計本身並不足以方便解決所有形式的程序問題,提倡將不同的方法組合成「多形程序設計語言」(注釋②)。
②:參見Timothy Budd編著的《Multiparadigm Programming in Leda》,Addison-Wesley 1995年出版。
1.2 對象的介面
亞里士多德或許是認真研究「類型」概念的第一人,他曾談及「魚類和鳥類」的問題。在世界首例面向對象語言Simula-67中,第一次用到了這樣的一個概念:
所有對象——盡管各有特色——都屬於某一系列對象的一部分,這些對象具有通用的特徵和行為。在Simula-67中,首次用到了class這個關鍵字,它為程序引入了一個全新的類型(clas和type通常可互換使用;注釋③)。
③:有些人進行了進一步的區分,他們強調「類型」決定了介面,而「類」是那個介面的一種特殊實現方式。
Simula是一個很好的例子。正如這個名字所暗示的,它的作用是「模擬」(Simulate)象「銀行出納員」這樣的經典問題。在這個例子里,我們有一系列出納員、客戶、帳號以及交易等。每類成員(元素)都具有一些通用的特徵:每個帳號都有一定的余額;每名出納都能接收客戶的存款;等等。與此同時,每個成員都有自己的狀態;每個帳號都有不同的余額;每名出納都有一個名字。所以在計算機程序中,能用獨一無二的實體分別表示出納員、客戶、帳號以及交易。這個實體便是「對象」,而且每個對象都隸屬一個特定的「類」,那個類具有自己的通用特徵與行為。
因此,在面向對象的程序設計中,盡管我們真正要做的是新建各種各樣的數據「類型」(Type),但幾乎所有面向對象的程序設計語言都採用了「class」關鍵字。當您看到「type」這個字的時候,請同時想到「class」;反之亦然。
建好一個類後,可根據情況生成許多對象。隨後,可將那些對象作為要解決問題中存在的元素進行處理。事實上,當我們進行面向對象的程序設計時,面臨的最大一項挑戰性就是:如何在「問題空間」(問題實際存在的地方)的元素與「方案空間」(對實際問題進行建模的地方,如計算機)的元素之間建立理想的「一對一」對應或映射關系。
如何利用對象完成真正有用的工作呢?必須有一種辦法能向對象發出請求,令其做一些實際的事情,比如完成一次交易、在屏幕上畫一些東西或者打開一個開關等等。每個對象僅能接受特定的請求。我們向對象發出的請求是通過它的「介面」(Interface)定義的,對象的「類型」或「類」則規定了它的介面形式。「類型」與「介面」的等價或對應關系是面向對象程序設計的基礎。
下面讓我們以電燈泡為例:
Light lt = new Light();
lt.on();
在這個例子中,類型/類的名稱是Light,可向Light對象發出的請求包括包括打開(on)、關閉(off)、變得更明亮(brighten)或者變得更暗淡(dim)。通過簡單地聲明一個名字(lt),我們為Light對象創建了一個「句柄」。然後用new關鍵字新建類型為Light的一個對象。再用等號將其賦給句柄。為了向對象發送一條消息,我們列出句柄名(lt),再用一個句點符號(.)把它同消息名稱(on)連接起來。從中可以看出,使用一些預先定義好的類時,我們在程序里採用的代碼是非常簡單和直觀的。
1.3 實現方案的隱藏
為方便後面的討論,讓我們先對這一領域的從業人員作一下分類。從根本上說,大致有兩方面的人員涉足面向對象的編程:「類創建者」(創建新數據類型的人)以及「客戶程序員」(在自己的應用程序中採用現成數據類型的人;注釋④)。對客戶程序員來講,最主要的目標就是收集一個充斥著各種類的編程「工具箱」,以便快速開發符合自己要求的應用。而對類創建者來說,他們的目標則是從頭構建一個類,只向客戶程序員開放有必要開放的東西(介面),其他所有細節都隱藏起來。為什麼要這樣做?隱藏之後,客戶程序員就不能接觸和改變那些細節,所以原創者不用擔心自己的作品會受到非法修改,可確保它們不會對其他人造成影響。
④:感謝我的朋友Scott Meyers,是他幫我起了這個名字。
「介面」(Interface)規定了可對一個特定的對象發出哪些請求。然而,必須在某個地方存在著一些代碼,以便滿足這些請求。這些代碼與那些隱藏起來的數據便叫作「隱藏的實現」。站在程式化程序編寫(Proceral Programming)的角度,整個問題並不顯得復雜。一種類型含有與每種可能的請求關聯起來的函數。一旦向對象發出一個特定的請求,就會調用那個函數。我們通常將這個過程總結為向對象「發送一條消息」(提出一個請求)。對象的職責就是決定如何對這條消息作出反應(執行相應的代碼)。
對於任何關系,重要一點是讓牽連到的所有成員都遵守相同的規則。創建一個庫時,相當於同客戶程序員建立了一種關系。對方也是程序員,但他們的目標是組合出一個特定的應用(程序),或者用您的庫構建一個更大的庫。
若任何人都能使用一個類的所有成員,那麼客戶程序員可對那個類做任何事情,沒有辦法強制他們遵守任何約束。即便非常不願客戶程序員直接操作類內包含的一些成員,但倘若未進行訪問控制,就沒有辦法阻止這一情況的發生——所有東西都會暴露無遺。
有兩方面的原因促使我們控制對成員的訪問。第一個原因是防止程序員接觸他們不該接觸的東西——通常是內部數據類型的設計思想。若只是為了解決特定的問題,用戶只需操作介面即可,毋需明白這些信息。我們向用戶提供的實際是一種服務,因為他們很容易就可看出哪些對自己非常重要,以及哪些可忽略不計。
進行訪問控制的第二個原因是允許庫設計人員修改內部結構,不用擔心它會對客戶程序員造成什麼影響。例如,我們最開始可能設計了一個形式簡單的類,以便簡化開發。以後又決定進行改寫,使其更快地運行。若介面與實現方法早已隔離開,並分別受到保護,就可放心做到這一點,只要求用戶重新鏈接一下即可。
Java採用三個顯式(明確)關鍵字以及一個隱式(暗示)關鍵字來設置類邊界:public,private,protected以及暗示性的friendly。若未明確指定其他關鍵字,則默認為後者。這些關鍵字的使用和含義都是相當直觀的,它們決定了誰能使用後續的定義內容。「public」(公共)意味著後續的定義任何人均可使用。而在另一方面,「private」(私有)意味著除您自己、類型的創建者以及那個類型的內部函數成員,其他任何人都不能訪問後續的定義信息。private在您與客戶程序員之間豎起了一堵牆。若有人試圖訪問私有成員,就會得到一個編譯期錯誤。「friendly」(友好的)涉及「包裝」或「封裝」(Package)的概念——即Java用來構建庫的方法。若某樣東西是「友好的」,意味著它只能在這個包裝的范圍內使用(所以這一訪問級別有時也叫作「包裝訪問」)。「protected」(受保護的)與「private」相似,只是一個繼承的類可訪問受保護的成員,但不能訪問私有成員。繼承的問題不久就要談到。
1.4 方案的重復使用
創建並測試好一個類後,它應(從理想的角度)代表一個有用的代碼單位。但並不象許多人希望的那樣,這種重復使用的能力並不容易實現;它要求較多的經驗以及洞察力,這樣才能設計出一個好的方案,才有可能重復使用。
許多人認為代碼或設計方案的重復使用是面向對象的程序設計提供的最偉大的一種杠桿。
為重復使用一個類,最簡單的辦法是僅直接使用那個類的對象。但同時也能將那個類的一個對象置入一個新類。我們把這叫作「創建一個成員對象」。新類可由任意數量和類型的其他對象構成。無論如何,只要新類達到了設計要求即可。這個概念叫作「組織」——在現有類的基礎上組織一個新類。有時,我們也將組織稱作「包含」關系,比如「一輛車包含了一個變速箱」。
對象的組織具有極大的靈活性。新類的「成員對象」通常設為「私有」(Private),使用這個類的客戶程序員不能訪問它們。這樣一來,我們可在不幹擾客戶代碼的前提下,從容地修改那些成員。也可以在「運行期」更改成員,這進一步增大了靈活性。後面要講到的「繼承」並不具備這種靈活性,因為編譯器必須對通過繼承創建的類加以限制。
由於繼承的重要性,所以在面向對象的程序設計中,它經常被重點強調。作為新加入這一領域的程序員,或許早已先入為主地認為「繼承應當隨處可見」。沿這種思路產生的設計將是非常笨拙的,會大大增加程序的復雜程度。相反,新建類的時候,首先應考慮「組織」對象;這樣做顯得更加簡單和靈活。利用對象的組織,我們的設計可保持清爽。一旦需要用到繼承,就會明顯意識到這一點。
1.5 繼承:重新使用介面
就其本身來說,對象的概念可為我們帶來極大的便利。它在概念上允許我們將各式各樣數據和功能封裝到一起。這樣便可恰當表達「問題空間」的概念,不用刻意遵照基礎機器的表達方式。在程序設計語言中,這些概念則反映為具體的數據類型(使用class關鍵字)。
我們費盡心思做出一種數據類型後,假如不得不又新建一種類型,令其實現大致相同的功能,那會是一件非常令人灰心的事情。但若能利用現成的數據類型,對其進行「克隆」,再根據情況進行添加和修改,情況就顯得理想多了。「繼承」正是針對這個目標而設計的。但繼承並不完全等價於克隆。在繼承過程中,若原始類(正式名稱叫作基礎類、超類或父類)發生了變化,修改過的「克隆」類(正式名稱叫作繼承類或者子類)也會反映出這種變化。在Java語言中,繼承是通過extends關鍵字實現的
使用繼承時,相當於創建了一個新類。這個新類不僅包含了現有類型的所有成員(盡管private成員被隱藏起來,且不能訪問),但更重要的是,它復制了基礎類的介面。也就是說,可向基礎類的對象發送的所有消息亦可原樣發給衍生類的對象。根據可以發送的消息,我們能知道類的類型。這意味著衍生類具有與基礎類相同的類型!為真正理解面向對象程序設計的含義,首先必須認識到這種類型的等價關系。
由於基礎類和衍生類具有相同的介面,所以那個介面必須進行特殊的設計。也就是說,對象接收到一條特定的消息後,必須有一個「方法」能夠執行。若只是簡單地繼承一個類,並不做其他任何事情,來自基礎類介面的方法就會直接照搬到衍生類。這意味著衍生類的對象不僅有相同的類型,也有同樣的行為,這一後果通常是我們不願見到的。
有兩種做法可將新得的衍生類與原來的基礎類區分開。第一種做法十分簡單:為衍生類添加新函數(功能)。這些新函數並非基礎類介面的一部分。進行這種處理時,一般都是意識到基礎類不能滿足我們的要求,所以需要添加更多的函數。這是一種最簡單、最基本的繼承用法,大多數時候都可完美地解決我們的問題。然而,事先還是要仔細調查自己的基礎類是否真的需要這些額外的函數。
1.5.1 改善基礎類
盡管extends關鍵字暗示著我們要為介面「擴展」新功能,但實情並非肯定如此。為區分我們的新類,第二個辦法是改變基礎類一個現有函數的行為。我們將其稱作「改善」那個函數。
為改善一個函數,只需為衍生類的函數建立一個新定義即可。我們的目標是:「盡管使用的函數介面未變,但它的新版本具有不同的表現」。
1.5.2 等價與類似關系
針對繼承可能會產生這樣的一個爭論:繼承只能改善原基礎類的函數嗎?若答案是肯定的,則衍生類型就是與基礎類完全相同的類型,因為都擁有完全相同的介面。這樣造成的結果就是:我們完全能夠將衍生類的一個對象換成基礎類的一個對象!可將其想像成一種「純替換」。在某種意義上,這是進行繼承的一種理想方式。此時,我們通常認為基礎類和衍生類之間存在一種「等價」關系——因為我們可以理直氣壯地說:「圓就是一種幾何形狀」。為了對繼承進行測試,一個辦法就是看看自己是否能把它們套入這種「等價」關系中,看看是否有意義。
但在許多時候,我們必須為衍生類型加入新的介面元素。所以不僅擴展了介面,也創建了一種新類型。這種新類型仍可替換成基礎類型,但這種替換並不是完美的,因為不可在基礎類里訪問新函數。我們將其稱作「類似」關系;新類型擁有舊類型的介面,但也包含了其他函數,所以不能說它們是完全等價的。舉個例子來說,讓我們考慮一下製冷機的情況。假定我們的房間連好了用於製冷的各種控制器;也就是說,我們已擁有必要的「介面」來控制製冷。現在假設機器出了故障,我們把它換成一台新型的冷、熱兩用空調,冬天和夏天均可使用。冷、熱空調「類似」製冷機,但能做更多的事情。由於我們的房間只安裝了控制製冷的設備,所以它們只限於同新機器的製冷部分打交道。新機器的介面已得到了擴展,但現有的系統並不知道除原始介面以外的任何東西。
認識了等價與類似的區別後,再進行替換時就會有把握得多。盡管大多數時候「純替換」已經足夠,但您會發現在某些情況下,仍然有明顯的理由需要在衍生類的基礎上增添新功能。通過前面對這兩種情況的討論,相信大家已心中有數該如何做。
1.6 多形對象的互換使用
通常,繼承最終會以創建一系列類收場,所有類都建立在統一的介面基礎上。我們用一幅顛倒的樹形圖來闡明這一點(注釋⑤):
⑤:這兒採用了「統一記號法」,本書將主要採用這種方法。
對這樣的一系列類,我們要進行的一項重要處理就是將衍生類的對象當作基礎類的一個對象對待。這一點是非常重要的,因為它意味著我們只需編寫單一的代碼,令其忽略類型的特定細節,只與基礎類打交道。這樣一來,那些代碼就可與類型信息分開。所以更易編寫,也更易理解。此外,若通過繼承增添了一種新類型,如「三角形」,那麼我們為「幾何形狀」新類型編寫的代碼會象在舊類型里一樣良好地工作。所以說程序具備了「擴展能力」,具有「擴展性」。
以上面的例子為基礎,假設我們用Java寫了這樣一個函數:
void doStuff(Shape s) {
s.erase();
// ...
s.draw();
}
這個函數可與任何「幾何形狀」(Shape)通信,所以完全獨立於它要描繪(draw)和刪除(erase)的任何特定類型的對象。如果我們在其他一些程序里使用doStuff()函數:
Circle c = new Circle();
Triangle t = new Triangle();
Line l = new Line();
doStuff;
doStuff;
doStuff;
那麼對doStuff()的調用會自動良好地工作,無論對象的具體類型是什麼。
這實際是一個非常有用的編程技巧。請考慮下面這行代碼:
doStuff;
此時,一個Circle(圓)句柄傳遞給一個本來期待Shape(形狀)句柄的函數。由於圓是一種幾何形狀,所以doStuff()能正確地進行處理。也就是說,凡是doStuff()能發給一個Shape的消息,Circle也能接收。所以這樣做是安全的,不會造成錯誤。
我們將這種把衍生類型當作它的基本類型處理的過程叫作「Upcasting」(上溯造型)。其中,「cast」(造型)是指根據一個現成的模型創建;而「Up」(向上)表明繼承的方向是從「上面」來的——即基礎類位於頂部,而衍生類在下方展開。所以,根據基礎類進行造型就是一個從上面繼承的過程,即「Upcasting」。
在面向對象的程序里,通常都要用到上溯造型技術。這是避免去調查准確類型的一個好辦法。請看看doStuff()里的代碼:
s.erase();
// ...
s.draw();
注意它並未這樣表達:「如果你是一個Circle,就這樣做;如果你是一個Square,就那樣做;等等」。若那樣編寫代碼,就需檢查一個Shape所有可能的類型,如圓、矩形等等。這顯然是非常麻煩的,而且每次添加了一種新的Shape類型後,都要相應地進行修改。在這兒,我們只需說:「你是一種幾何形狀,我知道你能將自己刪掉,即erase();請自己採取那個行動,並自己去控制所有的細節吧。」
1.6.1 動態綁定
在doStuff()的代碼里,最讓人吃驚的是盡管我們沒作出任何特殊指示,採取的操作也是完全正確和恰當的。我們知道,為Circle調用draw()時執行的代碼與為一個Square或Line調用draw()時執行的代碼是不同的。但在將draw()消息發給一個匿名Shape時,根據Shape句柄當時連接的實際類型,會相應地採取正確的操作。這當然令人驚訝,因為當Java編譯器為doStuff()編譯代碼時,它並不知道自己要操作的准確類型是什麼。盡管我們確實可以保證最終會為Shape調用erase(),為Shape調用draw(),但並不能保證為特定的Circle,Square或者Line調用什麼。然而最後採取的操作同樣是正確的,這是怎麼做到的呢?
將一條消息發給對象時,如果並不知道對方的具體類型是什麼,但採取的行動同樣是正確的,這種情況就叫作「多形性」(Polymorphism)。對面向對象的程序設計語言來說,它們用以實現多形性的方法叫作「動態綁定」。編譯器和運行期系統會負責對所有細節的控制;我們只需知道會發生什麼事情,而且更重要的是,如何利用它幫助自己設計程序。
有些語言要求我們用一個特殊的關鍵字來允許動態綁定。在C++中,這個關鍵字是virtual。在Java中,我們則完全不必記住添加一個關鍵字,因為函數的動態綁定是自動進行的。所以在將一條消息發給對象時,我們完全可以肯定對象會採取正確的行動,即使其中涉及上溯造型之類的處理。
1.6.2 抽象的基礎類和介面
設計程序時,我們經常都希望基礎類只為自己的衍生類提供一個介面。也就是說,我們不想其他任何人實際創建基礎類的一個對象,只對上溯造型成它,以便使用它們的介面。為達到這個目的,需要把那個類變成「抽象」的——使用abstract關鍵字。若有人試圖創建抽象類的一個對象,編譯器就會阻止他們。這種工具可有效強制實行一種特殊的設計。
亦可用abstract關鍵字描述一個尚未實現的方法——作為一個「根」使用,指出:「這是適用於從這個類繼承的所有類型的一個介面函數,但目前尚沒有對它進行任何形式的實現。」抽象方法也許只能在一個抽象類里創建。繼承了一個類後,那個方法就必須實現,否則繼承的類也會變成「抽象」類。通過創建一個抽象方法,我們可以將一個方法置入介面中,不必再為那個方法提供可能毫無意義的主體代碼。
interface(介面)關鍵字將抽象類的概念更延伸了一步,它完全禁止了所有的函數定義。「介面」是一種相當有效和常用的工具。另外如果自己願意,亦可將多個介面都合並到一起(不能從多個普通class或abstract class中繼承)。
1.7 對象的創建和存在時間
從技術角度說,OOP(面向對象程序設計)只是涉及抽象的數據類型、繼承以及多形性,但另一些問題也可能顯得非常重要。本節將就這些問題進行探討。
最重要的問題之一是對象的創建及破壞方式。對象需要的數據位於哪兒,如何控制對象的「存在時間」呢?針對這個問題,解決的方案是各異其趣的。C++認為程序的執行效率是最重要的一個問題,所以它允許程序員作出選擇。為獲得最快的運行速度,存儲以及存在時間可在編寫程序時決定,只需將對象放置在堆棧(有時也叫作自動或定域變數)或者靜態存儲區域即可。這樣便為存儲空間的分配和釋放提供了一個優先順序。某些情況下,這種優先順序的控制是非常有價值的。然而,我們同時也犧牲了靈活性,因為在編寫程序時,必須知道對象的准確的數量、存在時間、以及類型。如果要解決的是一個較常規的問題,如計算機輔助設計、倉儲管理或者空中交通控制,這一方法就顯得太局限了。
第二個方法是在一個內存池中動態創建對象,該內存池亦叫「堆」或者「內存堆」。若採用這種方式,除非進入運行期,否則根本不知道到底需要多少個對象,也不知道它們的存在時間有多長,以及准確的類型是什麼。這些參數都在程序正式運行時才決定的。若需一個新對象,只需在需要它的時候在內存堆里簡單地創建它即可。由於存儲空間的管理是運行期間動態進行的,所以在內存堆里分配存儲空間的時間比在堆棧里創建的時間長得多(在堆棧里創建存
E. 編程思想是什麼意思
編程思維是通過學習編程語言,能夠幫助孩子培養邏輯思維能力和抽象思維能力,為了使計算機能夠理解人的意圖,孩子就必須要將解決的問題的思路、方法、和手段通過計算機能夠理解的形式告訴計算機,使得計算機能夠根據人的指令一步一步去工作,完成某種特定的任務,學習編程能夠培養孩子的體系化思維、邏輯思維和抽象思維!經證實80%孩子在學習少兒編程後,自然科學理解能力有顯著提升!
學習編程不僅學習的是編程知識,而且通過學習編程能提高孩子的各方面能力,有邏輯思維能力、專注能力、試錯能力和動手解決問題的能力。
選擇編程,受益一生。愛編程,會學習。
F. 學習編程如何快速入門
熟悉以下關鍵東西,可以邊學邊做,定期訓練,經常思考,長期積累:
1、語法。
2、基礎理論(數學、數據結構、演算法等)。
3、設計方法(編程原則、設計模式、框架設計等)。
4、庫(核心、基礎、UI、擴展、游戲引擎等)。
5、計算機相關(操作系統、網路、圖形學等)。
6、領域知識(游戲設計、網站設計等)。
7、開發工具(編輯器、IDE、自動部署等)。
8、項目管理(進度管理、分工協作、Bug管理、版本控制等)。
最普遍也是最重要的能力:創造力。努力分析並理解好做什麼以及怎麼做。要知道上面那些東西一開始都是不存在的。
具體方法包括:
1、快速閱讀入門教程和書籍,適合學習語言和基礎庫。比如學Java讀的《Java編程思想》,練習題做過一點,然後學ActionScript、讀Adobe官方文檔《ActionScript 3.0編程》。
2、閱讀庫的文檔、實例、源碼。比如Flash、Flex開發,熟悉官方API很重要,很多細節要具體使用時才注意到,這時候最好做個筆記。
3、做一個自己感興趣或熟悉的小項目,比如我就以黑白棋游戲作為多個語言的試水項目,一樣的邏輯,便於把關注點放在語言特點上。