文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 招聘 专题 新闻
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» C/C++ » 给C程序员的危机感,你能做的JAVA也能做?!       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: [转载] 给C程序员的危机感,你能做的JAVA也能做?!  ( 查看:273  回复:12 )   
 
hagejid
副版主  点击可查看详细


十二生肖之猴   金牛座   行业勋章   技术勋章   诚信兄弟  
帖子 347
精华 0
无忧币 1866
积分 437
阅读权限 140
注册日期 2007-4-3
最后登录 2008-7-6 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-5-5 23:06   标题:给C程序员的危机感,你能做的JAVA也能做?!
上一帖 |
JAVA一直都被认为是一个只能在虚拟机里运行的语言,但看了下面的网站你就改观了。
http://www.jnode.org/node/1759
JNode is a free, open source Java technology based OS (Operating System) written fully in Java language (with a very small assembler nano-kernel).
JNode 是一个自由开源的以Java技术为基础的操作系统,除了小部分汇编编写外,其余的均为Java代码编写。










神说,做为一个程序员,英语还是必需滴……



C到底该不该学,看看这个就明白
2008-5-5 23:061楼
[ 顶部 ]
 
ribut9225
主版主  点击可查看详细


诚信兄弟   巨蟹座  
帖子 2862
精华 1
无忧币 4998
积分 3814
阅读权限 150
来自 (保密)
注册日期 2006-6-22
最后登录 2008-7-5 离线

[查看资料]  [发短消息]  [Blog
  QQ       
发表于:2008-5-6 08:26 
呵呵

以前机器配置差的时候,两者的效率不同

但现在机器性能好,效率体现不出来了

但偶还喜欢C



用户必读,51CTO积分系统调整通知
2008-5-6 08:262楼
[ 顶部 ]
 
hanjjie
新新人类  点击可查看详细



诚信兄弟  
帖子 68
精华 0
无忧币 202
积分 82
阅读权限 20
注册日期 2006-7-29
最后登录 2008-7-3 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-5-7 09:05 
看什么方向,嵌入式用的都是C,,,你用java代替试试......



2008-5-7 09:053楼
[ 顶部 ]
 
hagejid
副版主  点击可查看详细


十二生肖之猴   金牛座   行业勋章   技术勋章   诚信兄弟  
帖子 347
精华 0
无忧币 1866
积分 437
阅读权限 140
注册日期 2007-4-3
最后登录 2008-7-6 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-5-7 11:29 


QUOTE:
原帖由 hanjjie 于 2008-5-7 09:05 发表
看什么方向,嵌入式用的都是C,,,你用java代替试试......
呵呵,不都是C哦,可以是PASCAL(知道它也有指针的才明了),也可以是更高级的语言,比如面向对象的Ada,如果你对Ada不了解的话,可以到我在51CTO的博客看看。
所以说万事不是绝对的,只是相对来说用那个实现起来更符合要求。
http://hagejid.blog.51cto.com/



C到底该不该学,看看这个就明白
2008-5-7 11:294楼
[ 顶部 ]
 
queniao
副版主  点击可查看详细



十二生肖之虎   天秤座   行业勋章   技术勋章   诚信兄弟  
帖子 599
精华 2
无忧币 2485
积分 1022
阅读权限 140
注册日期 2006-4-2
最后登录 2008-7-4 离线

[查看资料]  [发短消息]  [Blog
[个人主页]    QQ       
发表于:2008-5-7 14:04 
关键是编译器  足够牛,各语言各有各的  有点  ada 传说 美 军方 很多年前 就很流行
JAva 最初 也是开发用来做 嵌入式 系统的, 看看现在的  智能机  多少程序是JAVA做的就知道了

Pascal 和 C 一样古老,一样足够强悍到  操作系统的一切



网络工程师到底该不该去考CCIE认证?
2008-5-7 14:045楼
[ 顶部 ]
 
tout518
新新人类  点击可查看详细



帖子 3
精华 0
无忧币 9
积分 3
阅读权限 20
注册日期 2008-5-21
最后登录 2008-5-21 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-5-21 09:47 
我在C  能用 指针函数,JAVA能用吗?



网络工程师到底该不该去考CCIE认证?
2008-5-21 09:476楼
[ 顶部 ]
 
pcload
新新人类  点击可查看详细



帖子 32
精华 0
无忧币 42
积分 32
阅读权限 20
注册日期 2008-5-9
最后登录 2008-6-10 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-5-21 16:08 
呀呀,不懂啊.



网络工程师到底该不该去考CCIE认证?
2008-5-21 16:087楼
[ 顶部 ]
 
hagejid
副版主  点击可查看详细


十二生肖之猴   金牛座   行业勋章   技术勋章   诚信兄弟  
帖子 347
精华 0
无忧币 1866
积分 437
阅读权限 140
注册日期 2007-4-3
最后登录 2008-7-6 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-5-22 11:19 


QUOTE:
原帖由 tout518 于 2008-5-21 09:47 发表
我在C  能用 指针函数,JAVA能用吗?
这些东西需要就加上,在程序界里只有你不知道,请不要先想不可能
在计算机语言界为了应付使用就会把需要的性能加上的(你可以在哲学里论证为什么,呵呵)
JAVA最初的就是为盒顶机等智能家电做嵌入式系统设计用的
C的面先对象扩展就是C++
C++再扩展可能是D语言(当这个观点不存在,我不想误导学生)
如果你按学校的教材学C的话,你可能一辈子都不知道内联汇编怎么用,什么是C99
按学校教材学PASCAL的话,你可能一辈子都不知道PASCAL也有指针
按学校教材学C++的话,你可能一辈子都不知道C++99/2003或正在修订的C++0x的新性能
所以我劝你学习的时候不要局限于教材,特别是中国的教材
你要知道的是,大学的教材大约落后于科技发展10年
所以不要以为你读了大学就牛,其实你只不过是一件半成品
社会工作经历后才能决定你是成品还是垃圾的.



C到底该不该学,看看这个就明白
2008-5-22 11:198楼
[ 顶部 ]
 
hagejid
副版主  点击可查看详细


十二生肖之猴   金牛座   行业勋章   技术勋章   诚信兄弟  
帖子 347
精华 0
无忧币 1866
积分 437
阅读权限 140
注册日期 2007-4-3
最后登录 2008-7-6 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-5-22 13:23 
Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念。并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。本文会让你了解什么是影子clone与深度clone,认识它们的区别、优点及缺点。

  看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的代码不亚于使用早已臭名昭著的"GOTO"语句。Java放弃指针的概念绝对是极其明智的。但这只是在Java语言中没有明确的指针定义,实质上每一个new语句返回的都是一个指针的引用,只不过在大多时候Java中不用关心如何操作这个"指针",更不用象在操作C++的指针那样胆战心惊。唯一要多多关心的是在给函数传递对象的时候。如下例程:

  package reference;
  class Obj{
  String str = "init value";
  public String toString(){
  return str;
  }
  }
  public class ObjRef{
  Obj aObj = new Obj();
  int aInt = 11;
  public void changeObj(Obj inObj){
  inObj.str = "changed value";
  }
  public void changePri(int inInt){
  inInt = 22;
  }
  public static void main(String[] args)
  {
  ObjRef oRef = new ObjRef();
  System.out.println("Before call changeObj() method: " + oRef.aObj);
  oRef.changeObj(oRef.aObj);
  System.out.println("After call changeObj() method: " + oRef.aObj);
  System.out.println("==================Print Primtive=================");
  System.out.println("Before call changePri() method: " + oRef.aInt);
  oRef.changePri(oRef.aInt);
  System.out.println("After call changePri() method: " + oRef.aInt);
  }
  }
  /* RUN RESULT
  Before call changeObj() method: init value
  After call changeObj() method: changed value
  ==================Print Primtive=================
  Before call changePri() method: 11
  After call changePri() method: 11
  *
  */
  这段代码的主要部分调用了两个很相近的方法,changeObj()和changePri()。唯一不同的是它们一个把对象作为输入参数,另一个把Java中的基本类型int作为输入参数。并且在这两个函数体内部都对输入的参数进行了改动。看似一样的方法,程序输出的结果却不太一样。changeObj()方法真正的把输入的参数改变了,而changePri()方法对输入的参数没有任何的改变。

  从这个例子知道Java对对象和基本的数据类型的处理是不一样的。和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。这种方式的参数传递被称为"值传递"。而在Java中用对象的作为入口参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。

  除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。如:

  package reference;
  class PassObj
  {
  String str = "init value";
  }
  public class ObjPassvalue
  {
  public static void main(String[] args)
  {
  PassObj objA = new PassObj();
  PassObj objB = objA;
  objA.str = "changed in objA";
  System.out.println("Print objB.str value: " + objB.str);
  }
  }
  /* RUN RESULT
  Print objB.str value: changed in objA
  */
  第一句是在内存中生成一个新的PassObj对象,然后把这个PassObj的引用赋给变量objA,第二句是把PassObj对象的引用又赋给了变量objB。此时objA和objB是两个完全一致的变量,以后任何对objA的改变都等同于对objB的改变。

  即使明白了Java语言中的"指针"概念也许还会不经意间犯下面的错误。

  Hashtable真的能存储对象吗?

  看一看下面的很简单的代码,先是声明了一个Hashtable和StringBuffer对象,然后分四次把StriingBuffer对象放入到Hashtable表中,在每次放入之前都对这个StringBuffer对象append()了一些新的字符串:

  package reference;
  import java.util.*;
  public class HashtableAdd{
  public static void main(String[] args){
  Hashtable ht = new Hashtable();
  StringBuffer sb = new StringBuffer();
  sb.append("abc,");
  ht.put("1",sb);
  sb.append("def,");
  ht.put("2",sb);
  sb.append("mno,");
  ht.put("3",sb);
  sb.append("xyz.");
  ht.put("4",sb);
  int numObj=0;
  Enumeration it = ht.elements();
  while(it.hasMoreElements()){
  System.out.print("get StringBufffer "+(++numObj)+" from Hashtable: ");
  System.out.println(it.nextElement());
  }
  }
  }
  如果你认为输出的结果是:

  get StringBufffer 1 from Hashtable: abc,

  get StringBufffer 2 from Hashtable: abc,def,

  get StringBufffer 3 from Hashtable: abc,def,mno,

  get StringBufffer 4 from Hashtable: abc,def,mno,xyz.

  那么你就要回过头再仔细看一看上一个问题了,把对象时作为入口参数传给函数,实质上是传递了对象的引用,向Hashtable传递StringBuffer对象也是只传递了这个StringBuffer对象的引用!每一次向Hashtable表中put一次StringBuffer,并没有生成新的StringBuffer对象,只是在Hashtable表中又放入了一个指向同一StringBuffer对象的引用而已。

  对Hashtable表存储的任何一个StringBuffer对象(更确切的说应该是对象的引用)的改动,实际上都是对同一个"StringBuffer"的改动。所以Hashtable并不能真正存储能对象,而只能存储对象的引用。也应该知道这条原则对与Hashtable相似的Vector, List, Map, Set等都是一样的。

  上面的例程的实际输出的结果是:

  /* RUN RESULT

  get StringBufffer 1 from Hashtable: abc,def,mno,xyz.

  get StringBufffer 2 from Hashtable: abc,def,mno,xyz.

  get StringBufffer 3 from Hashtable: abc,def,mno,xyz.

  get StringBufffer 4 from Hashtable: abc,def,mno,xyz.

  */

  类,对象与引用

  Java最基本的概念就是类,类包括函数和变量。如果想要应用类,就要把类生成对象,这个过程被称作"类的实例化"。有几种方法把类实例化成对象,最常用的就是用"new"操作符。类实例化成对象后,就意味着要在内存中占据一块空间存放实例。想要对这块空间操作就要应用到对象的引用。引用在Java语言中的体现就是变量,而变量的类型就是这个引用的对象。虽然在语法上可以在生成一个对象后直接调用该对象的函数或变量,如:

  new String("Hello NDP")).substring(0,3)  //RETURN RESULT: Hel

  但由于没有相应的引用,对这个对象的使用也只能局限这条语句中了。

  产生:引用总是在把对象作参数"传递"的过程中自动发生,不需要人为的产生,也不能人为的控制引用的产生。这个传递包括把对象作为函数的入口参数的情况,也包括用"="进行对象赋值的时候。

  范围:只有局部的引用,没有局部的对象。引用在Java语言的体现就是变量,而变量在Java语言中是有范围的,可以是局部的,也可以是全局的。

  生存期:程序只能控制引用的生存周期。对象的生存期是由Java控制。用"new Object()"语句生成一个新的对象,是在计算机的内存中声明一块区域存储对象,只有Java的垃圾收集器才能决定在适当的时候回收对象占用的内存。

  没有办法阻止对引用的改动。

  什么是"clone"?

  在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在Java语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。

  Java的所有类都默认继承java.lang.Object类,在java.lang.Object类中有一个方法clone()。JDK API的说明文档解释这个方法将返回Object对象的一个拷贝。要说明的有两点:一是拷贝对象返回的是一个新对象,而不是一个引用。二是拷贝对象与用new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。



C到底该不该学,看看这个就明白
2008-5-22 13:239楼
[ 顶部 ]
 
hagejid
副版主  点击可查看详细


十二生肖之猴   金牛座   行业勋章   技术勋章   诚信兄弟  
帖子 347
精华 0
无忧币 1866
积分 437
阅读权限 140
注册日期 2007-4-3
最后登录 2008-7-6 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-5-22 13:35 
java的指针是受限的指针,不能运算的指针。   
   
  在c/c++中,缺省情况下都是在堆栈上分配内存空间,因此可以允许指针的移动和运算,例如我们在C++中经常用char*   来代替char[]表示字符串:   
          char*   str="abcdefg";   
          然后可以用*(str+i)来取出某个字符   
  这种情况下,指针str指向字符串abcdefg的存储区域的入口地址,并且可以指向该存储区域的任何位置。   
   
  随着C++标准的发展,还出现了void*这样的“通用”指针,这使得C++在内存管理和分配上优势明显。问题就在于堆栈本身具有不少缺点,例如溢出等等。另外就是C++为了实现面向对象,不得不加入new关键字,允许在堆上的内存分配。因为堆栈是静态编译的,无法实现多态这样的基于动态编译的面向对象概念。在C++中,不使用new关键字时,对象仍然在堆栈上分配,使用new后在堆上分配,必须用delete回收内存。由此导致了C++的最大致命弱点和安全隐患。   
   
  java的设计思想就是“安全第一”,将大部分工作转移到堆上,严格限制指针的使用(甚至连指针这个名字都不用)。但是java中还是有指针的,当我们创建一个对象实例时,也就同时声明了一个指向该实例的堆存储空间入口地址的指针,这个指针也称为“引用”。引用可以指向其他相关类型的实例存储空间,但是只能指向这些存储空间的入口地址,不能任意指向其中的存储区域;再配合GC,提供了很好的安全性。Java实际上就是将管理内存的指针操作都封装在jvm中,让程序员能够更多地关注于方案的设计和优化。



C到底该不该学,看看这个就明白
2008-5-22 13:3510楼
[ 顶部 ]
 
hagejid
副版主  点击可查看详细


十二生肖之猴   金牛座   行业勋章   技术勋章   诚信兄弟  
帖子 347
精华 0
无忧币 1866
积分 437
阅读权限 140
注册日期 2007-4-3
最后登录 2008-7-6 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-5-22 13:36 
从本质上说世上根本就不存在什么"指针",所谓的指针或者指向内存的一个索引/地址(在c中),或者指向一个对象的索引(在java中),在c中指针可以很简单的看成一个int类型数值,在java中因为内存使用的是一种"代理"的方式,不能简单的看成一个"地址",只能看成是一个索引(而且必须是一个对象的索引),"指针"只是为了更清楚的表达出这种概念而发明的概念,但这么一个概念有时反而容易引起混乱.在汇编语言中,你使用直接寻址,间接寻址,寄存器寻址等,你不会叫它"指针",而只叫为"地址"吧



C到底该不该学,看看这个就明白
2008-5-22 13:3611楼
[ 顶部 ]
 
hagejid
副版主  点击可查看详细


十二生肖之猴   金牛座   行业勋章   技术勋章   诚信兄弟  
帖子 347
精华 0
无忧币 1866
积分 437
阅读权限 140
注册日期 2007-4-3
最后登录 2008-7-6 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-5-22 13:48 
以上8~9~10楼反驳指针的内容都是我从网上搜过来的
希望那些C的井底蛙给我老老实实看完了再回贴



C到底该不该学,看看这个就明白
2008-5-22 13:4812楼
[ 顶部 ]
 
yangcs
副版主  点击可查看详细



帖子 43
精华 0
无忧币 105
积分 67
阅读权限 140
来自 (保密)
注册日期 2008-3-4
最后登录 2008-7-4 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2008-5-22 15:41   标题:回复 #1 hagejid 的帖子

JAVA我没学过,也不准备学了,毕竟我不是专业软件开发人员,虽然我的工作主要就是写程序,而且我的年龄也不再适合再学太多新知识。
    但我觉得:“给C程序员的危机感,你能做的JAVA也能做?!”相当于20年前说:“给汇编程序员的危机感,你能做的C也能做?!”我确实知道汇编能做的事情C语言基本都能做,但直到现在还没人说C语言能替代汇编。要想做个大型通用程序,好像C/C++是首选,我不知道不用指针怎么完成之。如:我要做一个简单的报表程序给别人用,它既可用这个程序处理1000*2的表,也能处理2*1000的表,行数、列数由用户描述,用指针很容易。

[ 本帖最后由 yangcs 于 2008-5-22 16:49 编辑 ]



网络工程师到底该不该去考CCIE认证?
2008-5-22 15:4113楼
[ 顶部 ]
     
论坛跳转:  

| | |

| | |

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号