C++ & JAVA

    《程序员》2007年第8期给出了这样一组数据:相比2005年,2006C++类图书销售总量增长了14.17%2007年同比上一年增长了17.12%;而Java类图书销售总量分别增长了19.66%1.09%。这是一组奇怪的数据!

为什么说奇怪呢?Java类的图书摆在了南京军人俱乐部最显眼的柜台,Core JavaJSPEclipse类图书一进门就能看到,而C++呢,却缩在柜台深处。各大计算机图书销售市场上,Java总是保持旺盛的销售额,并且荣居销售排行榜首位。可是,为什么Java类的图书在2007年的销售总量增长变成了1.09%,同比上年增幅,下降了将近95%!可是C++呢?却依然保持着旺盛的发展势头,虽然数量不是最多的(C的图书的数量是最多的)。

统计学的数据总会表达一些宏观信息的同时显示出一些微妙的变化:Java的优势在萎缩,更多的新书退出市场,而C++的生命力却依然强劲。

是不是Java不行了?Sun公司要倒闭了?我们在学无用的技术?

当然不是,我们所学的Java技术原封不动地采用了C++的诸多特性,它也像别的编程语言那样,支持所有常见的数据结构,流程控制语句,几乎完全面向对象的程序设计(基本类型例外)。Java如此强大是因为它站在C++这个巨人的肩膀上。而我们,看到了在网络、广告、图书等方面风光无限的Java,却看不到默默无闻、一丝不苟的JVM却是C++做的底层实现。

计算机语言就是这样,新的语言几乎完全兼容了旧语言的特性,并且为软件从业人员提供了越来越便捷的开发环境,越来越丰富的参数和系统函数,好像每种新语言都是旧语言的升级版本,然而事实并非如此。从二进制编程到汇编,从汇编到C,从CC++,再从C++Java/C#都是如此。Java基于完全面向对象的程序设计,C++却是强制面向对象的,似乎是大家公认的道理。但是我认为,把Java看作是强制面向对象,而C++是自由面向对象的,更为妥当一些。

争论C++Java孰优孰劣没有什么意义,这不是谁好谁不好的问题,而要看应用场合。C++Java之间的差别,我认为主要是时代的原因。C++反映出很多硬件技术发展落后时的状态,所以它使用被动多态、手动动态内存管理。而Java使用主动多态,被动垃圾回收机制。Java面对的是一个硬件技术相当优越的时代,看看最近几年的硬件,硬盘垂直记录技术,多核处理器,DDR2海量内存……所以Java根本就不在乎那么一点点内存占用。但是如果让完全采用Java技术做一个大型项目的话,《程序员》里活跃的专家们就不再把Java项目称为强大的软件工程,而是庞然大物。

再来看安全性能:Java说它是天生安全的,我来达内之前对此深信不疑,但是来了达内之后我发现Java所谓的“天生安全”要建立在JVM基础上,Java解释字节码文件要放到一个“软计算机”中去执行,所以Java干不了底层开发,它“太安全了”,以至于它一旦涉及底层,就会遭遇屏障。C++是不安全的,多重继承这种“乱伦”的行为C++都支持,指针可以随便操纵内存地址带你到任意想去的地方,只要你水平足够好,异常也可以随便抛,只要你愿意……但是,我们可以反过来想一想,正是C++的自由、开放的胸怀,才让C/C++程序员可以使用单片机C语言进行应用程序开发,进行低级的底层的数据操纵,所以C/C++仍然是那么的受欢迎,因为一旦底层搞不好,软件工程这个金字塔就搭不起来。也正是因为C++的这种技术门槛,尤其是那种自由驾驭C++的能力可遇而不可求,C++程序员的工资普遍比Java程序员的高,不是高一点,是高得多。

