Java编程思想 学习笔记2

二、一切都是对象

1.用引用操纵对象

在Java中,一切都被视为对象,但操纵的标识符实际上是对象的一个“引用”。可以将这想象成遥控器(引用)来操纵电视机(对象)。另外,没有电视机,遥控器也可以单独存在。也就是说,你拥有一个引用,并不一定需要有一个对象与它关联。

2.必须由你创建所有对象

一旦创建了一个引用,就希望它能与一个新对象相关联。通常用new操作符来实现。

  ①存储到什么地方

    程序运行时,对象是怎样进行放置安排的呢?特别是内存是怎样分配的?有五个不同的地方可以存储数据:

    1. 寄存器。这是最快的存储区,因为它位于处理器内部。但是寄存器的数量极其有限,所以寄存器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在。
    2. 堆栈。位于通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时,Java系统必须知道存储在堆栈内所以项的确切的生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些数据存储于堆栈中——特别是对象引用,但是Java对象并不存储于其中。
    3. 。一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当需要一个对象时,只需要用new写一行简单的代码,当执行这个代码时,会自动在堆里进行存储分配。当然,这种灵活性必须要付出相应的代价:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多时间。
    4. 常量存储。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。
    5. 非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是流对象和持久化对象

  ②特例:基本类型

    不用new来创建变量,而是创建一个并非是引用的“自动”变量,这个变量直接存储“值”,并置于堆栈中,因此更高效。

    Java确定了每种基本类型所占存储空间的大小。

基本类型  大小 最小值 最大值 包装器类型
boolean  Boolean
char 16-bit Unicode o Unicode 2^16-1 Character
byte   8 bits -128 +127 Byte
short 16 bits -2^15 +2^15-1 Short
int 32 bits -2^31 +2^31-1 Integer
long 64 bits -2^63 +2^63-1 Long
float 32 bits -2^128 +2^127 Float
double 64 bits -2^1024 +2^1023 Double
void

Void

    所有数值类型都有正负号,所以不愿去寻找无符号的数值类型。

    boolean类型所占存储空间的大小没有明确指明,仅定义为能够取字面值truefalse

  ③Java中数组

    当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值(null)。在使用任何引用前,必须为其指定一个对象;如果试图使用一个还是null的引用,在运行时会报错。因此,常犯的数组错误在Java中就可以避免。

3.永远不需要销毁对象

  ①作用域

  作用域决定了在其内定义的变量名的可见性和生命周期。在Java中,作用域由花括号的位置决定。

  尽管以下代码在C和C++中是合法的,但是在Java中却不能这样书写:

{
    int x = 12;
    {
        int x = 96;//Illegal
    }
}

   编译器将会报告变量x已经定义过。Java不允许这样的做法,这样会导致程序混乱。

  ②对象的作用域

  Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,它可以存活于作用域之外。

  事实证明,由new创建的对象,只要你需要,就会一直保持下去。如果Java让对象继续存在,那么靠什么才能防止这些对象填满内存空间,进而阻塞程序呢?

  Java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便其他新的对象使用。

4.创建新的数据类型:类

  一旦定义了一个类(在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象),就可以在类中设置两种类型的元素:字段(有时被称作数据成员)方法(有时称作成员函数)。字段可以时任何类型的对象,可以通过其引用与其进行通信。如果字段时对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象相关联。

  若类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值:

