我觉得这本书里面讲的真的不错
先说优点吧,比较显见一点
1.指针.
任何一个学过C或者C++的人都知道指针的操作对于他们是很重要的,为什么,指针能够支持内存的直接操作,这样的直接操作能够带来的是效率上的提高.但是任何一个东西都是有副作用的,指针给程序员带了的混乱也是无可比拟的.对于一个不是很强劲的C程序员而言,指针是要命的(对我而言也是,我几乎不会写C代码).而JAVA就为我们省去了这样的麻烦,或者说JAVA完整的限制了对内存的直接操作,让程序员能够安心去搞业务逻辑,而不用管自己后院的那堆内存有没有人来收拾.
2.垃圾回收
其实垃圾回收也是JAVA对于内存操作的限制之一,也大大解放了程序员的手脚.但是也正是这样的一个内存保姆的存在导致JAVA程序员在内存上几乎没有概念…一个纯粹的JAVA程序员对于内存泄露这样的问题是从来没有概念的,因为他从来不用担心,因为大多数情况下即便他大手大脚也不会有什么问题,这样也就导致了JAVA一个很显见的缺点,我们后面会讲到.
这里我说点我想到的东西吧..其实JAVA并没有让程序员完全省心,他代办的事情也仅仅是内存罢了,其他资源的调用和释放都还是需要程序员自己来关心的,比如数据库,比如文件.当然了,我们不能指望什么都吃现成的,总有东西是要自己做的吧.
总结优点:如果说面对对象的代码重用是JAVA优于C这样的过程语言的特点,那么面对强大的C++,JAVA只能说,我比你简单(我请了个内存保姆,虽然要支付点东西),拉拉拉,你打我呀.^_^
哦,对了,忽然间想起来一个很重要的优点,居然给我给漏掉了
这点是我补上的:平台无关性
平台无关性的真正意义在于程序的可移植性高,能够在多个平台平滑迁移。这点就特别适合网络应用。
好吧,然后我们再来看看缺点吧…缺点总是让我们触目惊心的,但是我们总是需要这样的东西让自己保持清醒,就像他们总是说我是丑男,我虽然感情上接受不了,但是还是需要接受这一残酷的事实啊
1效率
这样一个问题伴随着JAVA的出身,一直困扰了我们可怜的JAVA宝宝很久,虽然他在自己长大成人以后不断地修炼自己,来改变这个问题.但是先天的就是先天的,哎…..让我说你什么好呢…..
1.1当然首先就是内存操作限制带来安全的同时带来的副面效果了…..
1.2 其次呢,就是面对对象的一个很重要的特点所带来的——多态,这个东西是娘胎里带出来的,谁也没办法,而且这个因素的“后果很严重”(我等下会讲我们的JAVA小朋友自己跟别人学了一招来解决这个问题)。但是不对啊,C++不也声称自己面对对象的嘛,这个问题他也有,你干吗非说我呢?来自JAVA的声辩。哈哈,这你就不如人C++圆滑了吧,人家的多态是编译器编译和连接时实现的,可你是运行时实现的,效率问题可见一斑了吧。
JAVA小朋友想了很久,想了一招。。。我已经不记得他什么时候开始会这招了,但是他真的会,征对一些不会变化的程序,他就让大家可以用预编译来实现。其实这个事情也是C++真正做的。但是这样的一个解决方案就屏蔽了动态创建和连接的能力。这里还需要说明的是,这样的方法一般都运用在变化少而且对性能要求特别高的时候。毕竟如果不是面对大批量的处理和集中请求这样的问题,我们的硬件应该能满足这样的要求。
1。3平台无关性带来的。由于需要平台无关,所以JAVA是不能直接调用OS的API的,JAVA需要调用自己的API来隐式地调用OS的API,大家可想而知这样的效果。多一层调用,必然多一层代码需要加载到栈内了。不过这个问题目前也有解决方案了吧。。。这个方面我不是很在行,只是看到一些资料而已,接触太少。比如JNI(Java Native Interface)
2逆向编译问题
确实是第一次听说这样的问题,天啊,没接触的东西还真的。这里就只能套书上的话了。
由于JAVA程序是动态连接的,从一个类到另外一个类的引用是符号化的。在静态连接的可执行程序中,类之间的只是直接的指针或者偏移量,。相反地,在JAVA class文件中,指向另一个类的引用通过字符串清楚地标明了所指向的类的名字。如果引用指向一个字段的话,这个字段的名字和描述符会被详细说明。如果引用指向一个成员变量,这个成员变量的名字和描述符(方法的返回类型,方法参数的数量和类型)也会被详细说明。
这有什么关系哦。。。。不过据说这样就能通过逆向编译一下子就把我原来的代码给搞到了。。。那我写了那么久不是太亏了嘛。。。这样看来。。。产权问题咯(呼呼,上升到法律了。。。西西,我喜欢)
3 线程调度问题
关于线程调度,说老实话,我在学操作系统的时候,所有的线程问题都是在linux下用C去做的,原因第一是linux的线程API比较清晰,而且我受不了Windows的那些API的名构造。第2就是因为我觉得Java虽然是一个总进程下的多线程,但是线程间的调度没有非常的清晰,相比较而言,还不如直接调用操作系统的线程支持呢(虽然linux对线程级别支持也不是特别好,但是毕竟不是有包支持的嘛),记得当初的哲学家饥饿问题我最后算是用JAVA调配出结果了,可是到最后我自己都晕了。这些都是我个人的看法,也很可能是一些偏见,至于别人书上专业的解释是:由于为了能够支持多种系统的不同的线程支持策略,JAVA只能采取这样笼统而又松散的线程规范。
其实优点和缺点是相对的,做过比较就知道,其实优点和缺点有时候正是同一个因素带来的.这也需要我们用唯物主义辨证原理来看待(我只是说唯物主义,没有国籍的那种).更多的时候我们需要在我们所需要的东西和我们为此需要付出的代价间作出正确的trade off.(操作系统老师最喜欢说的词).
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/290720.html