关于java 的编程思想与心得

在C++委员会会议上我所能找到的,是C++社区里最聪明的一群人,群英荟萃,为我答疑解惑。我很快意识到,这种方式之好,远超我在任何一门研究生课程中之所得。如果考虑到研究生的机会成本,这还是一笔在财务上要划算得多的生意。

我被深深吸引住了,坚持出席了有大约8年的时间。在我走后,委员会仍继续前行;虽标准仍未制定完成,但彼时Java已经出现了,还有一些其他(语言)的草案也问世了(这是技术刺激成瘾者的毛病——我的确钻研某一门语言,但我也一直在寻找更有生产力的手段:那些前景看起来很光明的语言特性可以毫不费力地分散我的注意力)。

每次大家见面的时候,我都会抛出一列清单,这是我累积下来的有关C++的棘手问题列表。通常我会请他们在几日内予以澄清。出席委员会能看到的最有价值的东西就是这个,当然,还包括得以早早接触到即将公布的新特性。

从长远来看,把语言特性添加进C++的谜团里面并观察它,是一门深奥的学问。现在说三道四是一件很简单的事情,说什么C++太烂了,设计太糟糕了等等。在对C++设计时所受的约束都没有任何理解时,很多人就这样脱口而出了。Stroustrup(51CTO编者注:这个Stroustrup也就是邀请作者参会的Stroustrup,也就是C++语言的设计师Stroustrup)的约束是,C程序应该稍作改动,或者最好不做改动,就能在C++下编译。且不管这是不是完全合乎逻辑,但它给C程序员提供了一个很好的演进路径。不过这存在较大的局限性,需要把每一项大家抱怨不已的困难特性都一一虚拟化。由于这些特性难以理解,许多人就直接得出结论说C++设计糟糕,而这远非事实。

在语言设计上,Java用傲慢的态度对待这一认识。关于这一点,我在《Java编程思想》及许多博文上都写过了。因此我的长期追随者都知道,由于Gosling(Java语言之父)和Java语言设计者对C++的否定态度,Java一开始就把我拧到了错误的方向。说实话,我与Gosling 的首次“邂逅”印象糟糕——那是很多年以前的事了,当时我刚进入第一家公司,第一次开始使用UNIX (Fluke,生产电子测试设备;我在里面做嵌入式系统编程)。有一位软件工程师辅导我,教我使用emacs。不过当时公司里唯一的工具只有Gosling Emacs的商用版(Unipress)。如果你做错了什么,程序会侮辱你,把你叫做火鸡,并把屏幕填满垃圾。这样的东西出现在了一个商用产品上,而我们公司可是花了相当一笔钱的。不消说,等到Gnu emacs变得稳定起来后,公司马上就换到了Gnu emacs上(我见过Richard Stallman。当然,他是个疯狂的家伙。不过他也是绝顶聪明的:他知道当遇到麻烦的时候,你需要的是帮助,而不是侮辱)。(51CTO编者注:Richard Stallman即Gnu emacs的开发人员,美国一位着名黑客。他曾在05年坐客新浪,与洪峰大谈黑客道培训。)

我不知道对Gosling印象的这段形成经历在多大程度上影响了我后面对他工作的看法,但事实上,“我们看见它太差劲了,就决定拿出自己的语言”,对C++的这种态度于事无补。尤其是当我开始在《Java编程思想》的写作过程中把它弄清楚,并屡次发现,那些草率决定的语言特性与库,都不得不予以修订——确实如此,其中的大部分都必须要修订,有些修订还是在程序员已经忍受了多年之后才落实。在许多场合下,Gosling坦诚他们必须快马加鞭,否则就要被互联网革命超越了。

我发现,理解语言特性为什么会存在是非常有帮助的。如果是由大学教授一下子和盘托出,把它们端到你面前,你势必就会构想出这门语言的一个神话,说“这种语言特性之所以存在,肯定有一些真正重要的原因,这些原因只有创建这门语言的聪明人才能理解,我是理解不了的,我信赖它就是了”。从某方面来说,对语言特性这种基于信仰的接受是一种负担;它阻止你对所发生的事情进行分析和理解。在我的主旨演讲中(Bruce将在未来几天参与一个主旨演讲),我会关注一些特性,并检查一下它们在不同语言中是如何被实现的,以及为什么被实现。

这里就有个例子。对象创建。在C语言中,声明了变量之后编译器就会为你创建堆栈空间(未经初始化,除非你初始化,否则会有垃圾数据)。但是如果你想要动态地做这件事情,你就得使用 malloc() 和 free()这两个标准库函数,还要小心翼翼地手工执行完所有的初始化及清理工作。如果你忘了,就会出现内存泄漏等类似灾难,这是常有的事。

