从小弟眼光分析几种编程语言的优缺点
从java到c#然后再到c++,我似乎是从派生类学到了基类,我一直同意那种说法,说java和c#其实都是c++的派生。当然,c++并不是纯粹的面向对象的语言,但是也必须说是面向对象的先驱。
为什么我没有在学了java和c#之后就停止,而去学习了c++,因为我是一个控制欲比较强的人,对于java和c#人家什么都帮我们做好了,我有点无法忍受,但是也不可否认java和c#的强大。哦,对了,忘了说我为什么一直把java和C#放到一起,我个人认为这两种语言的相似程度达到百分之八十,也就是说学了其中一门另一门也就会了百分之八十。
至于外界一直传言的c#是抄袭java的,我不否认,因为java的创始人确实来到了微软而创造了c#,但是我也不全认同,如果你完全认同,那么我问你,c++/clr是什么?我个人认为他就是c++朝c#过渡的一门语言(其实按方法和难度确实可以算一门新的语言),也就是说c#未出现之前,微软已经有这方面的考虑了,那么c#的应运而生也就理所当然,至于为什么和java如此相像,那么我只能说,殊途同归,条条大路通罗马。也就像玄幻小说中说的,无论你修仙还是修魔,还是练体,最终都是朝一个大道去的。
下面我来分析下,这两种半面向对象语言吧(c++算半种)。当然,大家都知道面向对象的三大特点:继承,封装,和多肽。当然这三种语言都存在继承,但是也不尽相同,vc++的继承为多继承,而java(后文只说java就不提c#了)是单继承和接口一起实现的。接口其实是一种变态的继承,也是面向对象语言发展的一种必然产物,其实本人对于是否应该存在多继承无所谓。
sun公司(现在为Oracle公司)为什么摒弃了这种多继承,大家都知道,派生类的实现是先从基类开始的,一个类定义了一个实体,那么将在内存中加载所有的基类,并且对于开发人员来说,比较复杂,所以sun公司就放弃了多继承而实现了接口。但是在这里我想问一下,为什么要有接口,因为他要实现这种功能,那么我觉得既然你要实现这种功能,那么何必在意是接口还是多继承,因为你要实现,就必须要实现这个借口,或者继承这个基类,c++程序员不会疯了没有要用这个方法或变量而继承基类。难道真的是为了效率考虑?既然是为了效率考虑,那么你为什么要放弃宏和指针?宏的好处是什么?这里简短说下,程序调用方法,必须要从程序所在的内存空间转移到函数所在的内存空间执行完后再回到程序所在的内存空间继续执行,在这期间,要求在转移前保留现场,并记录,从内存空间的开辟和时间方面的开销来说宏更占有优势。
现在说下接口,个人认为接口是一种特殊并且简单的抽象类,是不用使用abstract的抽象类,当然java和c++的抽象类都不能创建对象。c++中的抽象类是怎么形成的,是因为该类中有纯虚函数,那么虚函数是什么?虚函数和一般函数一样是可以实现的,即有双大括号"{}",如 virtual output(){},子类可以覆盖这个函数,java中叫重写(override)。那么为什么要有虚函数,方便子类指针调用该类覆盖的函数(有点拗口,大家懂吧?)。那么怎样形成抽象类,即有纯虚函数,纯虚函数即没有实现的函数如virtual output()=0;这样写。c++和java中抽象类的子类都必须实现该纯虚函数。但是c++中抽象类可以有非纯虚函数和一般函数,java中抽象类必须全部是纯虚函数。在这方面java就没有c++强大,便于掌控。
说了这么多,最后再说一下如果真的要说效率这三个语言还是c++效率最高,说方便c#最方便,但是java功能要比c#强大,各有优点吧。
像微软从c到c++到vc/mfc到vc/clr到c#这个从面向过程语言到面向对象语言转变的过程中,我最无法理解的就是clr,说效率没有c++高,说方便也赶不上c#,个人认为是微软为了实现.net计划硬加上去的(当然他也有他的好处)。我只能说按照我的想法c++如果难度是10,那么java是5,c#是4.5,clr我认为是15。难学不讨好啊。
好了,小弟对于这些语言还不能说精通,只能说会用,还要继续学习,我相信只要不是语言的创始者,都不能说自己是精通的。
最后再阐明一下小弟的观点,重要的是思想,而不是实现思想的工具,还是那句话,殊途同归,条条大路通罗马,不管你是修仙,还是修魔,甚至是练体... ...