Java在国外很多大学已经取代语言成为主要教授的语言了。
       上面这句是话我在很多Java论坛上经常看到的,意为Java已经打倒了C的霸主地位,成为了编程界一统天下的强大语言了。
        Java确实天生丽质,严谨的类库设计,多面手的应用和非凡的语法让我一接触到Java就被深深地迷住了。但是Java能够取代C这一点上,我还是不敢苟同。
        C,何方神圣也?Unix,Linux,Winows包括Apple System等各种操作系统的主要构建语言,是全世界编写过软件最多的语言。如今C的地位也许会在某一天被更好的编程方法取代(注意,是更好的编程方法,C语言是非常容易扩展的),但能取代它的决不是Java。
        我估计说Java能取代C的仁兄大抵是听错了,Java能取代C++这一点我还是赞同的。

在大学里,C++是教什么的?因为SmartTalk一直没有一个完善的实现版本,所以C++取代SmartTalk在大学里用来教授面向对象编程方法,也就是说C++仅仅是用来讲授一种编程的方法,一种编程的理念。论面向对象编程语言,Java的确是目前最完美的,这一点倒是不争的事实。

仅仅在面向对象这个方面而言,Java确实强过了C++,但C++还包括着C这个子集,C语言才是C++能够称霸编程界的法宝,而不是面向对象。

我常对我身边的人说,C是拿来学的,Java是拿来用的,借着Java学计算机,没多久肯定就把人学到坑里了。
        我还经常对他们说,玩不好C的人,肯定玩不好Java,连内存用完该释放都不懂的人,还有那些居然在循环里分配堆的人,根本不配编程序。把一切都交给垃圾回收器?还真幸亏有个Java了。对有的程序而言,自动堆管理不见得是个好东西。

C语言除了取代了Pascal语言用来描述算法以外,在一些场合还可以取代汇编来描述计算机组成机构,C语言当然也可以方便的描述操作系统原理。伟大的指针将这些东西有机的统一在了一起。指针是什么?就是一个4字节整数,但它比孙悟空还要厉害千百倍,在任意时刻,程序员认为它指向的是什么,它就能指向什么。C语言就是这样,熟悉指针的人会觉得编程无非如此,计算机无非如此。
        Java的引用无非就是指针的变形,Java为了统一,干脆将所有的东西(除了简单对象)都用指针来表示,但Java严禁程序员任意操作指针,有人会说,这才是Java安全的地方,我倒!安全是一个相对概念,C语言程序写的好了,是绝对安全的,但Java把安全全部托付给了虚拟机,一旦虚拟机出现问题,被黑客攻破,那将是全世界Java程序的一场灾难。至少,Java的程序员大多并不知道,操作系统的漏洞是怎么回事儿,内存缓冲区溢出是怎么回事儿,硬件异常是怎么回事儿,因为他们碰不到这些问题,当然也无从了解。
        单纯学Java的程序员,可要小心了,没准你会在不断进步的Java SDK和虚拟机规范的娇生惯养下,最终成为一个不会写程序的人。

大部分人学习Java,应该是缘于Java的简单和强大,Java是比C简单,更比C++简单(我一直认为C++的发明人并不是为了简化C编程才发明的C++,他似乎只是为了宣扬他的哲学思想),Java也确实比C强大,也比C++强大。Java的简单是缘于它超强的变量约束和自动的内存管理,以及更方便的关键字和语句,另外,Java不用理会字节对齐,参数如何传递这些东西;Java的强大缘于它具有一个庞大的类库,这个类库远远强于C语言的标准库和C++的标准库,C语言的标准库无非就是描述了I/O,内存管理(很简易的)和算法,而C++标准库则强化了算法描述(C++的泛型比Java的泛型可是强大多了),并且把I/O和内存管理对象化,无非就这样。Java的类库则涵盖了方方面面,I/O,内存,视频音频,网络等等,让程序员彻底享受调用类库拼装程序的简便,但如果除去类库,Java在语言方面则没有C语言和C++语言强,因为没有指针,仅此而已。用C语言可以在一台计算机上为所欲为,Java则不行。
       
        其实Java并不简单,Java把很多东西搞得麻烦得很,这大部分是Java为了保证类库的完整性和统一性,不得不做出的牺牲,C语言则不然,本身就没有统一的类库,程序员爱怎么写,都是他们的自由。
        Java的可移植性是Java的最大亮点,但是究竟如何呢?在J2ME上,我几乎没有看到Java的可移植性表现在哪里,为了互相竞争,不同的设备制造商往往会实现一个并不标准的虚拟机,或者将一些自己使用的类库封存在硬件里,这就导致了在移动设备上,Java基本没有一次编写,处处运行的能力,大部分游戏和软件都标注有厂商,甚至终端机型;在J2SE上,Java的可移植性表现的最好,但也不是绝对可移植,因为一些针对于操作系统的核心组件(比如说针对于操作系统的文件操作,或者需要和操作系统已有接口挂接),就必然要用到JIN技术将C语言动态库或类似二进制代码包装进Java,这间接影响到了Java的移植性。大部分厂商用Java做界面这一部分(Oracle,而后台依旧跑着C语言编写的引擎),这样做已经可以大大的缩短软件厂商的平台移植时间了(界面是平台移植里最繁琐最费时间的环节);J2EE,和J2ME一样,个个服务器容器提供商都会在自己的产品里集成强大的Java组件,来完成更优秀的工作,同时也就造成了针对一台服务器容器编写的中间键,并不能绝对的不作修改就移植到另一台服务器容器里。随着厂商竞争的不断加剧和激烈,统一操作系统和平台规范,比制定跨平台规范来的更实际一些(主要是微软捣乱,否则也轮不到Java出场),想想看,为什么全球人都学英语?因为这样才能方便沟通,Java虚拟机其实就是个翻译,翻译学习速度再快,也赶不上发展。

