因?yàn)槭忻嫔蠜]有教孩子編程的教程書衬廷,于是本文作者自己編了一本廓奕。InfoQ的用戶朋友們有沒有教自己孩子編程的呢存皂?我司倒是有一個教自家跳小蘋果的孩子學(xué)C語言的。
十二年前程奠,我的小兒子Dave出現(xiàn)在我的辦公室丈牢,手里拿著Java教程。Dave讓我教他編程瞄沙,這樣他就能自己寫游戲了己沛。
那時候我已經(jīng)寫了幾本關(guān)于Java的書,還同時教幾門計算機(jī)編程課帕识,但那都是面向成人的泛粹;Amazon上沒有任何適合用來教孩子編程的書。在Google上搜索了幾個小時肮疗,我能找到的一些為孩子準(zhǔn)備的編程教程也只是淺嘗輒止晶姊,或者是最基礎(chǔ)的那種類似于“聰明兔(譯者注:即reader rabbit,美國著名幼兒教育品牌)”的書伪货。所以我決定自己寫一本書们衙。
那時我的大兒子Yuri在大學(xué)里主修動漫,他答應(yīng)為我的書畫插圖碱呼。當(dāng)我完成草稿的時候蒙挑,沒有出版商愿意出版它,原因有兩個:
少兒編程書根本沒有市場愚臀。
我希望這本書能彩印忆蚀,較之于黑白印刷,這大大增加了成本姑裂。
沒什么大不了的馋袜。我在網(wǎng)上發(fā)布了此書的pdf版本供大家免費(fèi)下載。一年后舶斧,幾位好心的法國家長把它譯成了法語欣鳖,然后一些來自東歐的Java愛好者又把它譯成了俄語和烏克蘭語。這些版本仍然可以從網(wǎng)上免費(fèi)下載到茴厉。
今年早些時候泽台,我收到了一封意外的電子郵件什荣,來自于No Starch出版社——問我是否有興趣寫一本給孩子看的Java編程書籍?我又問了一次怀酷,“你們愿意彩印嗎稻爬?”,出乎我意料的是胰坟,他們馬上同意了因篇,并且給我看了很多他們出版的教孩子編程的書籍,是其他語種的笔横。時代變了……長話短說竞滓,我接受了。一年很快要過去了吹缔,這本書將會在2015年春季付印商佑。
歡迎工作一到五年的Java工程師朋友們加入Java技術(shù)交流:611481448
群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)厢塘、高性能及分布式茶没、Jvm性能調(diào)優(yōu)、Spring源碼晚碾,MyBatis抓半,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰格嘁!趁年輕笛求,使勁拼,給未來的自己一個交代糕簿!
用Java來教孩子編程好嗎探入?
為了回答這個問題,我們首先要定義“孩子”這個詞懂诗。對于12歲以下的孩子來說蜂嗽,我相信Java作為第一門編程語言有點(diǎn)太復(fù)雜了。低齡一點(diǎn)的孩子一開始最好用一些寫好的程序模塊來搭建可視化程序殃恒。MIT創(chuàng)建了Scratch植旧,對于8歲大的孩子來說,它是一個很好的激發(fā)編程興趣的工具离唐。10歲的小孩就可以更進(jìn)一步隆嗅,通過Greenfoot開始學(xué)習(xí)真正地使用Java來編程。
但是我認(rèn)為侯繁,任何12歲以上的孩子,只要對編程有興趣泡躯,就可以一本正經(jīng)地去學(xué)習(xí)Java編程了贮竟,并且可以使用專業(yè)的工具來學(xué)丽焊。在之前為孩子寫的那本書里,我使用Eclipse作為IDE咕别,但在現(xiàn)在這本新書里技健,我選擇了IntelliJ IDEA社區(qū)版,它也是免費(fèi)的惰拱。
教成人和教小孩Java的區(qū)別在于雌贱,孩子們對于編寫GUI程序的反響更熱烈,而Java也很擅長做這個偿短。我說的是JavaFX欣孤;Swing框架已經(jīng)過時了,想用Swing來寫出點(diǎn)像樣的程序昔逗,需要很專業(yè)的知識降传。
JavaFX則提供了豐富的工具,并且非常優(yōu)雅地隔離了界面和應(yīng)用邏輯勾怒。JavaFX自帶了“Scene Builder”婆排,一個可視化的GUI設(shè)計工具,它可以生成用FXML描述的GUI笔链;FXML是一種基于XML的語言段只,可以通過聲明的方式來創(chuàng)建GUI。不過不用擔(dān)心鉴扫,孩子們不需要自己去寫FXML——他們只需要把UI控件拖拽到畫布(canvas)上赞枕,Scene Builder就會生成FXML。
少兒Java教育家
如果說12年前的孩子對編程還不是那么感興趣的話幔妨,那么今天的很多孩子已經(jīng)很喜歡編程了鹦赎。時代變了,于是,世界各地都有編程愛好者在花時間和精力給孩子介紹編程误堡。我們要向Stephan Janssen致敬古话,他創(chuàng)立了Devoxx4Kids運(yùn)動,用一種創(chuàng)造性的方式來教孩子編程锁施。
這種運(yùn)動最早開始于比利時陪踩,但如今很多國家都加入了。在美國悉抵,舊金山分會的領(lǐng)導(dǎo)人是Arun Gupta肩狂,而Matt Raible運(yùn)營著丹佛分會。如果有位于曼哈頓的公司愿意提供場地給孩子們搞活動的話姥饰,我已經(jīng)準(zhǔn)備好貢獻(xiàn)我的時間傻谁,在紐約建立一個分支機(jī)構(gòu)。
我要為Stephen Chin獻(xiàn)上掌聲列粪,他來自O(shè)racle审磁,他經(jīng)常背著一個袋子滿世界走谈飒,那個袋子里裝滿了可編程設(shè)備。今年早些時候态蒂,我參加了他的演講“瑪麗有個小小的lambda表達(dá)式”(譯者注:英文名“Mary Had a Little Lambda”杭措,此名字借用了著名的英語兒歌“Mary Had a Little Lamb”,lamb和lambda詞形相近)钾恢,在演講中他通過演示復(fù)雜的游戲解釋了Java手素。
今年夏天,我參加了在希臘舉行的JCrete“非會議”(譯者注:unconference瘩蚪,一種顛覆傳統(tǒng)式會議的新形式泉懦,會議內(nèi)容由參與者自己制定,主張開放式討論)募舟。其他與會者都帶著筆記本電腦來祠斧,Stephen卻帶來了兩打硬件開發(fā)套件,他舉行了一個研討會拱礁,在會上孩子們用Java編了一個機(jī)器人琢锋,可以跳Sirtaki舞(譯者注:希臘民間舞蹈)。
我肯定世界各地還有其他的好心人在給孩子們普及Java呢灶。已經(jīng)誕生20年之久的Java語言正在越變越年輕吴超。
本書節(jié)選
感謝有這樣的機(jī)會能給InfoQ的讀者呈現(xiàn)我將要出版的書籍“Java for Kids”中的兩段節(jié)選。在本書中我使用了IntelliJ IDEA社區(qū)版,JetBrains出品的免費(fèi)又好用的IDE。第一段節(jié)選是關(guān)于類和對象的簡單介紹捶牢。第二段來自于Tic-Tac-Toe(譯者注:一種棋類游戲)章節(jié)房蝉。教孩子的時候理茎,程序的可視化程度越高越好。這就是為什么我要在總共12章中的5章都使用了JavaFX。讀者們需要編寫一個計算器和兩個游戲:Tic-Tac-Toe和Ping-Pong。
本書節(jié)選1:類和對象
在現(xiàn)實(shí)世界中你會看到和用到各種對象细诸,每個對象都屬于某個“種類”,比如玩具陋守、食物震贵、動物、電子產(chǎn)品等等水评。在Java中我們不說一種對象猩系,而說一類對象。類就像是一個對象的藍(lán)圖中燥。你將要編寫的所有程序都是由各種類組成的寇甸。
Java定義了各種數(shù)據(jù)類型。有些很簡單,像int幽纷,代表整數(shù)式塌。有些復(fù)雜一點(diǎn),它們就是類友浸。比如System類,它可以用于在屏幕上打印文字偏窝、退出程序或清理計算機(jī)的內(nèi)存收恢。
你安裝了Java后,數(shù)千個Java類被下載到你的計算機(jī)中祭往。你的Java程序中包含的類也可能代表來自真實(shí)世界的對象伦意。如果說類是一種數(shù)據(jù)類型,那么對象就代表了一種特殊的類型硼补。舉個例子驮肉,你看到街上有十只狗,他們都代表了Dog這個類已骇。
程序員在開始寫程序之前离钝,先要決定需要使用哪些類,每個類要創(chuàng)建多少對象褪储。比如卵渴,在游戲應(yīng)用中他們可以定義Player類,并以此創(chuàng)建兩個對象鲤竹。
當(dāng)程序員互相交流的時候浪读,他們可能會說“對Player類做某些操作”或者“用Player對象做某些操作”。我們需要分辨類和對象這兩個詞的不同含義辛藻。
我們來看看Java類是如何組成的碘橘。最基礎(chǔ)的類可能什么都不包含≈。看看下面的類聲明:
class VideoGame {}
這是個空的類——它不帶有任何信息痘拆,也干不了任何事,因?yàn)閮蓚€大括號之間沒有任何代碼岩榆。從Java語法的角度看错负,這個類是合法的,計算機(jī)不會報錯——class是一個有效的關(guān)鍵字勇边,緊接著是名字VideoGame犹撒,大括號要成對出現(xiàn)。但如果我們的程序想干點(diǎn)什么粒褒,我們需要定義有實(shí)際意義的類识颊。所以我們需要給類加裝方法和屬性:
方法定義了一個類所能做的操作。
屬性描述了一個類的各種性質(zhì)。
我們來給VideoGame類填上內(nèi)容祥款。這個類可以有一些方法清笨,告訴我們這個類的對象能做什么:開始游戲、停止游戲刃跛、保存分?jǐn)?shù)抠艾、要求上Facebook點(diǎn)贊等等。這個類也可以有一些屬性(也叫域):顏色桨昙、價格和其他检号。代表VideoGame類的一個對象看起來是這樣的:
classVideoGame{String color;intprice;voidstart(){// 開始游戲的代碼放在這里}voidstop(){// 停止游戲的代碼放在這里}voidsaveScore(String playerName,intscore){// 保存分?jǐn)?shù)的代碼放在這里}}
這個類有兩個屬性color和price。color屬性是String類型的蛙酪,這種類型用于保存文本齐苛。price是int型的,用于保存整數(shù)桂塞。VideoGame類有三個方法:start凹蜂、stop和saveScore。這些都是我們的視頻游戲能采取的動作阁危。目前玛痊,這些方法只有以雙斜杠//開頭的一行字。
如果一行文字以雙斜杠開頭欲芹,那它就是單行的注釋——只是對代碼段的描述卿啡。如果你需要寫多行的注釋,只要輸入一個斜杠和一個星號/*菱父,然后輸入任意行的文字颈娜,最后以一個星號和一個斜杠結(jié)尾*/,代表注釋結(jié)束浙宜。
我們不會去創(chuàng)造一個真正的視頻游戲官辽,因?yàn)槲覀儾砰_始學(xué)編程。但到本書的后面部分粟瞬,我們會開發(fā)Tic-Tac-Toe和Ping-Pong游戲同仆。
但是難道你不覺得所有游戲都有共同點(diǎn)嗎?每個游戲都需要有一種方法來開始和停止或保存分?jǐn)?shù)裙品。當(dāng)你以面向?qū)ο蟮姆绞骄帉懸粋€程序俗批,你要開始思考如何使類擁有的屬性和方法保持絕對的最少。然后你可以基于第一個類來添加更多特殊的功能——在本章節(jié)后面部分你會學(xué)到繼承市怎。這就是為什么VideoGame類只擁有視頻游戲所共有的屬性和方法岁忘。
圖1:視頻游戲的對象
類還是對象
在本節(jié)中我將向你展示如何基于類來創(chuàng)建對象實(shí)例,并向你介紹繼承的概念区匠。
為了復(fù)用你或者其他人已經(jīng)寫好的代碼干像,你可以基于一個類創(chuàng)建另一個,它會繼承前一個類的所有屬性和方法。繼承別的類創(chuàng)建的類稱為“子類”麻汰,被繼承的類稱為“父類”速客。下面的代碼展示了繼承VideoGame類的新類PlayStation4。
classPlayStation4extendsVideoGame{StringhardDiskSize;// 其他屬性和方法可以在這里聲明// 方法shareOnFacebooks檢查用戶是否已經(jīng)登錄了// 如果沒有五鲫,它會顯示一個窗口溺职,帶有以下信息// “在分享你的分?jǐn)?shù)之前請先登錄Facebook”void shareOnFacebook(){// 在Facebook上分享的代碼在這里System.out.println("Hey, Facebook, I got PlayStation4 with "+ hardDiskSize); } void shareOnTwitter(){// 在Twitter上分享的代碼在這里System.out.println("Hey, Twitter, I got PlayStation4 with "+ hardDiskSize); }}
語句extends VideoGame表示PlayStation4類是VideoGame類的子類。我們也可以說PlayStation4類繼承了VideoGame類或者說“擴(kuò)展”了VideoGame類位喂,這也意味著子類(PlayStation4)既可以使用父類(VideoGame)中定義的屬性辅愿,也可以使用父類(VideoGame)中定義的所有方法(并擴(kuò)展它們),我在書的后面部分會解釋忆某。
注意PlayStation4類即使沒有定義屬性price和color,以及方法start阔蛉、stop和savaScore弃舒,但這個類的對象還是可以使用所有這些屬性和方法。它們是從VideoGame類繼承過來的状原,這些代碼不需要拷貝/粘貼到PlayStation4類中聋呢。
當(dāng)我們創(chuàng)建一個對象的實(shí)例時,我們真正所做的是基于某個類的聲明颠区,在計算機(jī)內(nèi)存中創(chuàng)建了一個對象削锰。舉個例子,下面的CreatePlayStation4Objects程序使用new運(yùn)算符創(chuàng)建了兩個PlayStation4類的實(shí)例毕莱。
它聲明了兩個PlayStation4型的變量器贩,分別是firstPlayStation和secondPlayStation,每個都指向了內(nèi)存中的一個獨(dú)立對象朋截。注意這些對象的屬性hardDiskSize有不同的值(500GB和1TB)蛹稍。這個程序?qū)Φ谝粋€對象調(diào)用了shareOnFacebook方法,而對第二個對象調(diào)用了shareOnTwitter部服。
publicclassCreatePlayStation4Objects{publicstaticvoidmain(String[] args){// 創(chuàng)建一個PlayStation4類的實(shí)例PlayStation4 firstPlayStation =newPlayStation4(); firstPlayStation.hardDiskSize ="500GB";// 對第一個實(shí)例調(diào)用shareOnFacebook方法firstPlayStation.shareOnFacebook();// 創(chuàng)建另一個PlayStation4類的實(shí)例PlayStation4 secondPlayStation =newPlayStation4(); secondPlayStation.hardDiskSize ="1TB";// 對第二個實(shí)例調(diào)用shareOnFacebook方法secondPlayStation.shareOnTwitter(); }
運(yùn)行CreatePlayStation4Objects會打印以下內(nèi)容:
Hey, Facebook, I got PlayStation4with500GB Hey, Twitter, I got PlayStation4with1TB
如果一個游戲公司要生產(chǎn)10000個這樣的游戲唆姐,那么程序員可以說他們創(chuàng)建了10000個PlayStation4的實(shí)例。游戲公司和一個真正的游戲的關(guān)系就類似于Java類和它在內(nèi)存中的實(shí)例的關(guān)系廓八。在現(xiàn)實(shí)世界中游戲公司制作一個真正的游戲奉芦,和Java編程世界中創(chuàng)建PlayStation4對象實(shí)例類似。只是每個實(shí)例會有些不一樣剧蹂,比如本例中的內(nèi)部磁盤大小声功。
圖2:一個類,兩個實(shí)例
一般情況下国夜,程序先創(chuàng)建Java類的對象實(shí)例减噪,才能使用它的屬性和方法。游戲公司也一樣——他們使用同一份原本生產(chǎn)出數(shù)千份游戲拷貝。即使這些拷貝代表了同一個類筹裕,它們還是可能有不一樣的屬性——有些是黑的色醋闭,另一些則是銀色的。有些有500GB硬盤朝卒,有些則有1TB证逻。
本書節(jié)選2:改變樣式和使用效果
這是第十章的節(jié)選,讀到那里讀者已經(jīng)掌握了JavaFX的基礎(chǔ)抗斤,寫過一個登錄窗口和一個計算器囚企,并且知道如何在界面上應(yīng)用CSS樣式。Tic-Tac-Toe游戲的基本功能也已經(jīng)實(shí)現(xiàn)瑞眼,但是如果能使制勝的三顆棋子一目了然就更好了(譯者注:Tic-Tac-Toe以三子在一直線上為勝)龙宏。
加亮制勝棋子
制勝棋子的樣式應(yīng)該可以動態(tài)改變(在運(yùn)行的時候)。首先伤疙,我們需要給CSS文件添加一個樣式來顯示制勝的X-O棋子银酗。然后Controller類可以對棋子調(diào)用setStyle方法,決定制勝的棋子使用哪種樣式徒像。
我想改變制勝棋子的背景黍特,但是這次我不想用單色了,我想用漸變色锯蛀。在計算機(jī)圖形中灭衷,漸變色是指用混合的顏色去填充一個區(qū)域,并且相鄰顏色之間是平滑過渡旁涤。顏色漸變分線性的和放射狀的翔曲,這篇維基百科的文章有這兩者的例子。
我們的游戲中使用放射狀漸變拭抬。我們可以使用兩種或更多的顏色來組成漸變色部默。我們給制勝棋子使用三種顏色吧。棋子的背景色會從白色轉(zhuǎn)變到淡黃色造虎,再到草綠色傅蹂。棋子上的文字標(biāo)簽,我們使用紅色算凿。
要動態(tài)改變GUI組件的樣式份蝴,你可以調(diào)用setStyle,并指定顏色作為參數(shù)氓轰,舉個例子:
myButton.setStyle("-fx-text-fill: red;");
但是婚夫,在你的Java程序中寫死CSS規(guī)則不是一個好主意。如果你想改變樣式該怎么辦(比如把顏色從紅色改成粉色)署鸡?你不想搜遍所有的Java文件來找出所有使用這個樣式的地方案糙。而且限嫌,改變嵌在代碼中的樣式,會導(dǎo)致程序必須重新編譯时捌,誰會為了一個簡單的修改這么干怒医!所以把樣式定義放在外部的CSS文件中會比較好,改起來就比較靈活奢讨。
至此稚叹,我們已經(jīng)使用了CSS類型選擇器來改變指定組件的樣式。但是拿诸,CSS允許你定義一個樣式并給它取名扒袖,這樣,就不僅僅是特定的組件類型可以用它亩码,各種組件都可以通過指定名字來使用它季率。在CSS中,這種樣式叫做類選擇器(class selectors)描沟。我們來給tictactoe.css添加一個叫做.winning-square的類選擇器蚀同。
.winning-square{-fx-text-fill: red;-fx-background-color:radial-gradient( radius 100%, white, lightyellow, lawngreen);}
這里的樣式選擇器.winning-square包括了兩條樣式規(guī)則:一條是要把按鈕的顏色設(shè)為紅色,另一條是要把按鈕的背景色設(shè)為我們的放射狀漸變色啊掏。我們的Java程序必須得到按鈕現(xiàn)有樣式的引用,然后再添加一個.winning-square衰猛,這就會覆蓋按鈕原來的文字和背景顏色迟蜜。方法highlightWinningCombo看起來是這樣的:
privatevoidhighlightWinningCombo(Button first, Button second, Button third){first.getStyleClass().add("winning-square");second.getStyleClass().add("winning-square");third.getStyleClass().add("winning-square");}
在給Controller類添加完find3InARow和highlightWinningCombo方法后,試著玩玩這個游戲啡省。制勝的棋子看起來就是下面這個樣子:
圖3:我們贏了娜睛!
JavaFX包括了多種視覺效果和變換動畫,這些可以使你的界面變得更有意思卦睹。
要使用這些效果和動畫畦戒,你需要在javafx.scene.effect和javafx.animation包中進(jìn)行相應(yīng)的選擇。我會給你演示一下如何在我們的制勝棋子上使用淡出的變換效果结序。每個制勝棋子不停地淡出障斋,然后又回復(fù)到初始狀態(tài)。我們要給Controller類添加一個applyFadeTransition方法徐鹤。
privatevoidapplyFadeTransition(Button winningButton) {? FadeTransitionft=newFadeTransition(Duration.millis(1000), winningButton);ft.setFromValue(1.0);ft.setToValue(0.1);ft.setCycleCount(10);ft.setAutoReverse(true);ft.play();}
這段代碼創(chuàng)建了一個動畫類FadeTransition的實(shí)例垃环,這個動畫會持續(xù)1000毫秒(等于1秒),然后把這個動畫分配給制勝棋子返敬。然后它又設(shè)置了淡出的參數(shù)遂庄,把棋子的透明度從1改到了0.1(0.0意味著完全透明)。
把樣式數(shù)量設(shè)為10代表動畫會播放10次劲赠。因?yàn)檎{(diào)用了setAutoReverse(true)涛目,這個動畫會在第一個周期中正向播放秸谢,在第二個周期中反向播放,如此循環(huán)往復(fù)霹肝。play方法則啟動了動畫估蹄。給highlightWinningCombo添加以下三行代碼,這個動畫就會在winningButton組件上播放阿迈。
applyFadeTransition(first);applyFadeTransition(second);applyFadeTransition(third);
下面的截屏告訴你動畫播放結(jié)束后的樣子元媚。
圖4:淡出的制勝棋子
把這張圖和前面一張比一比∶绮祝或者運(yùn)行書中的代碼刊棕,看看動畫是什么樣子的,就更好了待逞。
喜歡小編輕輕點(diǎn)個關(guān)注哦甥角!