2.1 对象及引用
在Java里,一切都被视为对象,但操纵对象的标识符实际上是对象的一个引用(reference);
好比,遥控器(引用)操纵电视机(对象);
创建一个String引用:
String s;(s此时没有与任何对象关联)
2.2 创建对象
new关键字:创建一个对象
“对象”存储的地方:
寄存器:最快的存储区
堆栈:位于RAM(随机访问存储器)中,;堆栈指针向下移动,则分配新的内存,向上移动,则释放那些内存;速度仅次于寄存器;
堆:通用的内存池(也位于RAM中),用于所有的Java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多久。new关键字会自动在堆里进行存储分配;
常量存储:常量值直接存放在程序代码内部;
非RAM存储:流对象和持久化对象(文件、数据库)
对象的特例:基本类型
new关键字将对象存储在“堆”里,但这种方法创建特别小的、简单的变量不是很有效;
基本类型不是用new创建的,不需要创建一个引用的“自动”变量,而是直接将值存储在堆栈中,更加高效;
基本类型都有相应的包装类型。可以进行自动装箱拆箱。
自动装箱:
Character ch = 'x';(相当于Character c = new Character('x');)
自动拆箱:
Character ch = new Character('x');
char c = ch;(这句用到了自动拆箱,相当于……)
Java还提供高进度数字:BigInteger和BigDecimal,分别对应int和float;
Java数组自带范围检查,很安全;
当创建一个数组对象时,实际上创建了一个引用数组,每个引用都自动初始化为一个特定值null;
在使用任何引用之前,都必须为其指定一个对象;
还可以创建存放基本数据类型的数组;
2.3 对象的生命周期
作用域(scope):作用域决定了在其定义的变量名的可见性和生命周期
基本类型的作用域由花括号决定;在作用域内定义的变量只可用于作用域结束之前;
对象不具备和基本类型一样的生命周期,当用new创建一个对象时,它可以存活在作用域之外(对象存活于作用域之外,而不是引用)。
例如:
{
String s = new String("string");
}
引用s在作用域终点(就是花括号“}”)就消失了,但是s指向的String对象仍然占据内存空间;
Java有垃圾回收器,会自动回收不会再被引用的对象,这样就不用担心内存泄漏的问题。
2.4 创建新的对象类型——类
class关键字:
class ATypeName{
//……
}
ATypeName a = new ATypeName();
类的两个元素:
字段:数据成员(可以是对象,也可以是基本数据类型)
方法:成员函数
类中基本数据类型有默认值,只有当变量作为类的成员使用时,Java才确保给其默认值,但是“局部”变量(并非某个类的数据成员)则不享受这种待遇,在某个方法中定义的变量得到的可能是随机值。
2.5 方法、参数和返回值(注意事项)
略
2.6 构建一个Java程序
包名(类库名):
为了给一个类库生成不会与其他名字混淆的名字,Java设计者希望程序员反过来使用自己的Internet域名。
import关键字导入一个包;
static关键字:
使用情况:
(1)只想为某个特定域分配单一存储空间,而不去考虑究竟要创建多少对象,或者根本不创建任何对象;(静态成员变量)
(2)即使没有创建对象,也想调用某个方法;(静态成员方法)
static声明的事物和类绑定,而不和类的对象实例绑定。
注意:static方法不能调用非static的域或方法;
静态方法可以通过类名直接调用。
2.7 第一个Java程序
java.lang包会自动导入;
Data类在java.util包;
javac.java
2.8 注释和嵌入式文档
代码和稳定链接起来
javadoc是用于提取注释的工具,它采用了Java编译器的某些技术,可以查找程序内的特殊标签。通过解析标签,将毗邻的类名或方法抽取出来。
javadoc输出一个doc文档;
语法和标签示例:略;
编码风格:驼峰