1、编程方法学,第五课,好吧。让我们先开始。在今天开始前有个简短的通知希望你们的生活得不错并且都在忙着在卡雷尔。只是快速调查有多少人已经真正完成卡雷尔了?哦,是的。我不会问有多少人尚未下载Eclipse。今天没有讲义。给你们点儿喘息的时间吧-没讲义。别担心,下一次你会拿到更多一点的讲义。,一部分会从本周开始,所以希望你们都应该从你们的部门负责人那里得到一份关于你做的部分的EMAIL,所以你们实际上可以做作业1,电子邮件的一部分。在你所有的时间里应该有编程的一部分。,另外一件事情是Tresidder层,每隔一段时间你们就听我提起过。这是Tresidder的一个集群。所以每一周,周六至周四的每一天下午
2、六点到午夜会在那里有工作人员的助教,事实上有时候有两三个人。,他们在那里就专门为106种课程。他们只是在那里帮你解决这类问题,他们知道你正在做什么课程,整个过程。他们都喜欢,你的部门领导,他们都是非常训练有素的这样做。 另一件事是这么回事儿,你应该做作业1。我已经得到一堆分配1号的电子邮件。前些天,当我收到前几封的时候,我真的尝试全部回复它们,但在某个时刻,我就放弃了。,所以我不能单独回复每个人。我很抱歉如果我不单独回复你,但我确实读完了你的邮件。我向你保证,我真的完整地看完了论文并且看了配图。为了证明给你们看我做的,这里有一些在范围内的有趣的刻录光盘。 因此,有人把他们的台湾生活时间花在一个
3、佛教寺院,我认为是有趣的,除了他们事实上就是作为和尚生活以外,我认为是非常有趣的。,其它人会说-在这个概念上我不太确定,但是也许我可以阐明一下。有一个素食主义者只吃低质量的肉,所以它提到,像汉堡之类的东西不是肉。那我将有资格说那不是一个素食主义者,这就是一个研究生。 所以,在我开始前对任何事情有什么疑问么?今天我们将复习一些图形界面的东西,在深入聊聊对象和类,探讨探讨变量和值,各种好东西,有什么问题么?,好,那我们开始上课。今天主要内容之一是变量。这个变量,类似于数学中的变量,就像变量X和Y。对吧? 我们可以对变量进行各种数学运算 在计算机中,它们真的很容易,你不必担心积分或是微分,计算机里的
4、变量就是这么友好。在计算机里,基本上,所有变量都是一个盒子,可以放东西进去,并且这些东西都是可变的,因此我们称之为变量,因为这是一个可放东西的变量,就像大家学的数学,可以给X赋不同的值。基本上就是这样 。,那么在计算机里,变量到底是什么呢?变量有三要素:有名称用来标识这个盒子,这与数学中的概念稍有不同。类型可以告诉你盒子里放的是什么玩意,一些盒子里放的是数字,一些放的是字母,一些放的是其它东西,比如一些小对象。类型指的是盒子里放的东西。 还有一个要素是值,值告诉我们盒子里放的东西是什么,小盒子里到底放了什么,如果存储的是数字,比如3 ,3就是它的值。而且它还有一个对应的名字。,我们应该怎么命名
5、呢,这就有一个规则,并不复杂,但你需要记住,在JAVA中如何给变量命名才是有效的。有效的名称,必须给变量这么起名字,必须以字母或者下划线开头,以字母表中的字母开头。可以大写也可以小写,也可以用下划线开头. 下划线,这就是下划线,一条靠在底部的短线,字母或者下划线后面,可以跟字母、数字。比如1、2、3、4或者0等等。或者下划线。 不能以数字开头,必须以字母或者下划线开头,在这门课上,我们只用字母命名,我们通常不用下划线,数字偶尔用,你可以在首字母后用数字,,稍微提醒下,你是用的变量名,不能和JAVA中的保留的已知关键字重名。也就是说明明不能和JAVA中的特殊关键字重名 比如class是JAVA中
6、的特殊关键字。在课本上有一页,差不多在第二章,列出了所有特殊关键词,英语中大概有127000个单词,JAVA中只有四十个单次不能用作变量名, 所以你还有很多选择,其实,你也不一定要用英文单词,只要遵照规则,任何名称都可以,重要的是,对于命名来说,准确的命名,是一个良好的软件工程原则,比如说你有一个程序需要维护,比如银行账户的余额,对于“账户余额”这个变量,你最好将其命名为“Balance”之类的。,如果你命名为A那就太糟糕了,因为没人知道A是什么。比如我给你一个A,我当然知道A是什么,但有人说,A是余额,有人说,不,在我的程序里,A是我今天骑车的路程。于是你就跟它争辩,偏说A是余额。但如果你命
7、名为Balance,就不会有歧义了。所以要起一个容易辨识的名称,这就是关于JAVA的命名。,接下来要说的是类型,到底有哪些不同的类型,有一种叫原始类型,这些类型的大脑没发育好,还在爬呢。其实不然,这只是JAVA中的一种类型。 在基本类型中,有种叫整型(int)的类型,是整数interger的缩写。我们将其写成int int就是这个类型的名字。 里面只能放整数的值,它只能存储整数,范围从负20亿到正20亿。一般来说,只要记住这里存放的是整数就好了。除了整型外,还有什么数值类型呢?大家都知道,比如实数,我听到有人说双精度,看来你们都预习过了 ,按时完成了预习作业,但是预习过的同学并不多,只有一个。
8、,有个叫双精度的类型,双精度其实就是实数。比如2.3是双精度的,2.0也算双精度数。它为什么叫双精度,有谁知道,为什么不叫实数呢? 没错,有个叫IEEE的协会,电气与电子工程师协会,所有标准都是它们制定的,这里有IEEE的协会会员么?没有?加入吧,交点儿会费,多好的时机啊,其实我也不是会员。 这些人专门制定一些标准,其中之一就是规定,如何在电脑中,表述实数,因为计算机智能识别1 、0,该怎么表达实数呢,于是就有了这么个规定,其中一部分规定了数字的精度。有多少位数字和其粗略的近似值。而双精度double表示实数的双倍精度。 在这门课上,所有的是输类型都是双精度型,下面我在说说其它类型,在后面几节
9、课上,我们会深入了解更多细节。,一个叫布尔型,如果你们听说过布尔逻辑,应该知道这是一个逻辑数值,它只有真或假。下次我们在探讨繁杂的细节,现在知道有个数据类型叫布尔型就可以了。 还有一个类型叫做字符型char我们喜欢用首音节命名。Char 是character的首音节 ,到时候,我们会花几周事件研究字符型,它就是一个字符,一个变量,一个字符变量。,有放整数的变量,有放实数的变量,有放真假的变量,有放字符的变量。这些就是不同的数据类型。 数据的基本类型,现在来看看放在盒子里的数值,大家看到前面的Int 和 double,可能会觉得别扭,有人会问,麦兰啊,2是整型么?我说没错,然后他们又问,但你刚才
10、说2.0是双精度类型,是吧?我说是,2.0是双精度类型。 那么自然会有人问 为什么? 怎么会有两个类型啊?为什么不把整数归为实数呢?假如你是数学家,应该会赞同,是输比整数多啊 整数为什么不属于是输 为什么非得弄个整型呢?其实这个问题很容易回答,你可以问问自己,多少和多少个的区别。,如果你问一个人,比如你问我,我就不让你问了,免得你尴尬。你多重啊莫兰? 学生:你多重啊莫兰? 我大概 155.632磅吧。这没问题吧,加一个小数点,在后面放多少数字都没问题,当然我也可以直接说156磅,加不加小数都没问题。,但如果你问我,麦兰,你有几个孩子? 我说我有2.3个孩子,说得通么?搞得跟电锯惊魂似的,显然说
11、不通。有时候加小数点就太恐怖了 ,其实我只有一个孩子,他很健全。 这世上有许多东西需要计数,当你计数的时候,加上小数就不合理了,要用整数,整数用来描述数量。而描述多少的时候,用的是双精度,这需要严格区分。因为假如我问你,1后面是什么? 学生:2,2 因为你把它当成了整数,非常正确,如果我问1.0后面是什么? 学生: 是吧,说不准了吧?肯定不是2.0 这是肯定的,应该不是2.0 是不是1.000001呢?我可以说,不,你少加了几个0 ,继续加0,一直加到学期结束。再把1加上去,做完再告诉我答案。 再实数中,没有下一个值,如果你要计数,不能用双精度,需要用整型,所以这些类型都有用。以后会有体会的。
12、,所以数值就是,你要放在盒子里的东西,包括我们之前说的几种类型,那么我来举几个例子,演示一下变量的用法。看看在JAVA中使用变量的语法是什么。 在JAVA中,使用变量之前,需要先声明,就像示爱一样,假如你有个盒子,里面放了些东西,你需要先告诉大家,我有个X,很酷哦 快来看看,在JAVA中也要这么做。 需要先声明int x;这就声明了变量的类型,说明了盒子里装的是什么 同时也制定这个变量的名称,在这里 名字是x,又因为所有语句都已分号结尾,跟卡雷尔一样,要在后面加个分号。,这句话是干嘛的呢?它会在计算机内存中创建一个盒子盒子的名称是X,并且只能存储整数现在,它存储了什么呢? 什么都没有,我们还没
13、告诉它要存什么,所以在JAVA中,千万别忘了初始化变量给变量赋个初值,以后我们谈到赋初值的规则,什么时候JAVA会自动赋初值 0 ,什么时候不会,有时候确实会搞不清 。 所以最简单的就是,给每个变量赋初值,这也是个很好的软件工程习惯,那我们该怎么赋初值呢?在同一行上,分号之前,加上X=3,这么做就是把初值3赋值给x。,你可以只声明变量,不赋初值。但在使用这个变量之前,必须要给它赋一个初值,所以干脆在声明的时候就给它赋上初值。 如果我们相拥双精度数,不如Y,我们可以这么写, double y=5.2;程序就会在内存中创建一个y,里面放上5.2它是个实数。 所以声明的标准格式就是先写类型,我在下面
14、画上波浪线,这就是通用的格式。然后是名字 等号 和初值,后面加个分号。这就是声明的标准格式。,但是问题出现了,你应该在哪里声明?就目前来说,你应该在方法里面声明变量。 当你创建某个方法时,比如public void run() 你可以吧需要运行的东西都放进run方法里,比如你把这两行放进去,就创建了x和y,值分别是3和5.2。这里没什么标准格式,把声明放在run方法里 就可以在run方法里,调用这些已经赋了值的变量。 这些变量只能在run方法里调用无法在其它方法中调用,以后我们会说到如何在不同方法体减传递参数 但是现在 你们创建的变量,只能在定义它的方法体内生效。对于变量和值还有问题么?,你不
15、能再run方法中定义其它的方法,你只能在run方法外定义方法。和run方法没关系,。不能被其它方法调用,这是公有还是私有没关系,都不能被其它方法调用,也就是说,无论是公有还是私有方法,都不会影响变量的可见性,变量只能在声明它的方法中调用。 现在,另外一个需要考虑的问题是:这里我们是直接赋值的,但我们也可以分成两行写,不是直接在后面赋值,而是先声明变量。再在下面写一个x=3;这跟前面那种是一回事,这里的x=3中的等于并非数学中的等于,再在下面写一个x=3;这跟前面那种是一回事,这里的x=3中的等于并非数学中的等于,它只是JAVA中的赋值语句,也是大部分编程语言的赋值语句,就相当于 把等号右边的数
16、值 然后把它赋值给 等号左边的变量,这就是给变量赋值了。所以给变量赋值的标准,我们写在这边。非常简单明了,变量,这是变量的名字,我画上波浪线,=某值或某表达式,我们等会儿就来聊聊表达式,最后别忘了加上分号,这就是赋值语句。你可以给变量多次赋值 既然叫变量,它的值就可以改变,所以你可以先来个X=3然后下面再来个X=4,当你运行了这行还没运行下一行时,X的值为3,当你运行了这行以后,盒子里的数就变成了4,这完全没问题,因为x是变量,只要你放进盒子里的数值,符合x声明的类型,就没有问题 。,也就是说编程的时候,这么做完全没问题。但数学家门接受不了啊 它们看了之后,肯定会气得血管爆裂,然后在街上暴毙而
17、死。比如我有个变量叫total先声明整型变量total,初值为10,好戏到了。 然后我写total=total+1;假如你是数学家,看到这个肯定说是错的,不对啊,total怎么能等于total+1呢?这不对,然后你就会进一步论证,加入total是无穷大之类的,这完全不是一回事儿。 这里的等号是赋值符号,不是等于,只表示赋值。这里是先计算右边的部分,total之前的值是什么?在这里我们可以看到,total也是个盒子,它的值是10,查找之后,得知total的值是10,我需要加1,得到11,这个11怎么办?把它放回到total盒子里去,于是把11放进去,完全没问题,,这样做完全没问题,你可以取出变量
18、的值,做一些计算,再放回去,说了这么多,你们应该对变量有所了解了,现在我们可以回过头来,看看上次的程序,你们就会更明白了,请看电脑屏幕,两整数相加程序么?是不是觉得豁然开朗?两证数相加是个控制台程序 可以在控制台上输出文字,我们创建run方法,打印一行,我们知道用println这个方法,可以把双引号里的内容打印在屏幕上,第一句输出“本程序可以将两数相加”运行这行之后,程序将内容打印到屏幕上,然后运行下一行。注意看,我们刚才做了什么?我们声明了一个叫n1的变量,我们给拿个变量服了什么书纸呢?这里我们调用了一个方法,叫做readlnt。这是一个用于控制台程序的方法,所有控制台应用程序都可以用。这个
19、方法,可以把双引号里的内容,达到屏幕上,跟你上次看到的一样,并让用户输入。,用户键入任意值,并按下回车后,readlnt就会返回,你输入的那个书纸,也就是我们输入的值 就好似它拿到用户输入的那个值,拿到输入的值之后,再把值给你任你处置,接下来怎么做?将它赋值给N1. 于是n1的值就是用户输入的那个值,执行这条语句,屏幕上打出“输入n1值:”这句话,要求我们输入一个数字,假如我们输入17,它接受到17.右边的表达式久违17,左边的n1也就是17,现在移动到下一行,声明n2,它的值也是用户输入的数字,也是通过调用readlnt方法。 我们调用readlnt的方法,它要求输入另一个值,我们输入25,
20、现在n2的值也为25了。现在我们还得再声明一个变量,要善始善终是吧?声明变量最欢乐了,免费还简单。随便声,想声多少声多少,接着声明另外一个变量。这里有个叫total的盒子,total的值就是,n1和n2两个值的和。 要两值之和,程序先要访问n1的值,所以执行到这一行的时候,无论n1里是什么值都会被加在一起。当然有的时候也不一定,染整这行就是把值赋值给total。程序会把n1的值加到n2上,,结果为42.再将结果赋值给total,最后一行是实现在“两数之和为”后输出数值,但你看到这些加号可能觉得奇怪,有人会说:“麦兰你说错了,加号是对各项进行求和用的,放在这是什么意思?是要算加法么?”这家伙值是
21、42.这我知道因为盒子里写着42。把42跟文字想家算什么?好像不能这么加。 一般情况来说,这确实不对,但在JAVA中却完全没问题,将字符用加号连接,这里加号不是运算符号,你可以理解为连接符号,把这里的文字与那里的文字连起来,和这个变量值的文字形式连起来。 42的文字形式是4和2两个字符,将前面的文字与“42”连接起来,再将其与后面的句号连接,这里的加号适用于连接所要输出的内容。输出后显示“两数只和为42”,大家对此程序有什么疑问么?如果你感觉没问题,觉得自己懂了 就点头示意一下。不错,大家都明白了,接下来,我们来说说上次遗留的问题。现在你们学了变量赋值以及类型的知识,大家会说 :麦兰 这些我们
22、都懂了 , 你上次不是说了类和对象,在屏幕上画东西的么?这跟变量有什么关系?今天我们要来,学学理斯花生夹心巧克力的做法。既然花生和巧克力能搭配出如此的美味,那我们把对象,和变量合起来用,再变量里存放对象,听起来应该不错。我们上次说了这些对象,有几个类,Glabel类GRect类以及Goval类。这些都是图形类,比如标签或矩形或椭圆。这次我要给你们举个例子。它们是GObject类的子类,是被特殊化的子类,它们继承了它的所有行为,同时也有自己特殊的行为,这些实际上都是类,它们均归属于其它层次的类,那就是GObject类。GObject也是一个类,别被名字糊弄了,很多人想当然它是一个对象,错了,它是
23、一个类,代表图形对象,包含矩形,椭圆形,线段,标签。等各种各样的图形对象,跟上次看到的层次结构差不多,这些类在层次中是这样表示的,各个类均归属于GObject,,有趣的是,当有了类,创建了对象,你可以把对象存储在变量中,给我一个变量,变凉里放的是对象,类型是对象对应的类。所以类实际上可以当作类型使用。 这里比较难理解,看个例子,这是上节课的另外一个程序,现在我们来揭开变量的面纱。这个程序叫Hello Program 继承的是Gobject类,所以这个程序可以用来画图。 第一行是用来干什么的呢?我们在第一行声明变量并给它赋值,变量类型是什么?是Glable。我们那类名当类型。变量名叫label,
24、里面将要存放的是Glabel类的某个对象,就是那种类型,它将存放任何对象。 问题来了,怎么得到一个Glabel类型的对象,精彩的部分来了,得到Glabel类型对象的方法是县创建一个新的Glabel对象,首先给出类名,类之间相互依存,看几个相关例子,给出初始值,我们称之为参数,参数之间用逗号隔开,但对于某些初始值,对象会把它设置为默认的,,可能不仅要给定一个参数,可能要给定多个参数,在这个程序中,Glabel内容是Helolo World,显示位置坐标为(100,75) 就好像我说“Glabel 你是个类,我还没拿到你得对象呢。”但既然是类,那么我说给我一个心得Glabel,就像去工厂,你到Gl
25、abel工厂说,“喂,Glabel工厂给我一个新对象吧”。它就问:“你要什么样的对象?我可以给你个Glabel对象,但是不知道你要什么样的Glabel。” 所以你需要提供这些参数,这样它就能给你相应的Glabel对象 所以这行创建了一个Glabel对象。它有初始值,执行这行语句,就会显示出是文本,同时还存除了(100,75)的坐标值,这样它就知道应该在哪儿显示了。,现在我们想要,让对象添加一些附加属性,方法就是,先写出对象的名,这个对象名为label 也是此对象变量的名字。这里要用对象名,不能用类名Glabel, 要用变量的名字label。 然后加个点,然后可以协商,需要这个对象调用的方法名,这根卡雷尔程序稍有不同,在卡雷尔程序中,每次调用方法,卡雷尔是执行指定方法的唯一对象。 而在JAVA中 我们有多个对象,必须先指定想要那个对象执行方法,比如你说 label 我只定要你了,把你的字体设为指定字体 也就是上次的SansSerif 再把字体变大点,变成36号的,然后又说,label 还是你 帅哥 美女随你称呼,把颜色设为红色。,谢 谢 观 赏,