我敢说,大部分使用Java的人主要还是看到了Java的简单,至于可移植,可扩展什么的,估计还不是大部分人选择Java的原因。

但还是那句话,Java绝对不适合用来了解计算机,了解操作系统,Java语言本身和计算机与操作系统都是无关的。

说说Java的应用吧。Java的应用是Java最值得称道的地方,毕竟有庞大的类库支持,简单、不容易出错,Java确实是最适合开发商业逻辑的语言之一。但除此之外,Java是不可能取代C语言完成操作系统相关的开发的,是的,目前来说绝对没这个可能,在某些Java论坛上发表此类言论的兄弟们也就不要误导视听了。
        首先,对于操作系统的开发,必须要得到操作系统API的支持,目前来说,包括以后很长时间,操作系统的API都将是C语言编写的,这有历史性的原因,也有语言方面的原因(Java肯定不能进行内存分页,读取描述子表,读取交换页快表,操作Cache,当然,这些C语言也没法做,但C毕竟和汇编是可以统一编译的,在此基础上,C语言可以继续开发针对汇编是更高层次,但对于Java依旧非常底层的系统程序),而底层的网络开发(比如协议描述,标准描述)则由于C语言有更贴近硬件的I/O操作能力(比如C语言可以操作硬件I/O中断来回调服务程序)而无法被取代(当然,这种底层的软件开发一般人是碰不到的);其次,对于操作系统的开发,必须要熟悉某种操作系统的特点(比如Windows的抢先多任务,Linux的多用户,它们的各种特性),Java的程序员最不关心的就是操作系统了,这一点Java程序员无法胜任。
        也就是说,Java还是主要开发商业逻辑的一种语言,并不是一种可以作底层做设备的语言。而随着其它语言的不断发展,Java也渐渐的不能再商业逻辑这一块上一家独大了,但Java毕竟是免费和开源的,所以还是有很大的市场潜力。

最后说说Java的效率,Java虚拟机采用了很多办法提高Java的效率,很多情况下,我认为Java的效率要比C语言好。毕竟编译器编译的东西已经比人手写的要好一些了(比如汇编写的东西不一定就比C写的编译后的运行的快),但还有很多情况,C语言的速度占有绝对优势(还有很多情况,汇编写的东西能上百倍的提高执行效率),这是为什么呢?
        就是因为C语言需要程序员全身心的投入进去,不断地优化,不断地改进,内存怎么分配,代码怎么书写,每一种变动都能带来不同的执行速度,很多影响效率的地方,恰恰就是Java程序员忽视的地方。比如我不止一次的看到Java程序员在一个高速循环里动用堆分配(new操作符或者其它返回新对象的方法),这明摆着就是嫌计算机运行太快,给它制造一些障碍。C程序员小心翼翼的使用着malloc函数,因为C程序员知道,堆分配的速度是很慢的,特别是当堆充满碎片的时候。还有Java程序员不懂得如何控制自动装箱,不懂得如何抛出异常才是最经济的办法,不懂得用return在返回对象肯定不如使用参数来的快。Java程序员很多不熟悉数据结构,不熟悉算法(这些东西他们大部分用不到),不知道HashMap和Map的区别,不知道如何用Java来制作内存链,来制作二叉树,不懂得搜索技术(有数据库呢,这些东西当然会被遗忘),排序技术,不懂得如何绘图最快,不懂得如何降低Java本身播放声音时的CPU占用率,这样写的Java程序,自然会慢,自然比不过C程序员写的C程序,因为,凡是不懂得上述技术的C程序员,肯定用不好C,用不了C。

