C眼看J - 初窥JAVA

 

最近一直在学习JAVA,出发点并不是像当初学C++那样,而只是想把JAVA作为下学期参加比赛的工具,带着这种“浮躁”的心态,使得我总是在想“这个用看么?”、“那个用看么?”。

这是第一次在掌握了一门语言(C++)后学习另一门,而这两门语言又很有可比性。于是我体会到了比较两门语言异同的乐趣。

C++放荡不羁,做每一件事都提供多种途径来完成,不同途径之间又有所区别,从而使得语言特性极为丰富。外人看C++书籍,他一定会觉得C++的程序员吝啬得近乎古怪,多一个拷贝构造函数的代价都不愿意付出,想方设法地向语言特性要效率,这是因为C++的优势即在于此,如若不善加利用实在是妄用C++啊!JAVA则非常严谨,每件事情都只提供不多的做法,而且语法规则极其工整,这带来的直接好处就是易学,但是选择范围小就意味着程序优化的空间不大,当然,效率对JAVA来说从来不是主要目标。

C++要向后兼容C,因此面向对象很不纯正,属于混合型语言,允许全局函数这样明显的过程语言成分的存在,但由于先入为主,C++的不正宗反而让我觉得JAVA很别扭。JAVA基本可以算是一个纯面向对象的语言,非面向对象部分只剩下基本类型,还都提供了外包类用于适应对象接口,但是JAVA将main()放在一个随机(因为放在哪里关系并不大)的类中这一点让我比较不喜欢,我觉得这是设计上的不合理,为什么程序一定要百分之百的由类定义组成呢?既然main()这么特殊为何不把它单独拿出来呢?不过这也无伤大雅了,只是给人的感觉别别扭扭的。

其实我曾经思考过这个问题,究竟人类的思维方式是面向对象的还是面向过程的?面向过程的思想就像是:我们接到一个问题后先将其划分为几个解决步骤,其中有共性的抽象出来作为函数可以重复使用,然后按步骤执行。面向对象的思想就像是:我们接到一个问题先分析其场景和场景中的要素,将其抽象为类,然后思考为解决这个问题场景中的各个要素分别应该承担那些任务或者说具备哪些功能,然后程序员所需要做的就是将这些要素组织起来、协调好工作关系,最后启动这一工作即可。总的来说,在面向过程的思想中,编程者像是一个独裁者,一个执行者,他对一起都说的算,周围的一起都像是它的工具――自动化很低的工具,他一一拿起来完成自己心中的计划;而面向对象的思想中,编程者更像一个组织者,一部电影的导演,他组织剧组里的成员,交代分工和工作时的互相配合,然后在启动拍摄后退居到幕后,具体工作由手下按照他早已做好的安排来完成。

那么究竟人类的思维方式是怎样的呢?面向过程还是面向对象?人们解决问题是更愿意扮演操控者还是组织者?这就是因人而异的问题了,说的玄乎点就是思想境界的问题了。人天生的思维方式肯定是面向过程的,就像“把大象放冰箱分三步”一样是分step one two three的,但是随着面对的问题越来越复杂凭借一己之力越来越难以掌控,人就得学着放权,学着合作,学着组织,这就很自然地过渡到了面向对象的思想。所以说,我认为人的原始思维方式是面向过程的,面向对象思想是人对问题复杂性的一种妥协。

C++非常注意效率,这是从C继承的优点,但是效率意味着安全性的缺失,所以很多本应该高级语言本身做的事情它留给了程序员,很多错误对C++编译器来说只会给出一个警告,需要程序员非常全面了解语言的特性才能完全避免此类错误。JAVA则注重安全而忽视效率,据说早期的JAVA执行速度比C/C++要慢上20-100倍!当然现在已经大幅度提高,但是效率仍然是JAVA的罩门;不过安全性就好多了,JAVA是一门真正的高级语言,高级语言就应该离机器远一些,离人类近一些,JAVA编译器为程序员默默地做很多事,比如Class类对象的内嵌,比如toString()的调用,等等,一切都是为了给程序员提供方便,帮助程序员了却一切不应理会的烦恼,而只让其集中精神于用语言解决问题。