C++程序员工资普遍高于Java程序员还有一个原因,就是在OSI 开放系统互连模型的七层结构中,Java为诸多层级提供了完整解决方案,所以一个企业里Java程序员的数量要远远多于C++程序员的数量。因此,Java执行速度慢,除了主动多态、层级继承和解释耗去大量时间以外,还因为它做的事情太多了,以至于每次多用一丁点时间都用因为多层次结构得以呈现几何级数的放大。企业用Java的人多了,商业利润分摊到每个Java程序员手中就少了。使用C++搞底层开发的人员,在企业毕竟是少数,而且搞底层的很辛苦,多分点自然也就无可厚非。

很多人会说,C++定义怎么怎么低级,而Java却多么多么高级,那我干嘛要用C++,直接用Java不就好了?更有甚者,拿JavaIDE跟使用VI编辑器的C++相比,得出更加过分的结论……可是实际上,语法上的规定,始终是肤浅的东西,因为语法规定让你连问为什么的权利都没有。你可以去好好了解这些定义,可以去写自由、灵活、高效的函数实现(Java中叫方法实现),但是Java能干的,C++一样能干。C++没有接口?不对,C++有接口,把抽象类写得再抽象一点,就是接口,少一个名字而已。

说来说去, C++Java到底有什么不同?真的没有不同吗?

当然有,如果他们相同的话,干嘛还要用不同的名字呢?

1.Java没有显式指针,尽管它广泛地在内部使用,但那不是给程序员用的。而在C++中却可以用。

2.Java是主动多态的,你不用关心具有继承关系的多个类之间的同名成员函数会调用哪个,Java会主动地从祖父类、祖祖父类……追溯至最高一级父类,然后从上至下开始寻找并调用。C++不会主动使用多态,要使用多态,就要用虚函数。

3.Java是隐式继承的,你不说你是谁的子类,那么你就是Object的子类,甚至你说你不是类都不可以,你必须是类,然后才能谈到实例化的对象。这时,Java看上去是强制面向对象。C++却把话都说明白了,你继承谁就继承谁,继承多个都可以,你什么都不说那么就不继承。但是C++当中,不继承不代表不能被继承,实际上C++禁止这么做。原因前面已经说过了,C++是被动多态的。你不用virtual去修饰基类的成员函数,程序执行时函数调用就不会自动调到派生类。

4.Java有接口,C++中却没有。这不是说C++不好,只是C++没有明确提出这样一个概念。C++中定义一个抽象类,把成员函数设为常量,并改成纯虚函数,数据域也设成常量,那么在C++中这样的抽象类就是接口。你可以说它不是,因为C++中没有接口,但是我要说明的是,C++可以做出一个接口来。

5.Java是单根继承(Single inheritance)的,但是允许一个类实现多个接口。C++却支持多继承,尽管很少有人去用它。

6.JavaC++最显著的区别体现在对象的处理上。Java中,对象变量在内部被当作指针处理。Java文献指出将对象变量作为引用,不过它们与C++中的引用并不完全相同。所谓引用,就是一个介于指针和变量之间的东西。

7.Java中所有的函数都与类相关,没有全局变量和非成员函数,而C++却支持这些。从这个角度上讲,C++又是强制面向对象的。因为C++当中可以没有类,即使没有类,程序依然执行得好好的,并且在程序设计的功能很少的时候,我就喜欢这么干。偶尔面向过程编程,又有什么不好呢?

8.C++中,你使用的动态内存怎么用就怎么还,Java中你不用管,Java包含一个垃圾收集系统,作为运行时库的一部分。它会监视正在运行的程序,当内存不足的时候自动去回收它,当然你也可以干预这个过程,不过如无必要,你不必惦记这件事,Java总会把你的硬件想象得比较好,不到万不得已不回收动态内存,这也解决了C++程序的内存泄漏问题,虽然这是程序员自己的不负责任。

9.Java有很紧凑的异常处理机制,而C++稍微显得草率了一些。但是这并不代表C++异常处理机制不强大,因为Java只能抛出Throwable子类的异常,C++却什么都可以。

