找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 13590|回复: 18

【原创】【iRobot的机器人编程笔记】(四)从Hello World开始学习Java的API(上)

[复制链接]
35 乐币 回复本帖可获得 5 乐币奖励! 每人限 1 次(中奖概率 50%)
发表于 2013-5-17 21:12:27 | 显示全部楼层 |阅读模式
本帖最后由 iRobot 于 2013-5-18 22:24 编辑



       今天这堂课是重中之重。请大家务必学好。

       今天这堂课从非专业的角度讲解专业问题,面向不具备编程基础的人,请高手不要较真。开始。

       同学们可能之前对API没有了解,不知道这是个什么东西。请自行科普。我个人把API比喻为人的双手,应该能体现出其重要性了吧。

       正式讲课之前,先纠正同学们的一个观点。之前蓝黑同学说,面向对象不如跨平台重要。这个观点是不正确的。首先,Java本身并不能跨平台,真正跨平台的只有C语言。C语言可以跨产品,跨行业,跨地域,跨时间,跨性别,跨栏等。我桌子下面放着一个路由器(99买的,跟linux没半点关系),不知道有没有人能写个Java程序跑在上面。但是C语言肯定可以。其次,跨平台没有任何实际意义。我从来没有见过有人上午给神舟飞船编程,下午给潜水艇编程,晚上给路由器编程的。但是面向对象很重要,是一种编程思想,不同于C语言的面向过程。如果你精通一门面向过程语言(例如C)和一门面向对象语言(例如Java),那你基本具有跨产品,跨行业,跨地域,跨时间,跨性别,跨栏的能力了。

1.      面向对象

       关于面向对象的系统化知识,请自行科普。我这里要讲的是速成版的。易学,但是不严谨。

       面向对象,其本质就是将要操作的对象抽象出来,然后通过调用对象包含的若干方法和属性来完成对象的操作。面向对象最重要的三要素是类,方法,属性(考试要答封装,继承,多态)。例如汽车可以是一个对象(类),足球可以是一个对象(类)。汽车有很多属性,如颜色,长,宽,高。足球可以有许多属性,如直径,颜色,重量等。方法是对象所具有的操作。汽车可以前进,后退,打开车灯,播放音乐等,这些都是方法。足球可以踢,还可以踢,还能踢,等。请务必深刻理解这段话。

       对象可大可小。站在不同的角度上看,对象是不同的。例如汽车,离远了看汽车是对象。但是走近了看,对于轮胎厂商,轮胎就是对象,轮胎也具有属性(直径,重量,条纹样式),也有方法(。。。)。针对NXT,我们的对象应该是显示屏,按钮,马达等等这些看的见的对象,以及stream,io这些抽象的对象。

       类,方法和属性的使用方法是对象.方法(参数)和对象.属性(捎带静态方法是类.方法和类.属性)。牢记,无论多复杂的程序,都是这样的用法。
  
2.      从HelloWorld讲起

先来回顾下代码,然后我们一行一行讲起。

  1. import lejos.nxt.*;

  2. public class HelloWorld {
  3.         public static void main(String[] args) {
  4.                 LCD.drawString("Hello World", 0, 0);
  5.                 Button.waitForAnyPress();
  6.         }
  7. }
复制代码

       第一行略过。

       第三行,public class HelloWorld {}。以前讲过,class是类,是对象,HelloWorld是类名。我印象中所有的编程语言,都是先声明类型,后跟名称。这里类型是类,名称是HelloWorld,这就是我们整个程序最大的类。注意所有的语言括号都是匹配的,后半个括号在程序的最后一行出现。(注意,虽然格式想同,但是在变量,类名称之前的是变量类型,类声明,但是在方法之前的并不是方法类型,而是方法返回值类型。)

       第四行,public static void main(String[] args) {}。后半个括号在倒数第二行出现。有一个小括号,括号里还有参数,显然是个方法。这就是整个程序最大的方法:main方法。前面讲过,名称前面是类型,方法之前的是返回值类型,所以main方法的返回值类型是void。void型是指没有类型。但是语法上,这里不能空着,所以写void。再往前看,static,修饰符,翻译为静态。类,方法,属性前面可以有很多修饰词,static就是其中一个。说明这是一个静态方法。静态方法说明这个方法只要程序启动,就可以无条件调用。我们最大的方法main方法,当然是无条件调用的。其他方法就未必是了。再往前看,public,这是另外一个修饰符。表明这是一个公开方法。对应的还有私有,保护,密封。LeJOS这种级别的编程,全部public修饰就足够了。回想刚才class前面也有一个public,顺理成章解释为公开类(类就等价于对象,以后不再重复,只说类)。同样的道理,看小括号内部,String[] args可以理解为名称叫args,类型为String[](字符串数组)。不详细解释了,继续往下看。

       第五,六行,LCD.drawString("HelloWorld", 0, 0);正是前面解释过的对象.方法(参数)的标准使用方法。因为之前是定义类和方法,所以有那么多修饰符,但是使用的时候什么修饰符都不需要的。我们用的是LCD(显示类)下的drawString(输出文字)方法,参数是"Hello World", 0, 0。第六行同样,使用的是Button类的waitForAnyPress方法,参数为空。由于为了符合语法上的规定,所以最后必须带一对小括号。