每一种语言都有它闪光的地方,都有它迷人的特征,每一个人在学习计算机的时候,要根据自己的实际情况选择一门让自己能够提高最快的语言来学习。学习语言本身就是学习计算机的末流,是附属。编程思想才是一个程序员要掌握的核心。
        很多问题,用各种语言都可以描述,语言本身没有贵贱之分,倒是人们刻意的去寻找这种贵贱区别,迷惑了自己,也迷惑了别人。
        C的程序员们可以放下顾虑,认真地学习Java,这就表明了很多C程序员的博大,也许这些高手已经参透了计算机的本质,学习语言只是因为学了它可以偷懒而以。那么就请很多Java程序员不要在做井底之蛙,来嘲笑一个C语言程序员了。要知道,一个C的高手学Java,只是须臾之事,根本花不了太多的精力和时间。
        我们学Java,只是为了工作的更好,并不是因为不会Java,我们就无所适从。任何一门语言消失了,世界都依旧存在,依旧美好。

Java,天生丽质乱人眼 zz相关推荐

  1. java输出乱序日语假名

    package com.test;import java.util.ArrayList; import java.util.Arrays; import java.util.List; import ...

  2. Java IO流总结(zz)

    一. Input和Output 1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源.在Java的IO中,所有的stream(包括Input和Out stream)都包 ...

  3. JAVA NIO是什么(zz)

    JAVA NIO是什么? 1.   基本 概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系 ...

  4. 51 Nod 1027 大数乘法【Java大数乱搞】

    1027 大数乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 ...

  5. JAVA classpath jar问题[zz]

    classpath问题可以说是所有初学者头疼的问题,偶也一样. 1) classpath的作用:   它的作用就事让java找到你所要执行,或你拥有的类. 2) classpath的设置:   设置c ...

  6. java指针乱跳_鼠标卡顿,指针乱跳,鼠标失灵的解决办法。 涨知识了

    你是否经历过,鼠标卡顿,屏幕上指针乱跳,指针消失,等等鼠标失灵的窘境呢?那就跟着LZ来看看原因和解决办法. 工具/材料 只需要一颗好奇平静的心即可. 操作方法 01 现象1:鼠标卡顿.其表现是,经常无 ...

  7. java代码乱序问题

    java两个线程互相访问的时候并不能按照你的思路运行,因为执行语句可能有前后快慢之分,比如a=1和flag=true.下面线程B访问的时候 这两个赋值语句不一定按顺序执行 产生这种原因是因为指令重排序 ...

  8. java 如何取01 zz_java中synchronized用法(zz)

    java中synchronized用法(zz) java中synchronized用法(zz) 打个比方:一个object就像一个大房子,大门永远打开.房子里有 很多房间(也就是方法).这些房间有上锁 ...

  9. 頑健なJavaプログラムの書き方

    頑健なJavaプログラムの書き方(Writing Robust Java Code) The AmbySoft Inc. Coding Standards for Java v17.01d Sun M ...

最新文章

  1. 水稻微生物组时间序列分析
  2. 神器!Pytorch结构化神经网络修剪工具包
  3. 思路+步骤+方法,三步教你如何快速构建用户画像?
  4. access中总计为first_用Access开发生产管理系统
  5. 移植tslib(s3c2440)
  6. 考试系统试题实现(单选项)
  7. linux ftp 登录慢,linux中vsftpd登录,上传下载文件慢解决办法linux操作系统 -电脑资料...
  8. 16-margin的用法
  9. css3+js打造炫酷图片展示
  10. linux拷贝文件夹到另一台机器,linux肿么一个文件拷贝到另一个文件夹
  11. 山大824计算机基础,山东大学2020年考研824计算机基础考试大纲
  12. MFC建立C语言项目,mfc开发(mfc项目开发实例85个)
  13. 【愚公系列】2022年02月 微信小程序-场景值
  14. 超全山东华为天翼网关电信光猫HS8145c超级密码获取
  15. python实现下载压缩包并且解压
  16. matlab心电信号的qrs波检测,基于matlab的操作员心电信号QRS波检测及分析
  17. 一篇文章带你弄懂BI和大数据!
  18. 求和函数 sum详解
  19. NPOI使用Excel批注导入数据
  20. JS中的NaN和isNaN

热门文章

  1. 【Axure篇】(二)Axure RP9日期控件制作(多种格式)
  2. android原生和H5交互(转)
  3. 面试题-专业名称诠释
  4. 什么是React Hook?
  5. [附源码]计算机毕业设计JAVA超市收银系统论文
  6. 初探 “快应用” 开发
  7. java外包项目有哪几类,java软件项目外包在选择合作平台时应注意哪些细节?
  8. ORACLE中的LTRIM、RTRIM和TRIM
  9. 听说胖里靠卖梳子给和尚 发!财!了!?
  10. 程序员学完深入理解计算机系统,深入理解计算机系统9个重点笔记