本篇文章给大家谈谈怎么看懂java代码电子书下载,以及怎么看懂java代码电子书下载的文件对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

java自学网Java从入门到精通(第3版)PDF电子书.zip   免费下载

Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

我听很多人和我说他们擅长C++或Java但是完全搞不懂Smalltalk。按他们的说法Smalltalk有若天书!我想了一下,觉得他们说的或许非常在理。假如我只懂Java,如果我从多年以来写的代码里随便挑一段我肯定看不懂它。在理解Smalltalk之前必须要澄清一些很简单的概念连带一些细微诡异的语法概念。要是“老王不懂Smalltalk”,也许我能对他的状况进行改善。我希望能让读者快速上手。我假设读者懂面向对象编程。如果你已经会Smalltalk了就请恕我班门弄斧一下。

初读 Smalltalk遇见的一些协定和惯用法细节可能与其它语言大相径庭从而把你搞晕,像双引号括注释,单引号括字符串,还有字符的特殊语法表示(例:$x代表“x”)。还有symbol的概念,symbol是在内存中仅有唯一实例的字符串;例如,当一个symbol被构造时(通常是编译期),先从内存里查找是否相同的实例,如果有则直接使用。这样做目的不是节省内存而是优化比较效率(下文详述):

如果你给我两个被不同变量“a”和“b”引用的不同对象,我就能告诉你它们是不是相同对象(通过a == b进行)或者只是看起来相同的不同对象(通过a = b进行)。直白的说,==比较两个指针而=比较对象的整个内容。

Smalltalk中很少出现逗号,因为它不充当语法要素。这就是为什么数组直接明了,例如下面没有冗余逗号的数组:

尽管如此逗号还是有意义的,它是一个运算符。你偶尔能看到它被用来连接两个字符串,例如:

在Smalltalk中关键字无处不在。但它们有益于可读性而不是扰乱。想知道为什么,让我们从一个C++和Jav断入手。例如你可能对下面的写法再熟悉不过了:

t对象被夹带着参数a和v发送了rotate消息。读者想理解这样的代码通常需要找到变量的声明处并判断出类型。我们假定声明如下:

在Smalltalk中变量可以引用任意类型的对象。所以类型说明不需要,但是我们还是要声明一下变量,例如:

在不看声明的情况下,好的Smalltalk程序员会通过变量顾名思义判断其类型。那么我们换一种写法如下:

但请允许我继续沿用最初的短命名来避免示例代码太长影响阅读。我们来通过去除不必要的因素来“改进”C++和Java的语法。例如,下面的代码仍然明了:

为了进一步改进语法我们需要知道参数a和v代表什么。我们假定整个示例意为“绕向量v旋转角度a(译注:rotate by angle a around vector v)”。则进一步改进为:

我们能明确每个成分是什么吗?没问题,因为在我们改进的这个示例中,“t”是一个变量,“rotate”是方法名,“by”是分隔符,“a”是变量,“around”是分隔符,最后的“v”也是一个变量。为了消除潜在歧义我们设立一个规定:分隔符后面紧跟一个冒号。我们得到:

最后我们强调一下分隔符是方法名的一部分;例如我们假定需要一个形如“rotate by: around:”的函数,去掉空格我们得到“rotateby: around”作为最终命名,再将非首单词首字母大写来提高可读性得到“rotateBy: around”。那么我们的示例可以写为:

方法名被打碎成几部分。幸运的是聚拢这些碎片成一个完整的名字很容易。当在类中时我们如下定义方法名:

在运行时,“t”和“self”,“a”和“angle”,“v”和“vector”之间有着一对一的关系。注意“^”意味着结果被返回了;这是 Smalltalk中“return”关键字的写法。变量“self”是“this”的同意字,如果方法结束没有返回语句则“^self”被当作隐含语句执行;你可能完结一个方法时忘记添加返回语句,但没事。这也意味着即使消息发送者不需要返回值,方法也会返回它。

实际上被惯用的地道Smalltalk语法要求“self”不显式的出现在方法头(但必隐含),例如:

关键字语法的精妙之处在于我们可以为不同的方法定义不同的关键字。例如我们可以如下定义第二个方法:

不必死记硬背参数顺序。关键字提示我们顺序。当然程序员有滥用关键字的能力,例如如果我们如下定义关键字:

读者很难弄清参数正确的顺序。这就是个极差的编程风格,如果只有一个参数还好办。只有一个参数时我们仍然需要方法名;例如:

我们希望关键字(因冒号而易区分)成为参数的说明。但方法没有参数时怎么办:

如果关键字代表参数的说明,那我们在没有参数的情况就用不到关键字。所以零参数的消息应为:

当然二元操作符同理,但一元操作符(makeIdentity是一元消息但不是一元操作符)并非如此。当多种消息一起出现时我们的表达式也许形如:

作为读者应该知道“a”被发送了一个返回true或者false的名为“negative”(零参数)的消息;“b”也被发送了一个返回true或者 false的为“between: c and: d”的消息。两项的结果or到一起成为消息“ifTrue: [a := c negated]”的接收者。这就是if-then控制结构的地道写法而不是特殊语法。仅是以布尔值作为接收者,以“ifTrue”作为关键字,并且以“[a := c negated]”(我们称其block)作为参数的标准关键字语法。在Smalltalk中你永远遇不到“a := -c”因为不存在一元操作符,但你会看到“-5”这种常量,“-”在此充当常量的一部分。

所以如果你看到形如“-3.5 negated truncated factorial”的表达式时应该立即意识到这其中没有关键字。所以“-3.5”必定是被发送了“negated”消息;执行结果3.5被发送了“truncated”消息;然后执行结果3被发送了“factorial”,产生最终结果6。

当然,还有诸如运算优先级的规则(从左到右),消息优先级(零参数最高,二元运算次之,最后关键字)。写代码时这些很重要,但读代码不必刻意在意这些细节。如下从左到右的表达式:

没有优先级,但是你很难遇到有Smalltalk程序员这么写表达。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注