java中最重要的部分可以说就是它的三大面向对象的特性:继承、封装和多态了。
之前学过C语言,C语言 主要是面向过程编程用得比较多,但是是不是它就不可以实现面向对象编程了呢,也不是。
面向对象
封装
-
封装
-
封装:隐藏了内部实现,保护了数据,不允许外部程序直接访问,同时可以在不影响使用了该类的代码的情况下修改内部实现代码。
Java中用得最频繁的 特性就是封装了,不但方便而且安全,使用封装好的类的人不需要关心内部的结构,只需要知道它的用法就可以了,而维护的人也可以方便地更改源代码而不影响其他人的使用。同时,java中有着访问修饰符,private修饰符可以很大程度上保证封装的安全性。而且,java有着类的概念,可以提供访问修改private变量的getter和setter方法,同时给予一定的访问限制。
C语言的实现:
而C语言,用库函数的时候,其实就类似于java里面封装好的类的方法,我们不用关心内部的实现,而只需要知道它的使用方法(传递的参数)以及效果(返回值)即可。
C可以写出封装的代码,但不够方便(比起java),同时也不安全,在外部非常容易修改内部的东西。而且C语言则没有类的概念,如果要实现类似的效果,则需要自己编写一个头文件,但要注意函数名还不能和同一程序中的其他函数相同,这一点是比较麻烦的,不过这在三大特性中还算是比较容易实现的一个。
继承
-
继承
-
继承:是利用已有的类为基础建立新的类,可以大幅度减少代码量,实现类的重用。
java中的继承可以减少大量的代码量,同时有了这个特性,理解程序也变得更容易一些,同时子类可以重写父类的方法,继承经常和多态一起使用。
C语言的实现:
在C语言中,要实现类似的功能减少代码量就需要先写一个结构体,然后在结构体里面放函数指针,然后让“继承”的结构体放置同样的函数指针。
多态
-
多态
-
多态,一个类名称可以有多种不同的使用方法,一个方法名也可以由参数决定使用的效果,而“继承”中的子类可以被父类引用。
java中多态是很方便的,可以做一个简单的switch case,然后父类引用子类对象,然后由父类使用子类重写过的方法就可以方便地实现多功能选择了。而重载则可以根据参数的类型和顺序决定处理的结果。
C语言的实现:
重写:这里又要用到指针了,把父类和子类相应的函数赋值给一个指针,实现重写;
重载:依然是函数指针,如果用到宏会更方便管理一点。
至于向上向下转型,用强制类型转换给指针赋值就可以了。
总结
总之,用C语言实现这三大特性,除了封装好的函数的外部(给别人看的部分)不一定需要指针以外,其它的实现部分全都涉及到指针和结构体。管理起来非常地不方便,而且代码文档和注释等一般要写很长,同时阅读源代码的人不一定能看懂。因此,用虽然C语言是可以实现封装、继承和多态,但是终究不是“支持”三大特性。所以,如果我们使用面向对象的思想编程,最好还是使用“支持”面向对象思想的语言吧。
语言毕竟只是工具,我们可以用不同的工具来实现一样的功能。
比如说你可以用砖块、泥沙、混凝土等砌一间房子,然后再买地板、瓷砖、油漆等进行装修,家具就用买各种原材料自己做出来。最后做出自己想要的房子(类似C,几乎一切都是自定义的)(面向过程编程); 也可以直接买一间现成的房子,然后再自己设计要怎么做,比如说请一个装修公司把地板铺好,可以选择别人已经做好了的不同的家具,然后把它们搬到屋里,自己设计怎么摆放。最后就能做出一间比较好看的房子(类似于java,有着强大的类库以及种类繁多的功能强大的第三方库)(面向对象编程)。
可是,我们应该根据不同的需求来使用不同的工具,比如我们要使用面向对象的思想编程,那当然还是使用支持面向对象的语言编程了,而使用不“支持”面向对象编程的语言“实现”面向对象编程,其实只要思考过这个问题,有思路怎么做就好了。如果能实际做一下那也不错,因为这对我们理解这些概念有着很大的帮助。但我觉得没必要太过于深入(除非真的有这个需求),毕竟我们的目的是“房子”,而不是“工具”,怎么方便怎么做就可以了。
以上就是我对java面向对象的一点理解以及对于C语言的实现的一点思路,如有错误之处,敬请指正。