3.      读懂你的API

       基础知识普及完毕了,下面进入正题。我之前看到有同学问,不知道实现xx功能该如何做起。认真读完这一篇,你应该会有所收获。我将举出几个例子讲解,大家要多动手尝试,举一反三。

       上一课讲过,开发文档,编译核心,示例代码,API文档是厂商必须提供的四大法宝,前3个大家都已经有所了解,今天就把最后一个讲一讲。首先,打开你的API文档。“开始”“所有程序”“LeJOS安装目录”,“API Doc NXT”。打开之后见下图。

27.png

       注意,API文档有两份。一份是NXT的,一份是PC的。PC的稍后再讲。先看NXT的。(我说的稍后通常是1-2个月不等)

       区域1是总类索引。区域2是分类索引,区域3是功能区,区域4是内容区。前两个先不用管。直接点击区域3的Index(索引)标签,然后看区域4内容发生变化。

28.png

       这就是LeJOS里所有的类和方法。像字典一样,A-Z字母顺序排列。官方文档上的HelloWorld是用System.out.println()输出的,但是System是一个相当大的类,不方便学习,所以我改为LCD.drawString()。既然LCD是一个类,那我们点击索引中的L,即可在区域4找到LCD类。单击打开。

29.png

       区域1说明类的继承关系。这个稍后讲。区域2是类的简单说明和作者介绍。这个不讲,自行阅读。注意有价值的东西在区域3。Filed Summary(属性)。前面说过,类,方法,属性三要素。这就是属性了。我把前几个属性摘录出来,后面的请自行翻译。

       <属性>
CELL_HEIGHT
单元格高度
CELL_WIDTH单元格宽度
DEFAULT_REFRESH_PERIOD 默认刷新频率
DISPLAY_CHAR_DEPTH 显示字符色深,猜测,因为实际上NXT没有色深
DISPLAY_CHAR_WIDTH 显示字符宽度
FONT_HEIGHT 字体高度
FONT_WIDTH 字体宽度

       都很容易看懂是吧。这个该如何使用呢?很简单,用前面提到的对象.属性来使用。找出我们的HelloWorld程序,把

  1. LCD.drawString("Hello World", 0, 0);
复制代码
改为

  1. LCD.drawString(LCD. SCREEN_WIDTH+”,”+ LCD.SCREEN_HEIGHT,0, 0);
复制代码
       屏幕将输出的是显示屏的宽度和高度,这是LCD的两个属性。想知道屏幕的中心点在哪里,怎么办?这样:

  1. LCD.drawString(LCD. SCREEN_WIDTH/2+”,”+ LCD.SCREEN_HEIGHT/2,0, 0);
复制代码
       因为这两个属性本身就是int(整形),可以参与运算,所以直接除2就是中心点。下面再变化一下。我们的Helloworld是出现在屏幕的左上角的,现在要让它出现在屏幕中心:

  1. LCD.drawString("Hello World", LCD. SCREEN_WIDTH/2, LCD.SCREEN_HEIGHT/2);
复制代码
       这样大家就明白如何使用属性了吧?属性的讲解到此结束。继续看下一部分内容。

       30.png

       <构造函数>
       看区域2,ConstructorSummary,构造函数。构造函数在大多数语言里都是一块重要的内容。但是凑巧的是LCD的构造函数是空,只有一对括号。这里就只能先略过了。

       <方法>
       上图区域3,MethodSummary,方法。那句废话我就不重复了,我们使用的drawString是方法,虽然已经用过了,但是还不明白其中含义。现在我们在这个区域可以找到它的详细说明。找到之后单击,进入详细说明。

31.png

       区域1和区域2有两个drawString,这是函数(方法)重载。有些函数(方法)有10多个重载也很常见。但他们并不相同。上面那个是4个参数,下面那个是3个参数,参数不同,功能不同。我们先看下面那个的说明,因为之前的”HelloWorld”,0,0正好对应3个参数。

       先看概述:

       Display a string on the LCD at specified x,y co-ordinate.
     (在屏幕上指定的坐标处显示一个字符串)

       看完这句话我们就明白了,正是我们的HelloWorld所用的功能(方法)。再看详细内容。

