Java是一个面向对象的语言。对程序员来说,这意味着要注意其中的数据和操纵数据的方法,而不是严格地用过程来思考。一般来说,这种面向对象的思想方式是比较符合人类日常的思考习惯的,人们通常思考一件事更加喜欢直指目标,喜欢“唯结果论”,过程倒是其次的,条条大路通罗马,具体是哪条大路是无所谓的,只要最后结果是到达罗马就行。在日常生话中,这种思维方式容易导致人们忽略了有时候经历过程的价值比最后的结果更加重要:比如说,我们一直在抱怨各种“精神”,长征精神、抗美援朝精神、女排精神等等,认为这些精神是一种形而上的东西,没有什么实质内容,只要实力强大,这些所谓精神就是“纸老虎”,一击即溃,但其实这些精神正是凝聚了我们这些前辈经历过程时强大的精神力量,几千年过去,这些结果都只会化为泛黄的旧纸堆,而伟大的人类精神会如同天空中的繁星一样,依然熠熠生辉。
而在计算机程序中,面向对象的思想与方法无疑是更现代与更符合技术发展的,面向对象的方式方法不必严格设计过程,虽然说这种编程范式耦合度没有面向过程的编程语言高,执行程序的效率没有那么高,但是面向对象开发的子系统相对独立,软件可重用性、可维护性和可扩展性强,如果说面向过程开发像一台精密无比的机器,每一个零件、每一个环节都紧密相扣、无法分割,完全没有替代性,那么面向对象开发就像我们小时候玩的积木一样,可能相互组合,不同完成的方式可以实现各种各样的功能,这样的开发是更适合创作者和使用者的,创作者不用再花大功夫去重新设计一套系统去适应新的使用需要,而使用者也不需要花大代价去购买新的系统,只需要把现有的系统再交给开发者修改和完善一下即可,完美符合人们的预期。
在面向对象程序设计(OOP)中,包含了一种很重要的认识世界的方式:分类。分类是人们认识世界的一个很自然的过程,在日常生活中会不自觉地进行分类,而在分类这种基本思考方式的基础上,又体现了一种很朴素的唯物主义的思想,那就是世间万物都有两种属性:物质性和运动性。抽象到具体的编程对象之中,就是属性和方法。这两种特征包含了对象的一切,即具体对象的所有都可以通过属性和方法来体现。另一方面,类具有相同属性和方法的一组对象的集合,即类是对象的抽象,对象是类的具体,这其中也其实体现了一种朴素的唯物主义世界观——物质的一般性和特殊性,类是抽象的概念,仅仅是模板,而对象是一个你能够看得到、摸得着的具体实体,同一类中的对象的属性和方法都是同质的,只是具体的数值和数据不同。
在JAVA设计中,所有程序都以类(class)为组织单元,关键字class就是用来定义自定义的数据类型,这种类就是将现实世界中的概念模拟到计算机程序中,相当于C中的函数,是一种功能模块,通过主程序中创建对象并导入数据进行引用。
如上图所示, 先定义类名,命名规则如变量与数据类型一样,首字母大写,驼峰命名规则,之后编写类中的属性,按照:数据类型 变量名;的格式来创建,最后编写类中的方法,按照:修饰符 方法名(参数列表){方法体;}的模式来编写。
在创建完功能类之后,就可以开始编写测试类了。测试类不同于功能类,所有的代码测试全都存在主方法中,具体的功能实现也全都在主方法中。在主方法中,不可以直接使用功能类,需要先创建对象,建立类与对象之间具体与抽象之间的联系(类名 对象名 = new 类名();),这样的话在主方法中就可以通过对象名.的方式来使用对象(引用类的属性:对象名.属性/引用类的方法:对象名.方法名()),调用对象中的属性和方法。
如果方法具有返回值,方法中必须使用关键字return返回该值,返回值类型为该值的类型,而创建方法时就要按照 修饰符 返回值类型 方法名(参数列表)的格式,最后在测试类中的主方法里可以输出和调用返回值 ;如果方法没有返回值,返回值类型为void。
方法之间允许相互调用,不需要知道方法的具体实现,实现重用,提高效率。
情况 | 举例 |
Student类的方法a( )调用Student类的方法b( ),直接调用 | public void a( ) { b( ); //调用b( ) } |
Student类的方法a( )调用Teacher类的方法b( ),先创建类对象,然后使用“.”调用 | public void a( ) { Teacher t = new Teacher( ); t.b( ); //调用Teacher类的b() } |
下面附一个我自己做的运用了类与对象的简单程序。
结果: