c 与 java 语言对比 -凯发k8网页登录

java, c , linux c, c#.net 技术,软件架构,领域建模,it 项目管理

                                                        c 与 java 语言对比
 
                                                                                       -----
汪保杰 2007-11-11 于长沙湖大

今天一大早来到实验室,突发地想要写点什么!

 java 已经几年了,以前也学习过 c ,但是从来没有真正对比过 java c 的具体不同。
现在项目要用
vc ,熟悉中不得不把两者做个比较。

这里只是简单罗列出两者在语言上的不同, java 偏应用层, c 偏低层,做为一个软件开发着,是应该掌握的,这可是我们计算机专业的看家语言,目前市场上 60% 的人会 java, 40% 的人会 c ,这篇文章没有具体的展开。如果某本书是以这种方式写的,即实战型的,对有经验的人来说,会接受很快。

请大家始终记得 oop 的三大精神 --------- 封装,继承,多态。

1 java 是完全封装的,而 c 的函数是可以定义在 class 的外部的。从这里就可以看出 c oo 思想不够彻底,至少在封装这一点上。

2. c 中有拷贝构造函数,可以把一个对象的属性 copy 到另一个对象里 , 也叫对象赋值,而 java 是用 clone 实现的。

3. java 的世界是 object 世界(当然除了基本类型,这是 java 美中不组的一点),对象之间的关系是 reference 的,象 c 中的指针,我们叫他句柄。但在 c 中对象之间是可以直接赋值的!在 java 中只是句柄和句柄之间的转换! java c 都有 this, c this 表示指针,而在 java 我们叫他引用。但在用法上大同小异。

4. c 中有所谓的析够函数,而 java 中也有一个类似的东西叫做 finalize, 是 object 类的一个方法, java 中有个很好的东东就是自动回收机制。而 c 中你 new 的东西不 delete 的话是不会自动清理内存的,所以 java 要省事些啊 !

5 c 的函数有个默认的概念,在 java 中是没有的。但 jdk1.5 的范型的 string… 参数似乎有点象 , java 在最初抛弃 c 一些思想之后,现在似乎也慢慢也入了一些东西!

6. static 关键字 , c java 中意思基本相同, c static 变量必须在类外初始化。

7. c 中的对象成员要在本类的构造函数之前构建,而 java 没有这个规则, java 的对象和普通变量一样简单。

8. c 有个常量修饰符 const, java 中一个常量一般是用 static final 等价实现。

9 .可能写 java 的朋友很不习惯的就是 c 的每个类都有个分号结尾。

10 java 有个很好的东西叫包,使得全世界的类不会发生冲突。在 c 也有一个类似的东西叫做作用域运算符 :: 表示。

11 java 在子类的方法重载中要想调用父类的同名方法只要用 super 关键字,而在 c 中要用基类名 域运算符( :: )以达到同样的效果。

12. c 有多重继承,而在 java 中只是单根继承,但是用 java 的接口可以达到类似的效果。多重继承有二义性,但可用虚基类( virtual )解决该问题。

13. java 中的多态完全是继承的原因,而 c 除了继承又引入了虚基类和虚函数(实现了运行时多态性)的概念。

14. c 中声明了纯虚函数的类为抽象类,而在 java 中有 abstract 声明的 method (当然类也要用 abstract 修饰) 就是抽象类 , 在抽象类方面 java 原自 c , 即两者观念上是一致的。

15 java 中的对象全都是 new 出来的,而 c 不同,当然他也有 new 功能, java 中理论上你可以随意 new object, 他有 gc 这个对象管家,而 c new object 你一定要手动 delete 他。

16 c 中有运算符重载 , java 里只有 号有重载的意思,不过在 jdk5 中也有其他的运算符重载,比如两个类对象可以直接相加。 c 可以将自定义类型强制转换为基本类型,如将一 test 类的对象,强制转换为 int 类的对象,要达到这个效果就要用到 operator 关键字, java 除了 8 大基本类型以外都是 oo 的,但 java 也提供了基本类型的对应 class 类型。

17 c 中有模板的概念 ( 类模板,函数模板 ) ,在早期的 java 版本 (1.4 之前 ) ,没有模板的概念,但 1.5 引入了范型,与模板的思想类似,这可是好东西。如果你看 java 原码库,你会发现他变化的好大。

 

 

 

小结 :

  1. 学习任何东西,往往在对比中会有更好的收获。

  2. 当然 c java 还有很多不同,这里就不一一列举,感性趣的朋友可以继续总结。

  3. 相比之下你会觉得 java 的世界更美好。但要学好 java 你没有理由不去学 c





本博客为学习交流用,凡未注明引用的均为本人作品,转载请注明出处,如有凯发k8网页登录的版权问题请及时通知。由于博客时间仓促,错误之处敬请谅解,有任何意见可给我留言,愿共同学习进步。
posted on 2007-11-11 08:27 jack.wang 阅读(3356) 评论(6)     所属分类: 开发技术
# re: c 与 java 语言对比 2007-11-11 12:14
4 finalize与析构无关,参见thinking in java
8 常量final就可以了,static不是一定的
15 java的对象也是创建在heap中的  回复  
  

# re: c 与 java 语言对比 2007-11-11 13:48
17 java的范型和c 的模板差远了。。。前者只是个erasure而已  回复  
  

# re: c 与 java 语言对比[未登录] 2007-11-11 13:55
电子书下载好地方,很多java书
  回复  
  

# re: c 与 java 语言对比 2007-11-11 17:14 汪保杰(jack)
更正
1. 寄存器(registers):这是反映最快的地方。不过寄存器数量有限,所以它是由编译器分配的。
2. 栈(stack):位于“常规内存区”,处理器可以通过栈指针对它进行直接访问。栈指针向下移就创建了新的存储空间,向上移就释放了存储空间。这是仅次于寄存器的最快最有效率的分配内存方法。由于java编译器必须生产能控制栈指针上下移动的代码,所以程序编译的时候,那些将被存储在栈中的数据的大小和生命周期必须是已知的。
3. 堆(heap): 这是一段“多用途的内存池”,也在内存里,所有的java对象都保存在这里。
4. 静态存储(static storage):静态存储里面的数据在整个程序的运行期间都能访问到。你可以用static关键词来证明对象中的某个元素是静态的,但是java对象本身是决不会放到静态存储中去的。
5. 固定存储(constant storage):常量值通常直接放在固定存储中。
6. 非内存底存储(non-ram storage):两个最主要的例子“流对象(streamed object)”和“对象(persistent object)  回复  
  

# re: c 与 java 语言对比 2007-11-11 22:15
finalize和释放资源有关,但你说和析构有关确实容易让人想反驳,因为finalize并不是像析构函数那样让人手动调用的,功能和使用方式都没用相似的地方。
第5条没看懂什么意思,还有16说“c 中有运算符重载 , java 里只有 号有重载的意思,不过在 jdk5 中也有其他的运算符重载,比如两个类对象可以直接相加”,还真没听说过有这回事,相加不就是用 ,哪来其他的运算符。
泛型加入后可以说是充斥jfc,这是不可撤销的,所以sun很慎重,泛型真用起来完全让人摸不着头脑,我没用过模板,但c 实现一定更难于使用,我想表达的意思是,泛型让很多人觉得java难了,繁琐了,这本是选择java而非c 的理由,靠负责好面面俱到并不能让java更好用。  回复  
  

# re: c 与 java 语言对比[未登录] 2007-11-12 08:47
楼主这里说的运算符重载是指java中 可以运用于string以及自动装箱拆箱可以将两个包装类相加的意思,java本质上是不支持运算符重载的。

  回复  更多评论
  

网站地图