java应用程序编程_教孩子们Java编程

java应用程序编程

十二年前,我的小儿子戴夫(Dave)拿着我的Java教程出现在我的办公室。 戴夫让我教他编程,以便他可以制作计算机游戏。 到那时,我已经写了几本关于Java的书,并教过许多计算机编程课程,但是那是针对成年人的。 亚马逊没有适合儿童的编程书籍。 在Google上度过了几个小时之后,我只能找到一些基本的尝试来为孩子们创建Java课程,或者是非常基础的读者-兔子风格的书。 所以我决定自己写一本书。

那时,我的大儿子尤里(Yuri)是一名古典动画专业的大学生,他同意为这本书创作插图。 草稿准备就绪时,没有任何一家发行商愿意打印它,原因有二:

  • 没有针对儿童编程书籍的市场。
  • 我希望这本书以彩色印刷,这比黑白印刷要贵得多。

没什么大不了的。 我在线发布了PDF版本,因此人们可以免费下载它。 一年后,来自法国的一些好父母将其翻译成法语,然后来自东欧的Java爱好者将其翻译成俄语和Ukraninan。 这些书的这些版本仍然可以在线免费下载

今年早些时候,我收到了No Starch Press出版商的一封意想不到的电子邮件-我是否有兴趣写一本有关儿童Java编程的书? 我再次问:“您愿意以彩色印刷这本书吗?” 令我惊讶的是,出版商同意立即向我展示给他们的一堆有关其他语言编程的书籍。 时代在变化……总而言之,我接受了。 快进一年了,这本书应该在2015年Spring出版。

Java是教孩子的好选择吗?

为了回答这个问题,我们首先需要定义单词“ kid”。 对于12岁以下的孩子,我认为Java作为第一门编程语言可能太复杂了。 年幼的孩子最好使用从大型预制构件创建视觉程序的工具。 麻省理工学院创建了Scratch ,这对于八岁的孩子来说是一个激发他们探索编程兴趣的好工具。 10岁的孩子可能会更进一步,并开始使用Greenfoot学习Java的实际编程。

但是我认为,任何对学习编程感兴趣的12岁以上的人都可以使用专业开发人员使用的工具来学习认真的Java编程。 在我的第一本书中,我使用了Eclipse IDE,但是对于新书,我选择了IntelliJ IDEA Community Edition,该书也可以免费获得。

向孩子和成年人教Java的区别在于,孩子们在编写GUI程序时React更好,而Java对此功能很齐全。 我现在正在谈论JavaFX; Swing框架已经过时,您真的需要专业人士才能在Swing中创建一些花哨的东西,而JavaFX提供了良好的工具以及GUI和应用程序逻辑之间的清晰区分。

JavaFX带有“ Scene Builder”,这是一个可视化的GUI设计器,可以生成用FXML编写的GUI。 一种基于XML的语言,允许以声明的方式创建GUI。 但是不用担心,孩子们将不需要学习手动编写FXML-他们只需将UI控件拖放到画布上,Scene Builder就会生成FXML。

Java儿童教育者

如果说十二年前的孩子对学习编程不是很感兴趣,那么现在他们中的很多人(感谢您,智能手机)。 时代在变化……因此,世界各地的狂热者花时间和精力为孩子们介绍编程。 向Devoxx4Kids运动的创建者Stephan Janssen 致敬 ,该运动以创造性的方式教青少年Java。 该计划始于比利时,但现在已有十几个国家加入。 在美国这里,阿伦·古普塔(Arun Gupta)领导旧金山分会,马特·莱布尔(Matt Raible)在丹佛负责。 如果某个曼哈顿的公司愿意为孩子们举办活动提供场所,我已经准备好志愿服务并在纽约市开设一家分公司。

我为来自Oracle的Stephen Chin鼓掌,他带着一袋装满了可编程设备的设备环游世界。 今年早些时候,我参加了他的演讲“ Mary Had a Little Lambda” ,在那里他解释了Java演示了一个非常复杂的游戏的代码。 今年夏天,我参加了在希腊举行的JCrete非会议。 当其他与会者都带手提电脑时,斯蒂芬带来了二十打硬件套件,并开办了一个工作坊,孩子们用Java编程了一个机器人来跳舞Sirtaki。

我敢肯定,世界各地还有其他好人正在孩子的世界中普及Java。 二十岁的Java语言每年变得越来越年轻!

