读《Java编程思想》笔记(I)

四种访问权限:

         Java用三个关键字在类的内部设定边界: public、private、protected。这些访问指定词(access specifier)决定了紧跟其后被定义的东西可以被谁使用。public表示紧随其后的元素对任何人都是可用的,而private这个关键字表示除类型创建者和类型的内部方法之外的任何人都不能访问的元素。private就像你与客户端程序员之间的一堵砖墙,如果有人试图访问private成员,就会在编译时得到错误信息。protected关键字与private作用相当,差别仅在于继承的类可以访问protected成员,但是不能访问private成员。稍后将会对继承进行介绍。

        Java还有一种默认的访问权限,当没有使用前面提到的任何访问指定词时,它将发挥作用。这种权限通常被称为包访问权限,因为在这种权限下,类可以访问在同一个包(库构件〉中的其他类的成员,但是在包之外,这些成员如同指定了private一样。


五个存储数据的地方:

         1)寄存器。这是最快的存储区,因为它位于不同于其他存储区的地方 —— 处理器内部。但是寄存器的数量极其有限,所以寄存器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象(另一方面,C和C++允许您向编译器建议寄存器的分配方式)。
        2)堆栈。位于通用RAM〈随机访问存储器)中,但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存,若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些Java数据存储于堆栈中 —— 特别是对象引用,但是Java对象并不存储于其中。
        3)堆。一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当需要一个对象时,只需用new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代价:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。
        4)常量存储。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分隔离开,所以在这种情况下,可以选择将其存放在ROM(只读存储器)中。
        5)非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是"流对象和持久化对象"。在"流对象"中,对象转化成字节流,通常被发送给另一台机器。在“持久化对象”中,对象被存放于磁盘上。因此,即使程序终止,它们仍可以保持自己的状态。这种存储方式的技巧在于:把对象转化成可以存放在其他媒介上的事物,在需要时,可恢复成常规的、基于RAM的对象。Java提供了对轻量级持久化的支持,而诸如 JDBC 和 Hibernate 这样的机制提供了更加复杂的对在数据库中存储和读取对象信息的支持。


System 中的方法:

第一句:打印当前系统属性    第二句:输出当前用户端名字(yang)    第三句:输出当前所配置的所有环境变量

用于代码文档的javadoc标签:

在使用javadoc处理重要事情之前,应该先到JDK文档那里查阅javadoc参考,以学习javadoc的各种不同的使用方法。

1. @see:引用其他类
    @see 标签允许用户引用其他类的文档。

2. {@link  package.class#member label}
    该标签与@see 极其相似,只是它用于行内,并且是用"label" 作为超链接文本而不用 "See Also"。

3. {@docRoot}
    该标签产生到文档根目录的相对路径,用于文档树页面的显式超链接。

4. {@inheritDoc}
    该标签从当前这个类的最直接的基类中继承相关文档到当前的文档注释中。

5. @version
    该标签提取出版本信息

6. @author
    该标签提取出作者信息

7. @since
    该标签指定所用的JDK版本的情况

8. @param
    该标签用于方法文档中,标识参数列表

9. @return
    该标签用于描述返回值的含义

10. @throws
    异常标签

11. @deprecated
    该标签用于指出一些旧特性已由改进的新特性所取代,建议用户不要再使用这些旧特性,因为在不久的将来它们很可能会被删除。如果使用一个标记为@deprecated的方法,则会引起编译器发布警告。


2.11 练习

1)练习1:创建一个类,它包含一个int域和一个char域,它们都没有被初始化将它们的值打印出来,以验证Java执行了默认初始化。

2)练习2:编写一个程序,展示无论你创建了某个特定类的多少个对象,这个类中的某个特定的static域只有一个实例。

别名机制:

由于 t1 和 t2 都是对对象的引用,t1 = t2 的时候,t1 和 t2 的引用地址是相同的,因此改变 t1 的值的时候 t2 的值自然改变。而 t1 原本指向的对象已经丢失了。(这种现象又叫:别名机制)
代码中的 y 只是作为形式参数而存在,因此当 f() 中的参数为 x时,此时的y.c 实际上就是 x.c。(这种现象也叫:别名机制)

【练习2和3,只需将 Tank 类/ Letter 类中的属性改为float类型的即可。注意:赋值也需修改,因为不是一种数据类型。】


随机数:

        通过Random类的对象,程序可生成许多不同类型的随机数字。做法很简单,只需调用方法nextInt()和nextFloat()即可(也可以调用nextLong0)或者nextDouble())。传递给nextInt()的参数设置了所产生的随机数的上限,而其下限为0,但是这个下限并不是我们想要的,因为它会产生除0的可能性,因此我们对结果做了加1操作。

自增自减:

        这两个操作符各有两种使用方式,通常称为“前缀式”和“后缀式”。“前缀递增”表示“++”操作符位于变量或表达式的前面,而“后缀递增”表示“++”操作符位于变量或表达式的后面。类似地,“前缀递减”意味着“--”操作符位于变量或表达式的前面﹔而“后缀递减”意味着“--”操作符位于变量或表达式的后面。对于前缀递增和前缀递减(如++a或--a),会先执行运算,再生成值。而对于后缀递增和后缀递减〈如a++或a--),会先生成值,再执行运算。


推荐阅读更多精彩内容