C++更像是一个修修补补的作品,它妄图提供所有人们可能用到的武器,但是人们的需求是随着时间变化的,所以C++就不断增加自己的语言特性来适应时代,但是由于是20多年前的语言,某些方面实现地颇为踉跄,比如解决多线程的方案,比如多重继承。而JAVA更加年轻,在它出生之时就知道自己应该具备哪些本领来满足这个时代,因此它的一些特性看起来要比C++自然得多,比如继承体系中的Object,比如Thread类,比如接口和内部类的配合来实现多重继承。

这两门语言产生的背景不同,背负的使命也自然不同。C++来自洪荒,像宝剑,带着浓烈的英雄主义气息,应该为能力卓群的独行侠所佩,它更适合被主人用来完成一些惟其才能胜任的任务――斩妖除魔,而对于一般性的任务,则有杀鸡用牛刀之嫌,并无优势可言;JAVA来自现代实验室,严谨而又整齐,像工具箱,浑身散发着匠人的熟练,不是用来斩妖除魔的,虽能力有限不能杀敌,但是日常生活中林林总总的问题,都可以用它轻易解决,而且上手快好掌握。C++产生的时代,软件开发还是一个小众产业,编程人员更多是和系统啊底层啊之类的概念打交道,所以更注重效率而不注重易用性和接口性。JAVA产生的时代,软件开发已经成为一个必须要很多人通力合作才能完成的工作,而计算机硬件技术的进步也让效率的重要性降低,所以JAVA更注重接口性易用性从而使它的使用者合作起来更容易也就是很自然的事了。

C++和JAVA,无论是语法还是功能都比较接近,两者的不同点很有意思地体现出了两者各自的使命。

胡言乱语一通,其实我在C++和JAVA方面都是菜鸟,只是学习这两种语言的机会让我体会到了很多有意思的事,不记下来实在说不过去,故乱述于此。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为Mac OS X添加用Firefox搜索服务

为Mac OS X添加用Firefox搜索服务 在Mac OS X上,Firefox这种移植过来的程序往往不提供服务,比如只有safari才能利用服务搜索,经过一番实验终于自己做了一个服务: 第一步,打开Automator 第二部,新建一个服务…

jmeter持续集成测试中mongodb版本问题