Parameters:
str - Thestring to be displayed
x - The xcharacter co-ordinate to display at.
y - The y character co-ordinate to display at.

参数:
Str 你想要显示的字符
X x坐标
Y y坐标

       回头看我们上面的示例程序,虽然具体参数有变化,但是都离不开str,x,y这3个内容,且顺序固定。学习要循序渐进,学会了3个参数的,看上图中4个参数的drawString()。

drawstring(str,x,y, inverted);

       前三个都一样,(实际上,方法名称相同,其参数和功能肯定是“几乎”相同的)。多出来的一个参数是inverted,翻译为反转,颠倒。

       if true the string is displayed inverted.
       如果是真,将字符串反转。

       我第一次见到这个参数时也不明白含义,我以为是把HelloWorld从右向左输出。那我们按照它说的,设置为true试试。

  1. drawstring(“HelloWorld”,0,0, true);
复制代码
       输出结果看看。原来是指把“白底黑字”翻转为“黑底白字”。用处嘛,大家看我第一课的“记事本示例”图片,上面被选中的栏目,就是翻转之后的效果。

        我们再回到刚才的方法列表区域。看完了drawString方法,我们再从头浏览。

asyncRefresh() 异步刷新,不需要掌握
asyncRefreshWait() 异步刷新等待,不需要掌握
。。。 下面两个也不需要掌握
clear() 清屏
clear(int y) 清屏
clear(int x, int y, int n) 清屏

       紧跟着三个clear方法,我们刚刚讲过,这是函数重载,功能相近。

       第一个没参数,清楚全部屏幕。

       第二个带y坐标,在坐标系里,y=5代表什么?一条平行于x轴的直线。那就是清除指定的一条线。有什么用处呢?在绘图函数里有一个方法可以绘制一条线,他们可以配合使用。

       第三个带三个坐标,x,y指定一个点,n代表从这个开始,之后的n个字符被清除。比如n=1,我们可以把HelloWorld的H清除掉,n=2,清除He。依次类推。

       好了,API我没有讲完,这次内容有些多,写累了。下半部分下周放出。这是整个语言的核心,请大家务必掌握。

4.      后记:

       LeJOS的API文档没有搜索,只能在Index页面找,这点是比较费解的。例如我要查找GetRowColor()方法,需要在字母G下面翻十几页。。。

        C语言真的可以跨产品,跨行业,跨地域,跨时间,跨性别,跨栏等
         P1120650.MOV_20130518_222227.906.jpg
         P1120654.MOV_20130518_105235.109.jpg

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2013-5-17 21:19:40 | 显示全部楼层
辛苦了,谢谢!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-5-17 21:54:31 | 显示全部楼层
极好的新手入门教程!!!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-5-17 23:06:09 | 显示全部楼层
好,最近在学习java。表示兴趣啊,
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-5-17 23:47:14 | 显示全部楼层
做这个既要耐心,又要细心,楼主辛苦了!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-5-18 06:43:56 | 显示全部楼层
学习
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-5-18 08:35:37 | 显示全部楼层
我成为楼主的反面教材!!!!!

不申辩,不讨论,接受批评和教育........
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2013-5-18 09:18:27 | 显示全部楼层
blackblue 发表于 2013-5-18 08:35
我成为楼主的反面教材!!!!!

不申辩,不讨论,接受批评和教育........

真是好同学,呵呵。   

我之前想法也和你一样,也是后来纠正过来的。闻道有先后,术业有专攻,这没什么。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-5-18 10:28:35 | 显示全部楼层
平台,对象,彻底醒悟了,谢谢老师。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-5-18 22:37:06 | 显示全部楼层

回帖奖励 +5 乐币

我是后进生,看几遍没弄明白,顶了继续看
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-5-20 05:57:02 | 显示全部楼层
大神的课堂,虽然大多看不懂,其专业性不得不膜拜
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-5-20 07:17:49 | 显示全部楼层

回帖奖励 +5 乐币

学习中……
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-5-27 10:59:21 | 显示全部楼层

回帖奖励 +5 乐币

封装,继承,多态.......
即使楼主用类比方法来介绍,我仍然不太能界定这些概念!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-5-27 18:43:06 | 显示全部楼层
本帖最后由 魔幻之术 于 2013-5-27 20:23 编辑

要学******(已屏蔽)
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2013-5-27 18:53:32 | 显示全部楼层

你在我LeJOS的教程里说要学MATLAB不合适吧?  
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-11-24 08:12 , Processed in 0.172748 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表