有关动态对象创建:一般来说,编译器将内存分为三部分:静态存储区域、栈、堆。静态存储区主要保存全局变量和静态变量,栈存储调用函数相关的变量、地址等,堆存储动态生成的变量,在c中是指由malloc,free运算产生释放的存储空间,在c++中就是指new和delete运算符作用的存储区域。(来源:51CTO树洞的技术博客)

因为malloc() 和 free() “仅仅”是库函数,在基本编程课上,应有的相关知识通常没有被传授,令人既疑惑不解又胆颤心惊。当程序员需要分配大量的内存空间时,他们就不去学如何来使用这些函数进行处理,取而代之的是常常就分配一个巨型数组的全局变量了事(不是开玩笑),数组之大,远远超过他们曾自认为所需的空间。程序似乎工作了,再说了,好像谁都不会用到产生越界——因此,当多年之后它的确发生的时候,程序中断了,而某个可怜的家伙就得一头钻进去,把错误在哪里这个谜底给找出来。
http://www.lwinfo.com/uzt/list1/222612.html
http://www.lwinfo.com/uzt/list1/222611.html
http://www.lwinfo.com/uzt/list1/222610.html
http://www.lwinfo.com/uzt/list1/222609.html
http://www.lwinfo.com/uzt/list1/222608.html
http://www.lwinfo.com/uzt/list1/222607.html
http://www.lwinfo.com/uzt/list1/222606.html
http://www.lwinfo.com/uzt/list1/222605.html
http://www.lwinfo.com/uzt/list1/222604.html
http://www.lwinfo.com/uzt/list1/222603.html
http://www.lwinfo.com/uzt/list1/222602.html
http://www.lwinfo.com/uzt/list1/222601.html
http://www.lwinfo.com/uzt/list1/222600.html
http://www.lwinfo.com/uzt/list1/222599.html
http://www.lwinfo.com/uzt/list1/222598.html
http://www.lwinfo.com/uzt/list1/222597.html
http://www.lwinfo.com/uzt/list1/222596.html
http://www.lwinfo.com/uzt/list1/222595.html
http://www.lwinfo.com/uzt/list1/222594.html
http://www.lwinfo.com/uzt/list1/222593.html
http://health.people.com.cn/xywy/wfyxb/tp/8637777212.html
http://health.people.com.cn/xywy/wfyxb/tp/8637755008.html
http://health.people.com.cn/xywy/wfyxb/tp/8637734533.html
http://health.people.com.cn/xywy/wfyxb/yyxw/8637711235.html
http://health.people.com.cn/xywy/wfyxb/kfal/8637698547.html
http://health.people.com.cn/xywy/wfyxb/tp/8637683347.html
http://health.people.com.cn/xywy/wfyxb/tp/8637671793.html
http://health.people.com.cn/xywy/wfyxb/tp/8637655581.html
http://health.people.com.cn/xywy/wfyxb/tp/8637636943.html
http://health.people.com.cn/xywy/wfyxb/tp/8637607563.html
http://health.people.com.cn/xywy/wfyxb/tp/8637592158.html
http://health.people.com.cn/xywy/wfyxb/tp/8637580086.html
http://health.people.com.cn/xywy/wfyxb/npxpf/8637564379.html
http://health.people.com.cn/xywy/wfyxb/npxpf/8637550714.html
http://health.people.com.cn/xywy/wfyxb/npxpf/8637536743.html
http://health.people.com.cn/xywy/wfyxb/npxpf/8637522505.html
http://health.people.com.cn/xywy/wfyxb/wfyxb/8637507933.html
http://health.people.com.cn/xywy/wfyxb/wfyxb/8637490238.html
http://health.people.com.cn/xywy/wfyxb/wfyxb/8637470266.html
http://health.people.com.cn/xywy/wfyxb/wfyxb/8637394856.html
http://health.people.com.cn/xywy/wfyxb/wfyxb/8637376613.html
http://health.people.com.cn/xywy/wfyxb/wfyxb/8637359793.html
http://health.people.com.cn/xywy/wfyxb/wfyxb/8637339558.html
http://health.people.com.cn/xywy/wfyxb/zl/8637310288.html
http://health.people.com.cn/xywy/wfyxb/zl/8637295257.html
http://health.people.com.cn/xywy/wfyxb/zl/8637284454.html
http://health.people.com.cn/xywy/wfyxb/zl/8637268787.html
http://health.people.com.cn/xywy/wfyxb/zl/8637248572.html
http://health.people.com.cn/xywy/wfyxb/zl/8637232687.html
http://health.people.com.cn/xywy/wfyxb/kfal/8637216226.html
http://health.people.com.cn/xywy/wfyxb/kfal/8637186048.html
http://health.people.com.cn/xywy/wfyxb/kfal/8637166433.html
http://health.people.com.cn/xywy/wfyxb/kfal/8637154697.html
http://health.people.com.cn/xywy/wfyxb/kfal/8637139081.html
http://health.people.com.cn/xywy/wfyxb/kfal/8637120805.html
http://health.people.com.cn/xywy/wfyxb/kfal/8637105248.html
http://health.people.com.cn/xywy/wfyxb/kfal/8637073843.html
http://health.people.com.cn/xywy/wfyxb/kfal/8637054696.html
http://health.people.com.cn/xywy/wfyxb/kfal/8637043072.html
http://health.people.com.cn/xywy/wfyxb/kfal/8637025353.html
http://health.people.com.cn/xywy/wfyxb/yyxw/8637010257.html
http://health.people.com.cn/xywy/wfyxb/yyxw/8636994418.html
http://health.people.com.cn/xywy/wfyxb/yyxw/8636976214.html
http://health.people.com.cn/xywy/wfyxb/yyxw/8636958698.html
http://health.people.com.cn/xywy/wfyxb/yyxw/8636941657.html
http://health.people.com.cn/xywy/wfyxb/yyxw/8636929048.html
http://health.people.com.cn/xywy/wfyxb/yyxw/8636900056.html
http://health.people.com.cn/xywy/wfyxb/yyxw/8636890097.html
http://health.people.com.cn/xywy/wfyxb/yyxw/8636875798.html
http://health.people.com.cn/xywy/wfyxb/yyxw/8636848393.html
http://user.qzone.qq.com/2900841152
http://t.qq.com/changchuny7026