10.Java标准库又是Java庞大的体现,涵盖了国际化、网络化、数学、声音、Web应用和服务以及数据库等。你可以说Java语言在JSPJavaScipt、网络编程、分布计算交易管理应用、Java ME应用、Web应用上风光无限,说Java是一门小巧的语言,但是Java的小巧也主要就小巧这些方面。

网上看到一个搞笑视频叫《中国廉通》,说选网络就像挑老婆,是选移动呢,还是选廉通?

然而,选择学习编程语言,更具体一点讲,选择C++Java,并不像选移动和选联通那么简单,尽管稍有差别。有一个词我很喜欢:Professional,如果你打算把编程学好,就一定要把C++学好。还是那句话:Java之所以强大,是因为它站在C++这个巨人的肩膀上。C++Java都要学好,一个都不能少。学好C++,才能深刻理解Java,但是反过来却不那么简单。类比推理,要想让自己更专业,就要把C学好。同时学好C++Java是一个正确的选择,先通过Java来上手,等到比较彻底地理解OO以后,再转做C/C++,也不失为一个明智的选择。并且,这个选择更符合在达内学习的实际情况。

千里之行,始于足下。要实现宏伟的计划,就必须从现在开始一点一滴去学好C++,学好Java

很小的时候,我们只知道0表示没有。等我们长大一点,我们发现,世界上原来还有负数,温度值居然可以是负的,此时0不是代表没有,而是表示一个临界值。再长大一点,我们认识了空(NULL),空才是真的什么都没有。在C++当中还有很多的假:false,‘0’,NULL都是假,都可以用0去表示,尽管它们有不同的意义。

对于同一个问题,如果我们反复实践它,对它的理解就会越深刻。I/O流中get()能返回一个字符的ASCII码,例如我在循环中反复使用它作为一个给定的值来进行条件判断和赋值,结果却总不是我预想的那样,这就叫做逻辑错误。逻辑错误只能是细心严谨并且正确理解技术文档的程序员才能尽可能避免。对一个问题理解上的反复,就需要不停地写程序,去实现那些函数,运用那些概念。

当你对C++Java都相当熟练的时候,C++Java之间的选择就会像下面给出的这个例子一样:

现在有两个操作系统,一个Windows XP,一个是Windows Vista,你可以选一个,并且不必担心软件的价格和硬件配置问题。XP大致就相当于C++,Vista就相当于Java

Vista更注重安全,不过它还是Windows系列产品,跟XP的差别真的不是特别的大。不过要在XP下得到同等的待遇就要自己多花点功夫,系统自带的功能往往不是很强大,或者不是很友好。Vista易用性更好,很多事情在XP下需要修改注册表和组策略,而在Vista下直接做就可以了。但是,你在XP下改来改去,你就知道什么Vista下那些功能是怎么实现的。你还可以去研究文件系统和存储结构,这样XP下报的几个错误,你就不至于感到莫名其妙。

XP可能用得更自由,XP下取得Administrator权限,就能四处横行,只是你要对自己的行为负责,把系统弄得崩溃了那是你自己的错,不要埋怨XP

那么XPVista到底哪个好呢?那还是要看具体的情况吧,很多时候只是适合不适合的问题。当然,Vista平台下有些事情XP还真干不了。

用好了C++Java,他们之间的差别也就与Windows XP Windows Vista之间的差别一样,很多时候只是适用于不同对象和情况而已。但是前提是你是真的很懂C++Java

如果你说Windows系列太简单了,那你就去研究UINX/Linux吧。(类似地,我们可以简单地把UINX/Linux比作C语言)

思想有多远,人就能走多远。你怎么去想就怎么去写,很多时候我总是先写注释,再写函数,最后才在main()函数中调用,一个函数只做一件事,一个大的功能模块分成若干函数去实现。程序员自定义类,由类创建对象,然后使用对象,这就是OO。写程序的时候,先写出程序框架,然后写函数声明(多文件结构只是分类更加细致而已),再写程序的体系结构,最后才写函数体这样的细节,这就是面向对象编程。

