设为首页 加入收藏 网站首页
休闲娱乐
军事·社会百态·娱乐八卦·校园
体育·美女写真·幽默笑话·游戏
综合·在线视频·搞笑图片·灵异
两性生活
两性知识·性爱技巧
情色实录·两性图片
女性健康·同性之恋
电脑网络
网络编程·网页制作·软件教学
操作系统·图形图象·冲浪宝典
网络安全·邮件系统·认证考试
热点专题
芙蓉·真人漫画
72式·欲望都市
帅哥·人体彩绘
您现在的位置: 世纪中国 >> 认证考试 >> Java认证 >> 教程正文
全世界所有程序员都会犯的错误
作者:中国图霸    教程来源:网络    点击数:    更新时间:2007-1-4
当年,国际巨星成龙的「龙种」曝光,众人指责他对不起娇妻林凤娇,逼得他出面召开记者会,向世人自白他犯了「全世界所有男人都会犯的错误」。从来没犯过这种错误的我,也因此常常认为自己不是个男人。

     虽然没犯过「全世界所有男人都会犯的错误」,但是我倒是曾经犯了「全世界所有程序员都会犯的错误」。不管使用何种语言,全世界所有程序员都一定犯过这种错误,那就是:太依赖编译器,却不知道编译器做了哪些事。

   一般来说,越高阶的程序语言,会提供越多语法上的便利,以方便程序撰写,这就俗称为syntactic sugar,我称其为「语法上的甜头」。虽说是甜头,但是如果你未能了解该语法的实质内涵,很可能会未尝甜头,却吃尽苦头。

   不久前,我收到一个电子邮件,读者列出下面的Java程序,向我求救。看过这个程序之后,我确定这又是一个「全世界所有程序员都会犯的错误」。

   // 程序1
   class Singleton {
   private static Singleton obj = new Singleton();
   public static int counter1;
   public static int counter2 = 0;
   private Singleton() {
   counter1++;
   counter2++;
   }
   public static Singleton getInstance() {
   return obj;
   }
   }

   // 程序2
   public class MyMain {
   public static void main(String[] args) {
   Singleton obj = Singleton.getInstance();
   System.out.println(\"obj.counter1==\"+obj.counter1);
   System.out.println(\"obj.counter2==\"+obj.counter2);
   }
   }
   执行结果是:
   obj.counter1==1
   obj.counter2==0

   你有没有被此结果吓一跳?乍看程序代码,你很可能会认为counter1和counter2的值一定会相等,但执行结果显然不是如此。其实,程序1被编译后的程序应该等同于下面的程序3:

   // 程序3
   class Singleton {
   private static Singleton obj;
   public static int counter1;
   public static int counter2;
   static { // 这就是class constructor
   // 在进入此class constructor之前,class已经被JVM
   // 配置好内存,所有的static field都会被先设定为0,
   // 所以此时counter1和counter2都已经是0,且singleton为null
   obj = new Singleton(); // 问题皆由此行程序产生
   // counter1不会在此被设定为0
   counter2 = 0; // counter2再被设定一次0(其实是多此一举)
   }
   private Singleton() { // 这是instance constructor
   counter1++;
   counter2++;
   }
   public stati

[1] [2] [3] 下一页

分类推荐
社会 社会 娱乐 军事 校园
幽默 体育 女性 专题
电脑 编程 网页 软件 系统
安全 图象 冲浪 认证
搞笑 人物 动物 物品 表情
签名 色图 漫画 奇闻
美女 明星 清纯 自拍 欧美
丝袜 卡通 性感 走光
两性 知识 性图 孕育 技巧
同性 单身 情感 实录
视频 写真 搞笑 MTV 翻唱
写实 片段 游戏 综艺
Java认证热门文章
普通教程 该学Java或.NET?
普通教程 Java认证介绍
普通教程 Sun认证Java开发员-SCJD认证介
普通教程 课程介绍(11)SL-351 Java数据库
普通教程 课程介绍(8)SL-425 体系结构及
普通教程 课程介绍(13)SL-291 JavaBeans
普通教程 课程介绍(12)SL-330 Java开发数
普通教程 课程介绍(9)SL-310 超越CGI 开
普通教程 课程介绍(7)SEM-SL-345 Java 2
普通教程 课程介绍(4)SL-275 Java语言编
普通教程 课程介绍(10)SL-315 Java Serv
普通教程 课程介绍(6)SL-285 高级Java编
普通教程 课程介绍(5)SL-314 用Java开发
普通教程 课程介绍(3)SL-265 结构化程序
普通教程 课程介绍(2)SL-210 向Java面向
普通教程 课程介绍(1)SL-110 初级Java语
普通教程 最新Sun授权ASEC-Java培训中心
普通教程 Java开发员认证
普通教程 Java:IT认证中最有魅力的开发工
普通教程 Java认证权威问答精华集

  广东广州海珠区 世纪网络工作室 版权所有 上海电信提供网络带宽
信箱: 9297659@qq.com 粤ICP备06113754号