二.一切都是对象——Java编程思想第4版学习笔记

2.1 用引用操纵对象

在Java中,一切都看作是对象,但操纵的标识符是对象的一个“ 引用”(reference)。拥有一个引用,并不一定需要有一个对象与它关联。如果想操纵一个词或句子,则可以创建一个String引用:String s; 比较安全的做法是创建一个引用的同时便进行初始化:String s = "asdf";

2.2 必须由你创建所有对象

一旦创建了一个引用,就希望它能与一个新的对象相关联。通常用new操作符来实现这一目的:String s = new String("asdf");
2.2.1 存储到什么地方
有五个不同的地方可以存储数据:
1) 寄存器:最快的存储区,位于处理器内部,但是数量有限,根据需求进行分配;
2) 堆栈:位于通用RAM中,但通过堆栈指针可以从处理器那里获得直接支持,虽然某些Java数据存储于堆栈中——特别是对象引用,但是Java对象并不存储于其中;
3) :一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆不同于堆栈中的好处是:编译器不需要知道存储的数据在堆里存活多长时间,但是用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间;
4) 常量存储:常量值通常直接存放在程序代码内部,即ROM(只读存储器)中;
5) 非RAM存储:包括流对象和持久化对象,在流对象中,对象转化成字节流,通常被发送给另一台机器,在“持久化对象”中,对象被存放于磁盘上,把对象转化成可以存放在其他媒介上的事物,在需要时,可恢复成常规的、基于RAM的对象。Java提供了对轻量级持久化的支持,而诸如JDBC和Hibernate这样的机制提供了更加复杂的对在数据库中存储和读取对象信息的支持。
2.2.2 特例:基本类型
并非是引用的“自动”变量,这个变量直接存储”值“,并置于堆栈中,因此更高效。包含boolean(Boolean)、char(Character)、byte(Byte)、short(Short)、int(Integer)、long(Long)、float(Float)、double(Double)、void(Void),所有的数值类型都有正负号,所占存储空间大小不变,boolean类型所占存储空间的大小没有明确指定,仅定义为能够取字面值true或false。
包装器类:Character ch = new Character('x'); (Java SE5: Character ch = 'x';)
高精度数字:BigInteger和BigDecimal
2.2.3 Java中的数组
Java确保数组会被初始化,而且不能在它的范围之外被访问。当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null。一旦Java看到null,就知道这个引用还没有指向某个对象。在使用任何引用前,必须为其指定一个对象;如果试图使用一个还是null的引用,在运行时将会报错。还可以创建用来存放基本数据类型的数组,将这种数组所占的内存全部置零。

2.3 永远不需要销毁对象

2.3.1 作用域
在C、C++和Java中,作用域由花括号的位置来决定。在Java中不能重复定义变量以将一个较大作用域的变量“隐藏”起来。
2.3.2 对象的作用域
Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,它可以存活于作用域之外。例如,代码:
{
    String s = new String("a string");
}  //End of scope
引用点s在作用域终点就消失了,然而,s指向的String对象仍继续占据内存空间。
Java有一个 垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。

2.4 创建新的数据类型:类

2.4.1 字段和方法
一旦定义了一个类(在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象),就可以在类中设置两种类型的元素:字段(数据成员)和方法(成员函数)。字段可以是任何类型的对象,可以通过其引用与其进行通信,也可以是基本类型中的一种。如果字段是对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象相关联。
每个对象都有用来存储其字段的空间,普通字段不能在对象间共享。可以给字段赋值,但首先必须知道如何引用一个对象的成员:objectReference.member,如data.i = 47;
基本成员默认值,不适用于“局部”变量(即并非某个类的字段)。如果忘记赋值,Java会在编译时返回一个错误,告诉你此变量没有初始化。

2.5 方法、参数和返回值

Java的方法决定了一个对象能够接收什么样的信息。方法的基本组成部分包括:名称、参数、返回值和方法体。
ReturnType methodName( /* Argument list */ ) {
    /* Method body */
}
Java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用,且这个对象必须能执行这个方法。通过对象调用方法时,需要先列出对象名、句点、方法名和参数列表:objectName.methodName(arg1, arg2, arg3);
这种调用方法的行为通常被称为 发送信息给对象
2.5.1 参数列表
在参数列表中,必须制定每个所传递对象的类型及名字。像Java中任何传递对象的场合一样,这里传递的实际上也是引用,并且引用的类型必须正确。