功能不能实现?语法错误?逻辑错误?连接错误?段错误?从第一行错误信息开始看吧,那是仅次于C++帮助文档的最好的帮手,而且还能偷窥到很多C语言底层实现的秘密。世界上最伟大的智慧,就是运用别人的智慧。有什么不懂的,尽管向别人请教,前提是你确实已经思考过。C++课程学完以后,每周周末拿有笔记的教材或适合你的参考书来读一读,并且写一些小程序,这完全是可以做到的。有一个开阔的技术视野,做一个C++/Java Thinker,而不仅仅是Coder,必将获益良多。祝你好运*^_^*!

 

     自:http://bbs.tarena.com.cn/  南京鼓楼校区SD0704 人比黄瓜瘦

参考文献:

1.Cay Horstmann,Timothy Budd,<Big C++中文版>附录IC++Java的比较》,747-751

2.刘江,《图书:技术趋势晴雨表》,《程序员》,125-12720078月刊

 

 

转载于:https://www.cnblogs.com/wxf0701/articles/1268388.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 顺序存储结构数据数据元素之间逻辑关系是由( )表示的,链接存储结构的数据元素之间的逻辑关系是由( )表示的。 A.线性结构 B.非线性结构 C.存储位置 D.指针 2. 线性表是( )。 A.一个有限序列,可以为空 B. 一个有限序列,不能为空 C. 一个无限序列,可以为空 D. 一个无限序列,不能为空 3. 已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。 A. 108 B. 180 C. 176 D. 112 4. 在单链表删除指针p所指结点的后继结点,则执行( )。 A. p->next= p->next->next B. p->next= p->next C. p= p->next->next D. p= p->next; p->next= p->next->next 5. 若某链表最常用的操作是在最后一个结点之后插入一个结点删除最后一个结点,则采用( )存储方式最节省时间。 A. 单链表 B. 双链表 C. 带头结点的双循环链表 D. 单循环链表 6.二维数组A[7][8]以列序为主序的存储, 计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A. 38 B. 43 C. 26 D. 29 二、完成下列填空题(每空3分,共9分)。 1.在顺序表L第i个位置上插入一个新的元素e: Status ListInsert_Sq(SqList &L , int i , ET e){ if ( iL.length+1) return ERROR; if(L.length >= L.listsize){ p=(ET*)realloc(L.elem,(L.listsize+10)*sizeof(ET)); if (p==NULL) exit(OVERFLOW); L.elem=p; } for( j=L.length ; j>=i ; --j ) L.elem[j]=L.elem[j-1] ; L.elem[j]=e ; ++L.length ; return OK; } 2. 删除双向链表p所指向的节点算法: status delete(DuLinkList L, DuLinkList p) { if (p= =L) return ERROR; else { p->prior->next=p->next; p->next->prior=p->prior ; } free(p); return OK; } 三、编程题(共27分)。 1. (共12分)用顺序表表示集合,设计算法实现集合的求差集运算,要求不另外开辟空间。 顺序表的存储结构定义如下: #define Maxsize 100 typedef struct { ElemType data[MaxSize]; // ElemType表示不确定的数据类型 int length; // length表示线性表的长度 }SqList; 将如下函数,伪码补充完整(8分),代码前先用文字描述自己的算法思想(4分)。 文字描述算法:略(4分) void Difference(SqList A, SqList B) {//参考代码如下如下(8分) for (i=0;i<A.length;i++) for(j=0;j<B.length;j++) if(A.data[i]==B.data[j]) { A.data[i]=’#’; break; } for (k=0,i=0;inext == L) return; p = L; while (p->next != L)   { if (p->next->data != e) P = p->next; else { q = p->next;p->next = q->next; free(q);} } } 时间复杂度分析:(2分) 时间复杂度为O(n)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值