优点:
1.安全(废弃指针)
任何一个学过C或者C++的人都知道指针的操作对于他们是很重要的,指针能够支持内存的直接操作,这样的直接操作能够带来的是效率上的提高.但是任何一个东西都是有副作用的,指针给程序员带了的混乱也是无可比拟的.对于一个不是很强劲的C程序员而言,指针是要命的(对我而言也是,我几乎不会写C代码).而JAVA就为我们省去了这样的麻烦,或者说JAVA完整的限制了对内存的直接操作,让程序员能够安心去搞业务逻辑,而不用管自己后院的那堆内存有没有人来收拾
2.垃圾回收机制
其实垃圾回收也是JAVA对于内存操作的限制之一,也大大解放了程序员的手脚.但是也正是这样的一个内存保姆的存在导致JAVA程序员在内存上几乎没有概念...一个纯粹的JAVA程序员对于内存泄露这样的问题是从来没有概念的,因为他从来不用担心,因为大多数情况下即便他大手大脚也不会有什么问题,这样也就导致了JAVA一个很显见的缺点,我们后面会讲到.
这里我说点我想到的东西吧..其实JAVA并没有让程序员完全省心,他代办的事情也仅仅是内存罢了,其他资源的调用和释放都还是需要程序员自己来关心的,比如数据库,比如文件.当然了,我们不能指望什么都吃现成的,总有东西是要自己做的吧.
3.平台无关性
平台无关性的真正意义在于程序的可移植性高,能够在多个平台平滑迁移。这点就特别适合网络应用
缺点:
1.效率
1.1当然首先就是内存操作限制带来安全的同时带来的副面效果,就是效率比较低
1.2 面对对象的一个很重要的特点所带来的——多态,这个东西是娘胎里带出来的,谁也没办法,而且这个因素的“后果很严重”,C++的多态是编译器编译和连接时实现的,java是运行时实现的,效率问题可见一斑了吧
1.3平台无关性带来的。由于需要平台无关,所以JAVA是不能直接调用OS的API的,JAVA需要调用自己的API来隐式地调用OS的API,大家可想而知这样的效果。多一层调用,必然多一层代码需要加载到栈内了
2.逆向编译问题
由于JAVA程序是动态连接的,从一个类到另外一个类的引用是符号化的。在静态连接的可执行程序中,类之间的只是直接的指针或者偏移量。相反地,在JAVA class文件中,指向另一个类的引用通过字符串清楚地标明了所指向的类的名字。如果引用指向一个字段的话,这个字段的名字和描述符会被详细说明。如果引用指向一个成员变量,这个成员变量的名字和描述符(方法的返回类型,方法参数的数量和类型)也会被详细说明。这样就可以反编译得到源码
3.线程调度问题
关于线程调度,说老实话,我在学操作系统的时候,所有的线程问题都是在linux下用C去做的,原因第一是linux的线程API比较清晰,而且我受不了Windows的那些API的名构造。第2就是因为我觉得Java虽然是一个总进程下的多线程,但是线程间的调度没有非常的清晰,相比较而言,还不如直接调用操作系统的线程支持呢(虽然linux对线程级别支持也不是特别好,但是毕竟不是有包支持的嘛),记得当初的哲学家饥饿问题我最后算是用JAVA调配出结果了,可是到最后我自己都晕了。这些都是我个人的看法,也很可能是一些偏见,至于别人书上专业的解释是:由于为了能够支持多种系统的不同的线程支持策略,JAVA只能采取这样笼统而又松散的线程规范。
其实优点和缺点是相对的,做过比较就知道,其实优点和缺点有时候正是同一个因素带来的.这也需要我们用唯物主义辨证原理来看待(我只是说唯物主义,没有国籍的那种).更多的时候我们需要在我们所需要的东西和我们为此需要付出的代价间作出正确的trade off.(操作系统老师最喜欢说的词).