书籍摘录

我很高兴有机会向我的新书“ Java for Kids”中的两个摘录提供给InfoQ读者。 在本书中,我使用IntelliJ IDEA社区版,这是JetBrains提供的出色的免费IDE。 第一部分摘录是对类和对象的简要介绍。 第二个来自井字游戏章节。 当您教孩子时,他们创建的程序越直观,效果越好。 这就是为什么我在12章中的5章中使用JavaFX的原因。 读者将创建一个计算器和两个游戏:井字游戏和乒乓球。

书籍摘录1:类和对象

在现实世界中,您会看到并使用各种对象,每个对象都是某种“种类”,例如玩具,食物,动物,电子产品等。在Java中,我们不是说一种对象 ,而是说一类对象 。 类就像对象的蓝图。 您要编写的任何程序都将由类组成。

Java定义了各种数据类型 。 其中一些很简单,例如int,它表示整数。 其中一些更为复杂。 这些是班级 例如,System类,可用于在屏幕上打印文本,退出程序或清理计算机内存等操作。

在计算机上安装Java时,成千上万的Java类已下载到计算机上。 您的Java程序还将由可以代表现实世界中的对象组成。 如果类是数据类型,则对象是特定类型的代表。 例如,您可以在大街上看到十只狗,它们都代表着Dog类。

程序员可以通过决定要在程序中包括哪些Java类以及要创建每种类型的对象数来开始在任何应用程序上工作。 例如,他们可以在游戏应用程序中定义一个Player类,并创建两个这种类型的对象实例。

程序员互相交谈时,他们可能会说“用类Player做某事”或“用对象Player做某事”。 我们需要学习“ 类别”和“ 对象 ”这两个词的含义之间的区别。

让我们看看Java类可以包含什么。 最基本的类内部可能有任何东西。 看一下这个类声明:

class VideoGame {
}

此类为空-它什么也不知道,因此无能为力,因为花括号之间没有代码。 从Java语法的角度来看,该类是合法的,并且编译器将不会抱怨-存在一个有效的关键字类,其后跟名为VideoGame ,并且花括号具有匹配的右括号。 但是,如果我们的程序要执行某些操作,则需要可以执行操作的类。 因此,我们必须使用方法和属性加载类:

  • 方法定义类可以执行的动作。
  • 属性描述了类的各种属性。

让我们用一些内容填充VideoGame类。 该类可能有几种方法,它们可以告诉该类对象可以做什么 :启动游戏,停止游戏,保存分数,在Facebook上要求其他生命等等。 此类也可能具有一些属性(也称为字段):颜色,价格和其他属性。 表示VideoGame类的对象如下所示:

class VideoGame { 

  String color;
  int price; 

  void start () {
     // The code to start the game goes here
  } 

  void stop () {
     // The code to stop the game goes here
  } 

  void saveScore( String playerName, int score) {
     // The code to save score goes here
  }
}

此类具有colorprice两个属性。 color属性具有String数据类型,该数据类型用于存储任何文本。 价格int类型,用于存储整数。 VideoGame类具有三种方法startstopsaveScore 。 这些是我们的视频游戏应执行的动作。 此时,这些方法中的每一个都只有一行,以两个斜杠//开头。

如果一行以两个斜杠开头,则它包含一个单行注释 -仅是代码片段的描述。 如果您需要写几行注释,只需在斜杠后输入星号/ *,然后在文本中键入任意多行,然后输入* /即可指示注释的结尾

由于您刚刚开始编程,因此我们实际上不会创建视频游戏。 但是在本书的后面,我们将开发井字游戏和乒乓球游戏。

但是您不同意所有游戏的共同点吗? 在任何游戏中,您都应该能够启动和停止游戏或保存得分。 当您以面向对象的方式编写程序时,请开始考虑要放在类中的最少属性或方法。 然后,您将能够根据第一个类添加更多特定功能来编写另一个类-您将在本章后面的继承一节中学习如何做。 这就是为什么VideoGame类只有所有游戏都通用的字段和方法的原因。

图1.视频游戏对象

类与对象

在这一节中,我将向您展示如何基于类创建对象的实例,并向您介绍继承的概念。

若要重用您或其他人已经编写的代码,可以创建一个从另一个类派生的类,从而从该另一个类继承所有字段和方法。 派生类也称为“子类”,派生该子类的类称为“超类”。