基本类型 默认值
boolean false
char 'u0000'(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d

  当变量作为类的成员变量使用时,Java才确保给它默认值。确保初始化的方法不适用于“局部”变量。

5.方法、参数和返回值

  Java的方法决定了一个对象能够接收什么样的消息。方法的基本组成部分包括:名称、参数、返回值和方法体。方法名和参数列表(它们合起来被称为“方法签名“)唯一地标识出某个方法。

  Java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用,且这个对象必须能执行这个方法调用。通过对象调用方法时,需要先列出对象名,紧接是句点,然后是方法名和参数列表。例如,有一个方法f(),不带任何参数,返回类型是int。如果有个名为a的对象,可以通过它来调用f():int x = a.f(); 返回值的类型必须与x的类型相兼容。

  这种调用方法的行为通常被称为发送消息给对象。在上面的例子中,消息是f(),对象是a。面向对象的程序设计通常简单地被归纳为“向对象发送消息”。

  ①参数列表

  方法的参数列表指定要传递给方法什么样的信息。参数列表中传递的实际上也是引用,并且引用的类型必须正确。

6.构建一个Java程序

  ①名字可见性

   有时,不同模块由于设计者的不同可能会出现名字冲突的现象。Java采用一种新的方法来处理此问题。为了给类库生成一个不会与其他名字混淆的名字,Java设计者希望程序员反过来使用自己的Internet域名,因为这样可以保证它们肯定是独一无二的。

  包名都是小写的。

  这种机制意味着所有的文件都能够自动存活于它们自己的名字空间内,而且同一个文件内的每个类都有唯一的标识符。

  ②运用其他的构件

  import指示编译器导入一个包,也就是一个类库。使用通配符“*”来一次性导入一群类。

  ③static关键字  

  除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。

  当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域。

  由于在用static方法前不需要创建任何对象,所以对于static方法,不能简单地通过调用其他非static域或方法而没有指定某个命名对象,来直接访问非static域或方法。

7.注释和嵌入式文档

  Java里有两种注释风格。一种是“/*......*/”(多行注释),另一种是“//”(单行注释)。

  ①注释文档

  javadoc是用于提取注释的工具,它是JDK安装的一部分。它采用了Java编译器的某些技术,查找程序内的特殊注释标签。它不仅解析由这些标签标记的信息,也将毗邻注释的类名或方法名抽取出来。javadoc输出的是一个HTML文件,可以用Web浏览器查看。

  ②语法

  所以javadoc命令都只能在“/**”注释中出现,和通常一样,注释结束于“*/”。使用javadoc的方式主要有两种:嵌入HTML,或使用“文档标签”。独立文档标签是一些以“@”字符开头的命令,且要置于注释行的最前面。而“行内文档标签”则可以出现在javadoc注释中的任何地方,它们也是以”@“字符开头,但要在花括号里。

  共有三种类型的注释文档,分别对应于注释位置后面的三种元素:类、域、方法。

  注意,javadoc只能为public和protected成员进行文档注释。(但可以用-private进行标记,以便把private成员的注释也包括在内)。

  ③一些标签实例

  1.@see:引用其他类

  @see标签允许用户引用其他类的文档。javadoc会在其生成的HTML文件中,通过@see标签链接到其他文档。

  2.{@link package.class#member label}

  该标签与@see极其相似,只是它用于行内,并且是用“label”作为超链接文本而不用“See Also”.

  3.{@docRoot}

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

  4.{@inheritDoc}

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

  5.@version

  该标签的格式如下:

  @version version-information

  其中,“version-information”可以是任何你认为合适包含在版本说明中的重要信息。如果javadoc命令行中使用了“-version”标记,那么就从生成的HTML文档中特别提取出版本信息。

  6.@author

  该标签的格式如下:

  @author author-information

  其中,author-information一看便知是你的姓名,但是也可以包括电子邮件地址或者其他任何适宜的信息。如果javadoc命令行中使用了“-author”标记,那么就从生成的HTML文档中特别提取出作者信息。

  7.@since

  该标签允许你指定程序代码最早使用的版本,可以在HTML Java文档中看到它被用来指定所用的JDK版本的情况。

  8.@param

  该标签用于方法文档中,形式如下:

  @param paramater-name description

  其中,paramater-name是方法的参数列表中的标识符,description是可延续数行的文本,终止于新的文档标签出现之前。

  9.@return

  该标签用于方法文档中,形式如下:

  @return description

  其中,description用来描述返回值的含义,可以延续数行。

  10.@throws

  对异常进行说明,格式如下:

  @throws fully-qualified-class-name description

  其中fully-qualified-class-name给出一个异常类的无歧义的名字,而该异常类在别处定义。

description告诉你为什么此异常类型会在方法调用中出现。

  11.@deprecated

  该标签用于指出一些旧特性已由改进的新特性所取代,建议用户不要再使用这些旧特性。如果使用一个标记为@deprecated的方法,则会引起编译警告。

8.编码风格

  在“Java编程语言编码约定”中,代码风格是这样规定的:类名的首字母要大写;如果类名由几个单词构成,那么把它们并在一群,其中每个内部单词的首字母都采用大写形式。几乎其他所有内容——方法,字段以及对象引用名称等,公认的风格与类的风格一样,只是标识符的第一个字母采用小写。

9.总结

  本章简单介绍了如何编写一个Java程序,是十分基础的内容,但也是很重要的。记录下来以便复习记忆

原文地址:https://www.cnblogs.com/fht-litost/p/8322458.html