Java编程思想第七更

2.6 构建 Java 程序

2.6.12.6.1 名字的可见性

在所有程序设计语言里,一个不可避免的问题是对名字或名称的控制。假设您在程序的某个模块里使用了一个名字,而另一名程序员在另一个模块里使用了相同的名字。此时,如何区分两个名字,并防止两个名字互相冲突呢?这个问题在 C语言里特别突出。因为程序未提供很好的名字管理方法。C++的类(即 Java 类的基础)嵌套使用类里的函数,使其不至于同其他类里的嵌套函数名冲突。然而,C++仍然允许使用全局数据以及全局函数,所以仍然难以避免冲突。为解决这个问题,C++用额外的关键字引入了“命名空间”的概念。
由于采用全新的机制,所以Java 能完全避免这些问题。为了给一个库生成明确的名字,采用了与Internet域名类似的名字。事实上,Java 的设计者鼓励程序员反转使用自己的Internet 域名,因为它们肯定是独一无二的。由于我的域名是BruceEckel.com,所以我的实用工具库就可命名为
com.bruceeckel.utility.foibles。
所以目前的整个软件包都以小写字母为标准。
Java 的这种特殊机制意味着所有文件都自动存在于自己的命名空间里。而且一个文件里的每个类都自动获得一个独一无二的标识符(当然,一个文件里的类名必须是唯一的)。所以不必学习特殊的语言知识来解决这个问题——语言本身已帮我们照顾到这一点。

  • 现在去回想写C语言的时候各种变量名重复冲突,完了居然还故意出这种题目让你去辨别结果,Java用域名反转来作为库名很轻松的解决了问题,不仅是在本地不会冲突,当大家都上传到云仓库中也不容易造成冲突。

2.6.2 使用其他组件

一旦要在自己的程序里使用一个预先定义好的类,编译器就必须知道如何找到它。当然,这个类可能就在发出调用的那个相同的源码文件里。如果是那种情况,只需简单地使用这个类即可——即使它直到文件的后面仍未得到定义。Java 消除了“向前引用”的问题,所以不要关心这些事情。
但假若那个类位于其他文件里呢?您或许认为编译器应该足够“联盟”,可以自行发现它。但实情并非如此。假设我们想使用一个具有特定名称的类,但那个类的定义位于多个文件里。或者更糟,假设我们准备写一个程序,但在创建它的时候,却向自己的库加入了一个新类,它与现有某个类的名字发生了冲突。
为解决这个问题,必须消除所有潜在的、纠缠不清的情况。为达到这个目的,要用import 关键字准确告诉Java 编译器我们希望的类是什么。import的作用是指示编译器导入一个“包”——或者说一个“类库”(在其他语言里,可将“库”想象成一系列函数、数据以及类的集合。但请记住,Java 的所有代码都必须写入一个类中)。

  • 消除导入类的不确定性。用的最多的方法基本都是标准Java库提供了。
  • 如果需要导入一个包下的所有类,可以使用星号作为通配符。但是不建议在正式环境中这样使用。

2.6.3 static 关键字

通常,我们创建类时会指出那个类的对象的外观与行为。除非用new 创建那个类的一个对象,否则实际上并未得到任何东西。只有执行了new 后,才会正式生成数据存储空间,并可使用相应的方法。
但在两种特殊的情形下,上述方法并不堪用。一种情形是只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。为满足这两方面的要求,可使用static(静态)关键字。一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个 static方法,或访问一些 static数据。而在这之前,对于非 static数据和方法,我们必须创建一个对象,并用那个对象访问数据或方法。

这是由于非static数据和方法必须知道它们操作的具体对象。当然,在正式使用前,由于static方法不需要创建任何对象,所以它们不可简单地调用其他那些成员,同时不引用一个已命名的对象,从而直接访问非 static成员或方法(因为非static成员和方法必须同一个特定的对象关联到一起)。
有些面向对象的语言使用了“类数据”和“类方法”这两个术语。它们意味着数据和方法只是为作为一个整体的类而存在的,并不是为那个类的任何特定对象。

对方法来说,static一项重要的用途就是帮助我们在不必创建对象的前提下调用那个方法。正如以后会看到的那样,这一点是至关重要的——特别是在定义程序运行入口方法main()的时候。

  • 被static修饰的方法就与类脱离的关系,虽然还可以通过对象加点的方式使用,但是这种方法是不明确的,IDE都会提醒你切换成类名加点的方式使用,因为这个方法更像是类下属的内容,而不是一个实例化后的对象。
  • 对于被static修饰的数据,就可以称之为类变量,这个数据就不再属于一个特定的实例了。当各个实例去使用时,获取的都是同一个数据。

2.7 我们的第一个 Java 程序

  • 教你如何编写最初的语句,居然不是HelloWorldjava.lang包下的类可以直接使用,不需要导入。
  • 突然发现理论性的东西都讲了一堆才开始写第一行代码,新手能忍得住吗。
  • 介绍了加号可以连接字符串。

2.8 注释和嵌入文档

  • 介绍了注释的几种方式,单行多行和文档注释。
  • 小细节,private和空控制修饰符的成员注释会被忽略,这个学到了。也是符合权限控制的思想,都已经私有的方法了,没有必要让外界了解具体。
  • 介绍了一堆可以写在文档注释里的标记,常用的有@author,@see,@param,@return,@exception等等。

2.9 编码样式

一个非正式的Java 编程标准是大写一个类名的首字母。若类名由几个单词构成,那么把它们紧靠到一起(不要用下划线来分隔名字)。此外,每个嵌入单词的首字母都采用大写形式。

  • 这种命名法称之为驼峰命名法,不仅是在Java,在不少地方都是使用这种命名方式。

2.10 总结

  • 第二章结束啦,下个礼拜开始第三章,控制程序流程。希望我不鸽吧。❤

END

Java编程思想第六更

我又又又鸽了

一转头又鸽了半个月的更新,不得不说sorted的推迟功能可真方便,天天下午就点一下,总感觉明天再看,明天再写,不行可以星期六再写,事实上还是没写,CK3真好玩不多BB了,明天再继续写一点。

阅读更多

Java编程思想第四更

1.7.1 集合与继承器

针对一个特定问题的解决,如果事先不知道需要多少个对象,或者它们的持续时间有多长,那么也不知道如何保存那些对象。既然如此,怎样才能知道那些对象要求多少空间呢?事先上根本无法提前知道,除非进入运行期。

阅读更多

Java编程思想第三更


为什么拖更

  • 最近的需求基本都搞完了,也是看起来很简单的东西搞了快一个月,确实学到了很多东西,还是上手操作学的更快啊,有机会的话会写一下其中遇到的坑和学到的东西(挖坑+1)。
  • 因为以后不太可能每个星期都更新了,所有这个系列就不叫每周了,当然我会尽量更新一下内容的。
  • 这两天会写一篇我在Windows下常用的软件,也算是给自己做个备忘录(挖坑+2)。
阅读更多