以下代码示例显示了从VideoGame类继承的新类PlayStation4

class PlayStation4 extends VideoGame{
   String hardDiskSize;
   // Other attributes and method declarations go here
   // The method shareOnFacebooks checks that the user is logged in.
   // If not, it displays the window containing the message
   // "Please login to Facebook to be able to share your results"
   void shareOnFacebook(){
      // Code to share on Facebook go here
      System .out.println( "Hey, Facebook, I got PlayStation4 with " + hardDiskSize);
   }
   void shareOnTwitter(){
      // Code to share on Twitter go here
      System .out.println( "Hey, Twitter, I got PlayStation4 with "  + hardDiskSize);
   }
}

扩展VideoGame的字眼意味着PlayStation4类具有超类VideoGame。 我们也可以说PlayStation4继承自VideoGame类或“扩展” VideoGame类,这也意味着后代( PlayStation4 )的代码可以使用其超类(VideoGame)中定义的所有属性以及Videogame类中定义的所有方法(某些例外情况),我将在本书后面进行解释。 请注意,即使PlayStation4类未定义价格和颜色字段,或者方法start,stop,saveScore也未定义,但所有这些方法仍可用于PlayStation4类型的所有对象。 它们是从VideoGame继承的,不需要将它们复制/粘贴到PlayStation4类的主体中。

当我们创建对象的实例时,实际上是在计算机内存中基于某种类声明创建一个对象。 例如, 下面显示的程序CreatePlayStation4Objects使用new运算符创建类PlayStation4的两个实例。 它声明两个PlayStation4类型的变量firstPlayStationsecondPlayStation ,并且每个变量都指向内存中的单独对象。 请注意,字段hardDiskSize在这些对象中具有不同的值(500GB和1TB)。 程序调用第一对象和shareOnTwitter上第二个上的方法shareOnFacebook。

public class CreatePlayStation4Objects  { 