Stroustrup认为动态分配需要更简单、更安全——这一块得放到语言核心中,而不是降格为库函数。还必须要与初始化和清理一起协同工作,初始化和清理必须由构造函数和析构函数分别提供,以便为所有对象提供相同的保证。

这个问题是影响了全部C++决策的一块里程碑:对C的向后兼容性。理想情况下,对象的堆栈(heap)分配可只需忽略即可。但C的兼容性要求进行堆栈(stack)分配,因此必须对heap对象和stack对象进行区分。为了解决这个问题,C++从SmallTalk挪用了new 这个关键字。创建 stack 对象只需声明即可,像这样: Cat x;或者带参数的情况下, Cat x("mittens");。而创建heap 对象时,就使用new,像这样: new Cat x; 或者 new Cat x("mittens");。利用这个约束,我们得到一个优雅而一致的解决方案。

自从判定C++的一切都做得不好且过于复杂之后,Java就产生了。具有讽刺意味的是,Java 决定把 stack 彻底抛弃了(特别是忽略了基本类型上的失败,这点我已经在别的地方指出过了)。真好啊,既然所有对象都是在heap上分配的,区分stack和heap的分配就没有必要了。他们可以轻易说 Cat x = Cat() 或者 Cat x = Cat("mittens")。或者甚至更好地,用联合的类型引用来消除重复(不过那样——还有像闭包(closure)之类的其他特性——就显得“太长”了。因此我们反而离不开Java的平凡版;类型推导已经讨论过了,但我敢打赌那不会发生,也不该发生。因为这会在给Java增加特性的同时带来问题)。

Guido Van Rossum (Python的创建者)采用了一个最小化的方案——经常为人所痛斥的空白的使用,正说明了他对语言简洁性的追求。既然 new 关键字不再必要,他就省去了,好像这样: x = Cat("mittens")。Ruby 也可能用了这种方法,不过Ruby其中一个主要的约束是尽可能追随Smalltalk,因此在Ruby是这样的:x = Cat.new("mittens") 。但Java以贬低C++做事的方式为准则,以至于用了new 这个关键字成了一个迷了。自研究了该语言在其他地方所做的决策后,我的猜测是,他们是不是从来就没有意识到,这东西根本就是可有可无的?

因此这就是我所说的语言考古学的意思。我希望人们能用一个更好的视角来看待语言设计,并在学习一门编程语言时,能有更多的批判性思维过程。

时间: 2024-11-03 05:56:16

关于java 的编程思想与心得的相关文章

Java面向对象编程思想

面向对象三个特征:封装.继承.多态封装:    语法:属性私有化(private).提供相对应的get/set 的方法进行访问(public). 在set/get的方法中对属性的数据 做相对应的业务逻辑的判断    思想:封装外面的程序不能直接访问本类的属性,需要通过本类提供的方法间 接访问本类的属性,从而提高代码的安全性.    涉及到的其他的知识点:    构造方法:用来描述对象创建过程,可以通过构造方法快速创建对象.    this关键字:代表本类对象,调用本类的属性.方法.构造方法.  

