2.1用引用操纵对象
Java语言中将一切都看作对象,操纵的标识符实际上是对象的一个引用,
例如:String
s;
这里所创建的只是引用,而不是对象,此时向s发送一个消息,就会返回一个运行时的错误。
安全的做法:创建一个引用的同时便进行初始化
例如:String s = "asdf";(字符串可以使用带引号的文本初始化)
2.2必须由你创建所有的对象
创建一个引用并将其与新的对象相关联。
例如:String
s =new
String(“asdf);
2.2.1存储到什么地方:
1)寄存器:
这是最快的存储区(Java不允许控制,但是C和C++可以向编译器建议
)
2)堆栈:
位于RAM(
随机访问存储器),分配存储的方法仅次于寄存器;
堆栈指针向下移动,分配新的内存;向上移动,则释放那些内存;
某些Java数据存储于堆栈之中-------特别是对象引用,但是Java的对象并不在其中;
3)堆:一种通用的内存池(也位于RAM区),存放所有的Java对象
堆不同于堆栈的地方:编译器不需要知道存储数据在堆里的存活时间,在堆里分配存储有很大灵活性;
(堆进行存储和清理比堆栈需要更多的时间);
4)常量存储:常量一般是被存放在程序代码内部,这样安全且不容易被改变;
(在嵌入式系统中常量会被分开来放,可以选择将其存入ROM(只读存储器));
5)非RAM存储:两个基本例子对象流和持久化对象;
对象流:对象转化为字节流,通常被发送给另一台机器;
持久化对象流:对象被放在磁盘上,(技巧:把对象转化为可以存放在其他媒介上的事物);
2.2.2特例:基本类型
1)在用new创建一个对象-----特别是的简单的变量,往往不是很有效,Java采取了C和C++相同的方法,创建一个
并非是引用的“自动”变量。这个变量直接存储“值”,并置于堆栈中,因此更加高效;
2)Java确定了每次类型的确切大小,因此可移植性好,所有的数值类型都有正负号,不要去寻找无符号的类型;
2.2.3Java中的数组
1)Java确保数组会被初始化,而且不能在它范围之外访问(增加了少量的内存开销和运行检查不过很微小);
2)创建数组对象时,所有的引用被初始化为null,如果运行时还是null,则编译器会进行报错;
3)创建存放基本类型的数组时,编译器会将数组所占的内存全部织零;
2.3永远不需要销毁对象
2.3.1作用域
1)作用域决定了在其内定义的变量名的可见性和生命周期;
2)在C和C++里将一个较大作用域的变量“隐藏”起来的做法,在Java中是不允许的,设计者认为这样会导致程序混乱
{
int x=12;
{
int x=96;//非法的
}
}
2.4创建新的数据类型:类
2.4.1字段和方法
1)在类中设置两种类型的元素:
字段(有时被称为数据成员):1.可以是任何类型的对象
2.可以通过其引用与其进行通信
3.可以是基本类型的一种
注意:1)如果字段是某个对象的引用,那么必须初始化该引用,以便使其与一个实际
对象相关联。
2)想修改的数据也可能位于对象所包含的其他对象中,只需要再使用连接句点;
2.5方法,参数和返回值
1)返回值类型描述的是在调用方法之后从方法返回的值,参数列表给出了要传给方法的信息的类型和名称;
方法名和参数列表合起来被称为方法签名,唯一的标识出某个方法。
2.5.1参数列表
若返回值类型为void,return关键字的作用只是用来退出方法,因此,没有必要到方法结束时才离开,但如果
返回值类型不是void,无论从何处返回,编译器都会强制返回一个正确类型的返回值。
2.6构建第一个Java程序
2.6.1名字可见性
Java设计者希望程序员反过来使用自己的Internet域名,这样保证自己肯定是独一无二的,反转域名后,句点用来
代表子目录的划分。
2.6.3static关键字
通常来讲创建了类后,必须用new创建对象来进行里面的方法调用,有两种方法是上述方法无法解决的,
情形一:只想为某一特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何的对象
情形二:希望某个方法不与包含它的类的任何对象关联在一起,也就是说即使没有创建这个对象,也可以调用这个方法
static关键字可以满足:当声明一个事物是static时,就意味着这个域或者方法不会与包含它的那个类的任何对象实例关
联在一起。所以即使从未创建某个类的任何对象,也可以调用其static方法或访问static域。通常你必须创建一个对象
并用它来访问数据或方法,因为飞static方法或域必须知道他们一起运作的特定对象。
有关static的方法:
class StaticTest{
static int i = 48;
}
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
现在,即使有个两个StaticTest对象,StaticTest.i也只有一份存储空间。
在这里,st1.i和st2.i指向同一存储空间,因此具有相同的值。
引用static的两种方法:1)通过一个对象去定位它,如st1.i;
2)可以通过其类名直接引用(这对非静态成员则不可以),StaticTest.i++;
注意:(引用类名是引用static变量的首选方式,这不仅是因为它强调了变量的static结构,
而且有些情况下它还可以为编译器进行优化提供了更好的机会
)
2.7你的第一个Java程序
package java2_7;
import java.util.*;
//创建一个今天是星期几的程序
public class HelloDate {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello it's");
System.out.println(new Date());
}
}
这里用到了Java标准库里面的Date类;
功能:打印今天的日期;
1)程序的开头,必须声明import语句,以便引入在文本代码中需要用到的额外类;
(之所以说额外,是因为有一个特定的类会被自动的导入到每一个Java文件中:java.lang)
2)类的名字必须与文件名相同,如果你像现在这样创建一个独立运行的程序,那么文件中必须存在某个类与该文件名相
同,(否则,编译器会报错)且那个类必须包含一个名为main()的方法;
3)传递的参数是一个Date对象,一旦创建它以后,就可以直接将它的值(它被自动转化为String类型)发送给println();
2.7.1编译和运行
本书是以jkd为例的,其他第三方软件也可以。
2.8注释和嵌入式文档
1)单行注释风格://;
2)多行注释风格:/*This is coment
*that continue
*across lines
*/
2.8.1注释文档
1)javadoc便是用于提取注释的工具,它是JDK的一部分,它采用了Java编译器的某些技术,查找程序呢你的特别注释标签。
它不仅解析由这些标签标记的信息,也将毗邻注释的类名或方法名抽取出来,如此,我们就可以用最少的工作量,生成相
当好的程序文档。
2)javadoc生成的是一个HTML文件,该工具就使得我们只需创建和维护单一的源文件。并能自动生成有用的文档。
3)如果想对javadoc处理过的信息执行特殊的操作,那么可以通过javadoc处理器来实现。
2.8.2语法
1)共有三种类型的注释文档:类注释位于类定义之前,域注释位于域定义之前,方法注释位于方法定义之前。
2)javadoc只能为public和protect成员进行文档注释,private和包含可访问成员的注释会被忽略掉,不过可以用-private标记;
2.8.3嵌入式HTML
1)在文档注释中,每一行开头的*和前导空格会被javadoc丢弃,javadoc会将所有内容重新格式化;
2)不要使用标题标签,例如<h1>或<hr>;因为javadoc会插入自己的标题,而你的将会和他们发生冲突;
2.8.4一些标签示例
1)@see:
引用其它类
例子:
@see:
classname;
2){@link package.class#member
label
}
该标签与@see极其相似,只是它用于行内,并且是用label作为超链接文本。
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
其中,parmeter-name是方法的参数列表中的标识符,description是可延续数行的问,可以使用任意多个这种的标签。
9)@return 格式:@return description 其中,description用来描述返回值的含义,可以延续数行。
10)@throws
异常抛出,需要对每种情况进行说明。
11)deprecated
该标签指出一些旧特性已由新特性所取代。
2.9编码风格
1)类名要大写,如果由几个单词组成,则其他单词的首字母要大写,记住不要用下划线来分割开来;
2)方法,字段都是如此,只是第一个首字母要小写;