    public static void main( String [] args) { 

        // create one instance of the PlayStation4 class
        PlayStation4 firstPlayStation = new PlayStation4();
        firstPlayStation.hardDiskSize = "500GB" ; 

        // call the method shareOnFacebook on the first instance
        firstPlayStation.shareOnFacebook(); 

        // create another instance of PlayStation4 class
        PlayStation4 secondPlayStation = new PlayStation4();
        secondPlayStation.hardDiskSize = "1TB" ; 

        // call the method shareOnFacebook on the second instance
     secondPlayStation.shareOnTwitter();
    }

运行CreatePlayStation4Objects将打印以下内容:

Hey, Facebook, I got PlayStation4 with 500GB
Hey, Twitter, I got PlayStation4 with 1TB

如果一家游戏工厂要生产10,000个此类游戏,那么程序员可以说他们创建了10,000类PlayStation4实例。 PlayStation4的出厂描述与实际游戏有关,就像Java类与其在内存中的实例有关一样。 在真实世界的游戏工厂中,基于此描述构建实际游戏的过程类似于在编程世界中用 Java创建PlayStation4对象的实例的过程。 但是每个实例可以有一些不同的地方,例如我们示例中内部磁盘的大小。

图2.一类,两个实例

通常,程序仅在创建对象的实例之后才使用Java类的字段和方法。 与制造商相同-他们根据相同的蓝图创建数千个游戏副本。 即使这些副本代表相同的类别,但它们的属性值可能有所不同-其中一些是黑色的,而另一些可以是银色的。 其中一些具有500GB的硬盘容量,而另一些具有1TB的容量。

书籍摘录2:更改样式和应用效果

这是第10章的摘录,这时读者已经学习了JavaFX的基础知识,创建了一个登录窗口和一个计算器,并且知道如何应用CSS来设置GUI样式。 基本的井字游戏功能也已经实现,但是最好将三连胜组合脱颖而出。

突出获奖组合

获胜按钮的样式应动态更改(在运行期间)。 首先,我们需要为CSS文件添加一种样式,以显示获胜的XO按钮。 然后,类Controller可以在按钮上调用方法setStyle ,提供获胜样式的名称。

我想更改获胜按钮的背景,但是这次我将不仅使用一种颜色,还使用一种颜色渐变 。 在计算机图形学中,颜色渐变是指用从一种颜色平滑过渡到另一种颜色的多种颜色填充区域。 颜色过渡可以是线性的也可以是放射状的, 这篇Wikipedia文章为您提供了这两种示例。

我们将在游戏中使用径向渐变。 使用渐变,您可以使用两种甚至更多种颜色。 让我们在渐变色中使用三种颜色作为获胜方块。 背景颜色将从白色变为浅黄色,然后变为草坪绿色。 我们将使用红色作为中奖方形上标签的文本。

要动态更改GUI组件的样式,可以调用setStyle方法并将颜色指定为参数,例如:

myButton.setStyle("-fx-text-fill: red;");

但是将CSS规则嵌入Java程序中并不是一个好主意。 如果您决定更改样式(例如,将颜色从红色更改为粉红色)怎么办? 您不想在Java中搜索使用该样式的所有位置。 此外,更改代码中的样式将需要您重新编译Java程序,而谁愿意这样做这么简单的更改! 最好将样式定义保留在外部CSS文件中,并根据需要修改其内容。

到目前为止,我们一直在使用CSS 类型选择器 ,它们可以更改指定组件类型的样式。 但是CSS允许您定义和命名不适合特定组件类型的样式,并且可以通过名称将其应用于各种组件。 在CSS中,此类样式称为类选择器 。 让我们在文件tictactoe.css中添加一个名为.winning-square的样式选择器。

.winning-square {
    -fx-text-fill: red ;
    -fx-background-color: radial-gradient ( radius 100%, white , lightyellow , lawngreen );
}

样式选择器.winning-square包含两个样式规则:一个将按钮的文本颜色设置为红色,另一个将按钮的背景颜色设置为径向渐变。 我们的Java程序有去的按钮的现有样式的引用,并添加a.winning方 ,这将覆盖文本和button.The方法highlightWinningCombo的背景色看起来是这样两个:

private void  highlightWinningCombo( Button first, Button second, Button third){
    first.getStyleClass().add( "winning-square" );
    second.getStyleClass().add( "winning-square" );
    third.getStyleClass().add( "winning-square" );
}

试着玩游戏添加方法find3InARowhighlightWinningCombo到类控制器之后。 获胜组合将如下所示:

图3.我们有赢家!

JavaFX包括各种视觉效果基于过渡的动画 ,这些动画可以使您的GUI更加有趣。

要使用效果或动画,您需要分别从javafx.scene.effectjavafx.animation包中选择一个。 我将向您展示如何将淡入淡出过渡FadeTransition应用于我们的获胜按钮。 每个获胜按钮将保持褪色并返回其原始状态。 我们将方法applyFadeTransition添加到Controller类:

private void applyFadeTransition( Button winningButton) { 

  FadeTransition ft = new FadeTransition( Duration .millis( 1000 ), winningButton); 

  ft.setFromValue(1.0);
  ft.setToValue(0.1);
  ft.setCycleCount( 10 );
  ft.setAutoReverse(true);
  ft.play();
}

此代码创建一个动画类FadeTransition的实例,该实例将跨越1000毫秒(等于1秒),并将该动画分配给获胜按钮。 然后,代码设置淡入淡出参数,以将按钮的不透明度从1.0更改为0.1(更改为0.0将使按钮完全透明)。

将样式计数设置为10将使动画播放10次。 由于setAutoReverse(true) ,动画将在第一个周期前进,然后在第二个周期后退,依此类推。 播放方法开始动画。 将以下三行添加到方法highlightWinningCombo中,将在winingButton组件上播放动画。

applyFadeTransition(first);
applyFadeTransition(second);
applyFadeTransition(third);

下面的屏幕快照应使您了解动画周期结束的外观。

图4.褪色的获胜按钮

将此图像与上一个图像进行比较,或者更好的是,运行本书随附的代码以查看动画的效果。

更多阅读

我希望阅读本文后,某些人渴望开始教孩子Java。 我有个好消息要给你。 出版商让我在网上发布了早期的未经编辑的草稿,因此我们可以在印刷本书之前从社区中收集一些反馈。 您可能会遇到一些缺少的逗号或其他语法问题,但是在印刷时,这些问题将由书本编辑器修复。

我将在GitHub上发布书籍代码样本 。 如果您在代码示例中遇到错误,或者知道更好的解决方案,请告诉我。

教您的孩子Java! 与您的配偶一起享受Java! 向您的父母介绍Java!

翻译自: https://www.infoq.com/articles/Teaching-Kids-Java/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

java应用程序编程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值