面向对象的编程-Application 3

Previously on OOP:

Some strings like“Hello World!”can be printed out, via studying the previous article. And we have intended to create an object of Calculation class. This intention has, clearly, failed because compiler warned that“no class called Calculation”.

为了解决“没有Calculation类”这个compile warning,我们可以从导入一个其他package中的Calculation类。这显然不行,因为我们在Eclipse的Workspace中只创建了一个类,名字是Hello,没有创建其他的package,更加没有创建过任何一个Calculation类。

其次,我们可以现在就创建一个名字叫做Calculation的类,如下所示:

第一行import了一个package进来,里面的内容是Java library,所以,所有Java classes一般都会导入这个package。接下来是Calculation类的声明,由Eclipse自动创建。

现在Calculation类中没有任何内容,我们先用comments把Calculation类分为三个部分,第一个部分是attributes,第二部分是constructors,最后一个部分是methods。先用comments的方式写好的意义和目的在于保证三个区域不混淆。

另外,comments的段落有两种形式:

(1)/* +回车,comments段落的颜色是绿色的。

(2)/** +回车,comments段落的颜色是蓝色的。

在Calculation类中,可以存放两个数据,还可以计算这两个数据的和或者差。数据的值既能通过constructor来传递,用能让用户在程序运行的时候输入。那么,实现这个需求,我们的程序应该如何编写呢?以下是一个例子:

第一个部分是attributes。第一个和第二个成员变量,即number01 and number02,是我们存放的两个数据。第三个和第四个变量,即add and sub,分别是两个数据的和and差。

前面四个变量的类型都是“public”的,这一点非常不推荐,因为处于同一个package中的其他类也可以访问这四个变量。在Thread这个章节的理论部分中,本黄鸭强调了multiple entities accessing the same resource simultaneously will result in Racing Condition。所以,不到万不得已,所有的attributes尽量全部都使用“private”关键字。

最后一个变量是Scanner类型的,用于实现程序运行中输入两个数据的值的功能。这里需要特别注意,Java语言和C语言一样,输出是简单的,就像“Hello World!”一样,都只要一行代码;但是输入却非常复杂。

在C语言中,输入一个数据的值的话,我们可以使用scanf函数,还有“&”(读作:un-percent)取地址符。之所以要传递地址给scanf函数,是因为进入scanf函数之时,所有的变量都变成local variable,即在退出scanf函数之时,所有的local variable的空间全部释放。不管在scanf函数中如何对数据赋值,都无法传递到函数的外面。

除非我们把数据的地址告诉scanf函数,那么这个函数可以找到存放数据的地址,然后把里面的数据改掉。只有这样,数据的值才能存在在这个函数的外面。关于C语言的取地址符和指针是一个难点,我们在理论部分已经进行过讲解,这里就不多说了。

在Java语言中,类似地,想要让赋予local variable的值存在在赋值函数的外面,就必须用地址。而地址在Java语言中却不需要像C语言一样地、让开发者自己来管理,有很多已经定义好的库类已经有很成熟的管理机制了。所以,编写Java程序时,我们只要记住:“通过键盘输入数据,必须用库类”即可。

最后一个变量的类型是Scanner类,名称叫做“in”。前面也可以加上“public”或者“private”这一类的关键字。

Calculation类的第二部分是constructors。

Constructors会在创建实例的时候被调用。这是一种特殊的methods,因为(1)没有返回值,(2)名称和所在的类的名称一致。Constructors也是可以多个的,因为the ordered sequence of passing argument types may be different,即传递的参数不同,编译器会根据参数的情况,自动选择合适的constructor。

Calculation类的constructor只定义了一个,接受的参数是两个int类型的数据。然后把第一个参数赋值给number01,第二个参数赋值给number02。等号在编程中就是赋值号,功能是把右边的赋值给左边。由此可见,右边的是Calculation类attributes,左边的是passing arguments。此时,恰好Calculation类attributes和passing arguments的名称相同。所以,我们要在Calculation类attributes前面加上“this”关键字,以表明这些变量是属于这个类的。

Calculation类的第三部分是methods。

后面两个函数非常简单,就是把number01 and number02加加减减,把这两个成员变量的和and差的值赋值给其他attributes,并且打印出来。

“input()”函数比较复杂,先用关键词“new”创建一个Scanner类的实例,把object reference给attribute“in”。给Scanner类的constructor传递的参数的system standard input。

接着打印一行引导性的话:“Enter value of number01:”,让用户知道现在输入的值是number01的值。用户这个使用可以输入,而输入的值会被“in.nextInt();”取到,并且赋值给number01。“in.nextInt();”是一个dotted notation结构,in是object reference,类型是Scanner,所以nextInt()函数是Scanner库类中已经定义好的一个函数,功能是取Scanner中的next int value。

如法炮制,number02的值也可以从system standard input获取。

现在,Calculation类中的三个部分都已经编写好了,我们可以在“Hello”类中创建Calculation类的实例,再调用Calculation类的methods。

欢迎使用本黄鸭编写的小程序~

微信公众号二维码:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180920G1DWRW00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券