jmeter测试mongodb,采用的是JSR223 Sampler脚本连接数据库,其中连接数据库用到了SCRAM-SHA1认证机制,代码如下: MongoCredential credential MongoCredential.createScramSha1Credential("username", "databaseN…

速度之王 — LZ4压缩算法与其他算法的比较

LZ4 (Extremely Fast Compression algorithm) 项目:http://code.google.com/p/lz4/ 作者:Yann Collet 本文作者:zhangskd csdn blog 简介 LZ4 is a very fast lossless compression algorithm, providing compression speed at 400MB/…

我用过的DOS命令

我用过的DOS命令 1、进入当前目录的子目录:cd xxx 2、放回到当前目录的上一子目录:cd.. 3、返回到根目录:cd/ 5、进入到指定目录:先键入指定目录的本目录如D盘:D: 然后回车键入cd xxx\xxx\xxx\xxx\xxx 如图&#xf…

XAMPP 无法启动解决

当安装完XAMPP后,在XAMPP Control Panel 里面无法启动apache,网上找了很多都是关于apache端口冲突问题,但我的不是,解决步骤如下:1:进入apache目录 conf/httpd.conf 改变监听端口:Listen 8080--启动任然失败…

lz4压缩算法--速度之王

简介 lz4是目前综合来看效率最高的压缩算法,更加侧重压缩解压速度,压缩比并不是第一。在当前的安卓和苹果操作系统中,内存压缩技术就使用的是lz4算法,及时压缩手机内存以带来更多的内存空间。本质上是时间换空间。 压缩原理 lz…

Mac OS defaults命令(Access the Mac OS user defaults system)

defaults命令: 用于访问和修改Mac 上一些系统的默认设置(Access the Mac OS user defaults system) 仅修改当前用户设置,所以不应加sudo。 用法: 读取所有默认配置: defaults read 读取某项配置: defaults …

推荐12个绚丽的CSS3图片悬停效果

CSS3为我们开发提供了很多特效,如鼠标悬停,线性渐变,在web开发早期常用的是鼠标悬停,他是网页制作的常用特效之一,早期使用Flash可以制作非常炫的效果,后来慢慢演变成现在的是图片悬停效果,现在…

SAP和ABAP内存的区别

1、读取哈使用方法不同SAP内存使用SET/GET parameters方法;ABAP内存使用 EXPORT 和 IMPORT 方法;2、共享范围不同SAP内存可以被所有的主session访问,内存数据可以同一个session中不同程序之间,或者不同session之间;AB…

RocksDB事务实现TransactionDB分析

基本概念 1. LSN (log sequence number) RocksDB中的每一条记录(KeyValue)都有一个LogSequenceNumber(后面统称lsn),从最初的0开始,每次写入加1。该值为逻辑量,区别于InnoDB的lsn为redo log物理写入字节量。 我有几张阿里云幸运券分享给你&…

Leetcode 771. Jewels and Stones

class Solution(object):def numJewelsInStones(self, J, S):""":type J: str:type S: str:rtype: int"""countcollections.Counter(S)ans0for j in J:anscount.get(j,0)return ans 转载于:https://www.cnblogs.com/zywscq/p/10562590.html

iptables规则的增删改查

1、查看 iptables -nvL --line-number -L 查看当前表的所有规则,默认查看的是filter表,如果要查看NAT表,可以加上-t NAT参数 -n 不对ip地址进行反查,加上这个参数显示速度会快很多 -v 输出详细信息,包含通过该规则的数…

2010.3.13郊野公园小记,以及参观托驼峰航线纪念碑

今天是周末&#xff0c;也是个晴好的天气(罪过&#xff0c;今年云南大旱&#xff0c;希望早点下雨吧&#xff09;。去了趟昆明西北郊的郊野公园&#xff0c;09年的时候成龙的<大兵小将>也曾经在此公园取景。 首先上图的是公园里的驼峰航线纪念碑&#xff0c;也差不多到清…

HDFS的读/写流程

1.HDFS读流程 HDFS读流程 1.1 、Client通过FileSystem.open(filePath)方法,与NN节点进行【rpc】协议通信&#xff0c;校验是否有权限是否存在&#xff0c;假如都ok&#xff0c;返回该文件的部分或全部的block的列表(包含各个block块的分布在DN地址的列表)&#xff0c;也就是返…

VS Code设置中文插件

Vscode是一款开源的跨平台编辑器。默认情况下&#xff0c;vscode使用的语言为英文(en) 1&#xff09;打开vscode工具&#xff1b; 2&#xff09;使用快捷键组合【CtrlShiftp】&#xff0c;在搜索框中输入“configure display language”&#xff0c;点击确定后&#xff1b; 3&a…

1.4 CDA扩展

本地定义的标记可能被使用当本地的语义在CDA规范中没有相应的表述。当为不共享的标签的含义提供一个简洁、标准的机制时&#xff0c;CDA力求在最高的层次上共享的语义上进行标准化。为了支持本地扩展的需求&#xff0c;包含CDA架构之外的XML节点和属性是允许的。这些扩展不应该…

如何:将 TraceSource 和筛选器与跟踪侦听器一起使用(转载)

本文转载&#xff1a;http://msdn.microsoft.com/zh-cn/library/ms228993.aspx .NET Framework 2.0 版中的新功能之一就是增强的跟踪系统。基本的前提并未改变&#xff1a;跟踪消息通过开关发送到侦听器&#xff0c;侦听器则向关联的输出介质报告数据。2.0 版的一个主要区别在于…

C++排序之stable_sort()的方法

stable_sort()可以对vector的某个成员进行排序&#xff0c;而且可保证相等元素的原本相对次序在排序后保持不变。 下面是该函数的实现方法代码&#xff1a; #include <iostream> #include<math.h> #include <string> #include <vector> #include <…

linhaifeng fullstack

fullstack day02: 数据类型、字符编码、文件处理 http://www.cnblogs.com/linhaifeng/articles/7133357.html 转载于:https://www.cnblogs.com/marcoxu/p/10564094.html

javascript校验2

* 判断字符串是否符合指定的正则表达式 */ Java代码 function f_check_formatStr(obj) { var str obj.value; var dtype obj.eos_datatype; var regu dtype.substring(dtype.indexOf("(")1,dtype.indexOf(")")); //指定的正则表…