java 多态[编程思想之8.2.1]

将一个方法调用同一方法主体关联进来就叫做绑定.如果在程序执行前进行绑定由编译器和连接程序实现,叫做前期绑定.这个是在面向过程的语言中不需要选择就默认的绑定方式.现在我对面各过程语言已经很模糊了,高中是只知道面向过程依稀记得那时用的好像是什么Fox或Fox什么的. 在运行时根据对象的类型进行绑定,叫做后期绑定也称动态绑定或运行时绑定.如果一种语言想实现后期绑定,,就必须具有某种机制,以便在运行时能判断对象的类型,从面调用恰当的方法.也就是说编译器一直不知道对象的类型,但是方法调用机制能找到正确的方

JAVA编程思想导论(猜字谜游戏1.0)

一. 引言 本章将借用一个简易的猜字谜游戏,向读者简单介绍JAVA面向对象的部分知识以及实现思路. 二. 面向对象思想导论 为了了解什么是面向对象,我们需要解决以下几点问题(如图2.1所示): 面向对象是什么? 面向对象的特征(或者说表现形式). 为什么要面向对象(它与面向过程的区别). 面向对象该怎么做? 众所周知,计算机的编程语言是始于对机器的模仿,即以代码的形式控制机器完成人们希望所能达到的任务或者效果,故而所有编程语言都提供了抽象机制. 而这种抽象机制实际上可以这么认为——人们所能够解决

读书笔记 之java编程思想

本阶段我正在读java的编程思想这本书,这本书只是刚读了第一章的一部分,有些有些要记得所以记录下来, 我认为要记得有就是复用这样可以对对象进行增强,将一个类作为下一个类中基本类型,这样达到的服用的目的,起到对类的增强的作用.继承对于面向对象编程更是重中之重.多态的使用,原来不是很理解,原来就是浅显认为就是重载,这里边讲到了伴随着多态的可互换对象,当调用方法时传入的参数是一个基类,但当调用这个方法时将不同的子类传入这个方法,这个方法会自动的知道该调用哪一个代码去执行,这个叫做后期绑定,当子类传入函

《java编程思想》有必要买吗

<java编程思想>有必要买吗 1.看到过好多个这样的提问,其实我一般真的不那么容易分享自己的这点心得的,这是第一次回答这样的"推荐书籍"方面的问题. 我买编程方面的书籍,有一个非常清晰.坚决的原则--电子工业出版社的! 对于JAVA,建议你看如下的书: 首先,<21天学通JAVA>: 然后,<30天学通JAVA项目案例开发>(这本书的内容都是实例的,非常棒的实例!适合初学者的同时,又有实际应用性!) 以上的书籍,是基于你只想学J2SE的. 我还建议

Myeclipse 导入《JAVA编程思想(Think in Java 4th)》中的ant项目

版权声明:仅允许在正文前注明作者和链接的情况下,进行非商业性转载,转载时本文正文不可减少内容.修改内容或者增加内容(包括图片) <JAVA编程思想(Think in Java)>提供了大量源代码,可是项目是用ant构建的.对于用惯了eclipse,netbeans等IDE的同学们可能有些手足无措,这里分享一些本人在阅读这本书时使用ant中的一些心得.如果疏漏之处还请指教,欢迎大家和我交流~ 1.下载源代码 书中的源代码,还有在命令行界面下使用ANT的配置详细说明(均来自书籍原作者),我都一并打

java 编程思想 一 第二章(对象)

上班之余发现有很多空闲时间,享受生活 又觉得有点空虚,而且对自己的基础知识总觉得掌握的不是很牢固,有点似懂非懂的感觉,近来刚好有时间,所以就考虑继续学习,然后再经过考虑和各大博主推荐选择了<java编程思想>这本书,在此分享学习心得跟大家共勉,也算是对自己的监督吧.(本内容需要有一定的基础才能看,类似于基础回顾,强化理解,新手可能有些地方不太能听懂) 一.什么是对象? 这并不是我们男女朋友那种对象哈哈. 简言之:万事万物皆对象. 个人理解:我们所要处理的事务或者建立的某种模型的抽象总结.具体就

异常笔记--java编程思想

开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止                                          3. 当前环境抛出异常对象的引用.                                         4. 异常处理机制接

《Java编程思想》第十三章 字符串

<Java编程思想>读书笔记 1.String作为方法的参数时,会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置,从未动过. 2.显式地创建StringBuilder允许预先为他指定大小.如果知道字符串多长,可以预先指定StringBuilder的大小避免多次重新分配的冲突. 1 /** 2 * @author zlz099: 3 * @version 创建时间:2017年9月1日 下午4:03:59 4 */ 5 public class UsingStringBuilder {