本帖最后由 iRobot 于 2013-5-18 22:24 编辑
今天这堂课是重中之重。请大家务必学好。
今天这堂课从非专业的角度讲解专业问题,面向不具备编程基础的人,请高手不要较真。开始。
同学们可能之前对API没有了解,不知道这是个什么东西。请自行科普。我个人把API比喻为人的双手,应该能体现出其重要性了吧。
正式讲课之前,先纠正同学们的一个观点。之前蓝黑同学说,面向对象不如跨平台重要。这个观点是不正确的。首先,Java本身并不能跨平台,真正跨平台的只有C语言。C语言可以跨产品,跨行业,跨地域,跨时间,跨性别,跨栏等。我桌子下面放着一个路由器(99买的,跟linux没半点关系),不知道有没有人能写个Java程序跑在上面。但是C语言肯定可以。其次,跨平台没有任何实际意义。我从来没有见过有人上午给神舟飞船编程,下午给潜水艇编程,晚上给路由器编程的。但是面向对象很重要,是一种编程思想,不同于C语言的面向过程。如果你精通一门面向过程语言(例如C)和一门面向对象语言(例如Java),那你基本具有跨产品,跨行业,跨地域,跨时间,跨性别,跨栏的能力了。
1. 面向对象
关于面向对象的系统化知识,请自行科普。我这里要讲的是速成版的。易学,但是不严谨。
面向对象,其本质就是将要操作的对象抽象出来,然后通过调用对象包含的若干方法和属性来完成对象的操作。面向对象最重要的三要素是类,方法,属性(考试要答封装,继承,多态)。例如汽车可以是一个对象(类),足球可以是一个对象(类)。汽车有很多属性,如颜色,长,宽,高。足球可以有许多属性,如直径,颜色,重量等。方法是对象所具有的操作。汽车可以前进,后退,打开车灯,播放音乐等,这些都是方法。足球可以踢,还可以踢,还能踢,等。请务必深刻理解这段话。
对象可大可小。站在不同的角度上看,对象是不同的。例如汽车,离远了看汽车是对象。但是走近了看,对于轮胎厂商,轮胎就是对象,轮胎也具有属性(直径,重量,条纹样式),也有方法(。。。)。针对NXT,我们的对象应该是显示屏,按钮,马达等等这些看的见的对象,以及stream,io这些抽象的对象。
类,方法和属性的使用方法是对象.方法(参数)和对象.属性(捎带静态方法是类.方法和类.属性)。牢记,无论多复杂的程序,都是这样的用法。
2. 从HelloWorld讲起
先来回顾下代码,然后我们一行一行讲起。
- import lejos.nxt.*;
-
- public class HelloWorld {
- public static void main(String[] args) {
- LCD.drawString("Hello World", 0, 0);
- Button.waitForAnyPress();
- }
- }
复制代码
第一行略过。
第三行,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”。打开之后见下图。
注意,API文档有两份。一份是NXT的,一份是PC的。PC的稍后再讲。先看NXT的。(我说的稍后通常是1-2个月不等)
区域1是总类索引。区域2是分类索引,区域3是功能区,区域4是内容区。前两个先不用管。直接点击区域3的Index(索引)标签,然后看区域4内容发生变化。
这就是LeJOS里所有的类和方法。像字典一样,A-Z字母顺序排列。官方文档上的HelloWorld是用System.out.println()输出的,但是System是一个相当大的类,不方便学习,所以我改为LCD.drawString()。既然LCD是一个类,那我们点击索引中的L,即可在区域4找到LCD类。单击打开。
区域1说明类的继承关系。这个稍后讲。区域2是类的简单说明和作者介绍。这个不讲,自行阅读。注意有价值的东西在区域3。Filed Summary(属性)。前面说过,类,方法,属性三要素。这就是属性了。我把前几个属性摘录出来,后面的请自行翻译。
<属性> CELL_HEIGHT | 单元格高度 | CELL_WIDTH | 单元格宽度 | DEFAULT_REFRESH_PERIOD | 默认刷新频率 | DISPLAY_CHAR_DEPTH | 显示字符色深,猜测,因为实际上NXT没有色深 | DISPLAY_CHAR_WIDTH | 显示字符宽度 | FONT_HEIGHT | 字体高度 | FONT_WIDTH | 字体宽度 |
都很容易看懂是吧。这个该如何使用呢?很简单,用前面提到的对象.属性来使用。找出我们的HelloWorld程序,把
- LCD.drawString("Hello World", 0, 0);
复制代码改为
- LCD.drawString(LCD. SCREEN_WIDTH+”,”+ LCD.SCREEN_HEIGHT,0, 0);
复制代码 屏幕将输出的是显示屏的宽度和高度,这是LCD的两个属性。想知道屏幕的中心点在哪里,怎么办?这样:
- LCD.drawString(LCD. SCREEN_WIDTH/2+”,”+ LCD.SCREEN_HEIGHT/2,0, 0);
复制代码 因为这两个属性本身就是int(整形),可以参与运算,所以直接除2就是中心点。下面再变化一下。我们的Helloworld是出现在屏幕的左上角的,现在要让它出现在屏幕中心:
- LCD.drawString("Hello World", LCD. SCREEN_WIDTH/2, LCD.SCREEN_HEIGHT/2);
复制代码 这样大家就明白如何使用属性了吧?属性的讲解到此结束。继续看下一部分内容。
<构造函数> 看区域2,ConstructorSummary,构造函数。构造函数在大多数语言里都是一块重要的内容。但是凑巧的是LCD的构造函数是空,只有一对括号。这里就只能先略过了。
<方法> 上图区域3,MethodSummary,方法。那句废话我就不重复了,我们使用的drawString是方法,虽然已经用过了,但是还不明白其中含义。现在我们在这个区域可以找到它的详细说明。找到之后单击,进入详细说明。
区域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试试。
- 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语言真的可以跨产品,跨行业,跨地域,跨时间,跨性别,跨栏等
|