面向对象篇1

  关于面向对象的原理啊,特性啊,各位大佬都给出了太多详细且全面的讲解,我自然不会班门弄斧。作为一个刚刚毕业的小菜,我在这里谈谈自己对于面向对象的理解,如果能够帮助到同样入门的童孩们,那真是yokata。

  大一最先接触的是C语言,后来学到了c#,第一次接触到面向对象这个概念。那个时候只知道C语言是面向过程语言,然后C#是面向对象语言。再后来了解到JAVA,Python等等。那个时候我们对于语言的理解层面仅仅是基础语法的层次,同学们谈起JAVA都会说:"java啊,面向对象的。"在那个阶段,我们对语言的归类还很粗浅,我们那时候认为面向对象只是语言的一种属性。

  但我认为并非是语言涵盖了这一属性,而是语言不过是面向对象思想的一种实现罢了。语言是工具。如果说面向对象是内力的话,一名高超的剑客可以无视手中的工具,用树枝也好,手中无剑也罢,都能使出厉害的剑术。即,java也好,c#也好,都是面向对象思想的实现,然后结合了其他的特性成为了独一无二的兵器。

  面向对象对我们的影响也不仅仅是编程层面的,它将影响我们观察世界的角度。之前有个段子,说程序员标准逻辑就是,如果1就2,不然如果3就4不然就5。是的,if else写多了,我们自然形成了这种思维模式。(ps:程序员玩狼人杀伤害+999)。面向对象是种思想。

  那语言是如何实现这种思想的呢,那就是我们耳熟能详的封装,继承,多态了。

  封装,代码来看就是所谓的private,protected,私有变量,他不让外面的成员直接访问,初学的时候觉得这是个很鸡肋的特性,到后面才发现这是面向对象的根本。面向对象试图去还原现实生活的真实场景,这世间的一切都是事物之间产生了联系,面向对象想要重现这种联系,类,对象,哪些是私有的,哪些是受保护的,哪些是公开的。

  继承,继承也是为了表现面向对象,在面向对象中,把相似的对象归为一个类,一个模板,而继承对这些类进行了扩展,变成了一个族系,而这些族系中的后人可能会学习一些新的特异功能,他们可以去实现一些接口,这样变幻莫测的排列组合给设计模式很大的发挥空间。以至于对面向对象有了粗浅理解的我在学习设计模式的时候一度认为设计模式就是一门面向对象的实践课,类似于论剑术心法如何使出花式剑招,剑术心法在实战中的一万变招之类。

  多态,顾名思义,就是多种状态。网上说重写和重载是多态的体现,这大概是站在多态就是多种状态这个角度来说。个人认为,重载并不属于真正的多态,重写,或者说,虚函数表,才是多态的核心。

  继承和多态实际上一个是子类引用父类,一个是父类指向子类,也就是所谓的向上转型和向下转型。有必要一提的是接口这个概念,C++里面是没有接口,C++提供了一个东西叫虚函数,那就来谈谈这个虚函数,毕竟多态的本质不就是虚函数表吗?

  一个子类继承父类,重写了父类的方法,同一个方法名有着不同的实现,看上去似乎一个方法有着多种状态,而实际上,在运行的时候这个方法并非是多态的,多态实际上是唯一态的。运行时检测机制,在使用的时候才会把这个函数指针绑定对应的函数地址,每个类的方法在不同的虚函数表中,在不同的内存区域中保存着,直到运行时才将函数指针绑定上去,这种模型有点像,额,薛定谔的猫?直到你打开装置的时候你都不知道猫是死的还是活的,他有着无数可能。在你打开装置也就是运行之前,他可以是祖父的步行函数,可以是父亲的步行函数,也可以是你的,你儿子的步行函数。虚无缥缈的薛定谔的猫,运行时检测机制判定了他的生死,在运行的瞬间,虽然这么说有点结果论的意思,但运行时这只猫是生是死一定是固定唯一的状态。(ps:然鹅薛定谔的猫偏偏就是即生又死的,猪队友薛某狠狠打了爱某的脸。)

  引用类型,实际上可以看作是一种指针,当我们在new的时候,我们在堆里面开辟出一块内存区域去存放类的变量方法等,然后把栈里的对象指向这一块内存区域,这就是为啥父类可以指向子类,而子类指向父类却需要强制类型转换,因为子类要指向一块更小的内存空间啊。

  继承和多态,他们通过这种父子之间灵活的指向关系让面向对象编程变得千变万化,设计模式这一门课,很大程度上就是围绕着继承和多态来讲的。包括常用的接口回调等,这些都是面向对象特性带来的好处。为重用,复用代码提供了支持。

  当然,继承的耦合度还是比较高的,如果不是十分明确的父子关系,可以通过在类里面增加引用变量的形式降低耦合度,达到相似的效果。

  聊到这里突然想顺带提一下C#中的委托,委托可以理解为是一个函数指针,C#的委托可以通过+-对方法也就是函数进行绑定操作,让其方法形成方法链,完成一系列的操作。

 谈完了思想和一些特性,我们来聊聊语言。

  语言就和斧头,刀剑一样,是达成目的的手段,C与C++更加倾向于底层,这些使他们更加复杂的同时,确实也有着更高的效率,虚拟机或者说类虚拟机语言,java虽然说屏蔽了对于内存的直接操作,不能直接操作指针,添加了垃圾回收器GC,通过条件编译达成了跨平台的同时,他们也丢失了一些利爪,比如调用一些底层的东西需要使用jni,调用动态链接库使用C语言去做等。而python之类的脚本语言,虽然在使用上有着极大的便捷性,但是在工程开发中,这些便捷性却可能成为弊病,比如lua通过表这种强大的数据结构可以驾驭几乎一切数据结构,但是同时,当你收到一个表的时候,你可能根本不知道它里面是什么。(最近用到TypeScript,感觉有点打脸了~~)

   再然后,语言有着各自的倾向性,java在web应用开发上的得天独厚,C在单片机等需要对内存斤斤计较的场合无坚不摧,python在人工智能上的旗开得胜。没人会用刀剑去劈柴,尽管他们可以这样。

  以上是自己对于面向对象和语言的一些新的。到底自己只是个刚毕业的菜鸟,如果有理解错误的地方,还请四方大神更正,拜谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值