2.6 构建一个Java程序

2.6.1 名字可见性
为了给一个类库生成不会与其他名字混淆的名字,Java设计者希望程序员反过来使用自己的Internet域名,因为这样可以保证它们肯定是独一无二的。反转域名后,句点就用来代表子目录的划分。这种机制意味着所有的文件都能够自动存活于它们自己的 名字空间内,而且同一个文件内的每个类都有唯一的标识符。
2.6.2 运用其他构件
在同一个文件中预先定义好的类,Java消除了所谓的“向前引用”问题。可以使用关键字 import来准确地告诉编译器你想要的类是什么。import指示编译器导入一个包,也就是一个类库。
2.6.3 static关键字
当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域。
使用类名是引用static变量的首选方式,这不仅是因为它强调了变量的static结构,而且在某些情况下它还为编译器进行优化提供了更好的机会。类似逻辑也应用于静态方法,既可以像其他方法一样,通过一个对象来引用某个静态方法,也可以通过特殊的语法形式ClassName.method()加以引用。

2.7 你的第一个Java程序

// HelloDate.java
import java.util.*;
public class HelloDate {
    public static void main(String[] args) {
        System.out.println("Hello, it's:");
        System.out.println(new Date());
    }
}
  
public关键字意指这是一个可由外部调用的方法,main()方法的参数是一个String对象的数组,在这个程序中并未用到args,但是Java编译器要求必须这样做,因为args要用来存储命令行参数。
2.7.1 编译和运行
java HelloDate.java
java HelloDate
build.xml -------- ant

2.8 注释和嵌入式文档

2.8.1 注释文档
javadoc是用于提取注释的工具,它是JDK安装的一部分。它采用了Java编译器的某些技术,查找程序内的特殊注释标签。不仅解析由这些标签标记的信息,也将毗邻注释的类名或方法名抽取出来。如此,我们就可以用最少的工作量,生成相当好的程序文档。
javadoc输出的是一个HTML文件,可以用Web浏览器查看。此外,如果想对javadoc处理过的信息执行特殊的操作(例如,产生不同格式的输出),那么可以通过编写你自己的被称为“ doclets”的javadoc处理器来实现。
2.8.2 语法
所有javadoc命令都只能在“/**“注释中出现,和通常一样,注释结束于“*/“。使用javadoc的方式主要有两种:嵌入HTML,或使用“文档标签”。
共有三种类型的注释文档,分别对应于注释位置后面的三种元素:类、域和方法。javadoc只能为public和protected成员进行文档注释,private和包内可访问成员的注释会被忽略掉。
2.8.3 嵌入式HTML
2.8.4 一些标签示例
1)@see:引用其他类
2){@link package.class#member label}:与@see极其相似,只是用于行内,并且是用“label”作为超链接文本而不用“See Also”。
3) {@DocRoot}:该标签产生到文档根目录的相对路径,用于文档树页面的显式超链接。
4){@inheritDoc}:该标签从当前这个类的最直接的基类中继承相关文档到当前的文档注释中。
5)@version:格式为@version version-information
6) @author:格式为@author author-information
7)@since:允许指定程序代码最早使用的版本,可以在HTML Java文档中看到它被用来指定所用的JDK版本的情况。
8)@param:格式为@param parameter-name description
9)@return:用于方法文档中,格式为@return description
10)@throws:格式为@throws fully-qualified-class-name description
11)@deprecated:用于指出一些旧特性已由改进的新特性所取代,建议用户不要再使用这些旧特性。(@Deprecated)
2.8.5 文档示例
2.9 编码风格
类名的首字母要大写;如果类名由几个单词构成,那么把它们并在一起,其中每个内部单词的首字母都采用大写形式。几乎所有其他内容——方法、字段以及对象引用名称等公认的风格与类的风格一样,只是标识符的第一个字母采用小写。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值