2.1用引用操纵对象
尽管一切都看作对象,但操纵的标识符实际上是对象的一个“引用”。
String s;// s是一个String类型的引用, 并没有任何对象与其关联String str = "imbug";// 创建str引用的时候同时进行初始化
2.2 必须由你创建所有对象
使用new
操作符来创建新对象并与引用关联。
String str = new String("imbug");
2.2.1 存储到什么地方
- 寄存器(不管你的事)——最快的存储区、位于处理器内部、空间极小、不能直接控制
- 堆栈(栈)——位于RAM、堆栈指针向下移动分配新内存、堆栈指针向上释放内存、存储对象的引用
- 堆——位于RAM、存放Java对象、耗时比堆栈长
- 常量存储——程序代码内部
- 非RAM存储——如磁盘
2.2.2 特殊:基本类型
问题:用new
创建的对象在堆里,对访问频繁而且简单的对象代价太大。
new
创建变量,而是创建一个不是引用的变量,直接存储“值”在栈中。 基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
---|---|---|---|---|
boolean | - | - | - | Boolean |
char | 16bits | 0 | 2^16-1 | Character |
byte | 8bits | -128 | 127 | Byte |
short | 16bits | -2^15 | 2^15-1 | Short |
int | 32bits | -2^31 | 2^31-1 | Integer |
long | 64bits | -2^63 | 2^63-1 | Long |
float | 32bits | - | - | Float |
double | 64bits | - | - | Double |
void | - | - | - | Void |
关于存储空间
Java确定每种基本数据类型所占空间的大小,跟硬件平台无关。
关于boolean类型
- boolean类型所占类型的大小没用明确指定,今定义为能够取字面值true、false
- 在《Java虚拟机规范》一书的描述,“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。
- 这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。
- 根据:The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.
关于高精度数字
Java提供了BigInteger和BitDecimal两个高精度计算的类,但是没有对应的基本类型。
2.2.3 数组
Java确保数组会被初始化,而且不能在它的范围之外被访问;这种范围检查的原理是每个数组上的少量内存开销和运行时的下标检查。
创建一个数组对象Object[] arr = new Object[10];
时,实际上是创建了一个引用的数组,数组中的每个引用都自动被初始化为null
;如果是创建的是基本数据类型数组,则会讲该数组所占的栈内存全部置为0。 2.3 永远不需要销毁对象
2.3.1 变量以及基本类型的作用域
Java语言中,作用域由花括号{}
位置决定,在作用域中定义的变量只可作用于作用域结束之前。
2.3.2 对象的作用域
Java对象和基本类型的生命周期不一致。
{ String str = new String("imbug");}
上述代码中当超出}
的范围之后,引用str
已经消失了,但它指向的String
对象仍然存在在堆内存中,但我们无法访问该对象,因为它的引用已经消失。
new
创建的对象,并辨别那些不会再被使用的对象,然后释放其占据的内存空间。 2.4 创建新的数据类型:类
使用class
关键字来表示“一种新的类型”。
class ClassName {}
字段(数据成员):可以是任何的对象和基本数据类型
- Java会对全部字段进行初始化
- 基本数据类型初始值为0(false、u0000等…)
- 对象的引用初始值
null
- 当变量作为类的成员时才会被初始化,局部变量不会被初始化
方法(成员函数):详见2.5节
2.5 方法、参数和返回值
ReturnType methonName( /* Arguement list */ ) { /* Method body */}
- Java方法决定了一个对象能够接收什么样的消息。
- 方法的基本组成包括:名称、参数、返回值、方法体
- 方法名和参数列表唯一的标识出某个方法。
- Java中的方法只能作为类的一部分来创建。
参数列表
- 方法的参数列表指定要传递给方法什么样的信息。
- 参数列表中必须指定每个所传递对象的类型及名字。
- 传递的实际上是引用。
- 如果返回的类型是
void
,则return的作用仅是退出方法;否则必须返回正确的返回值
2.6 包名、import、static
名字可见性
Java约定以域名反转作为包名,用.
来划分子目录,并且全部小写。
import关键字
使用import关键字引用其他定义好的类
static关键字
现象:创建一个class
的时候,只是描述一个类的对象的外观与行为。在new
创建该类的对象之后,才会分配数据存储空间,其方法才可以被外界调用。
static关键字
- 当声明一个事物是static时,就意味着这个字段或者方法不与任何对象绑定在一起
- 不需要创建对象也可以访问该类的任何static域和static方法
- 即使没有显示地声明为static,类的构造器实际上也是静态方法
- 和其他任何方法一样,static方法可以创建或使用与其类型相同的被命名对象,因此,static方法常常拿来做“牧羊人”的角色,负责看护与其隶属同一类型的实例群。如果你的类代表羊,那么创建的若干的该类的对象,就好像建了一个羊群,然而,类中的static方法就好比牧羊人一样,无论你的羊群中有多少只羊,而牧羊人只有一个。也就是说, static方法或属性与对象的创建无关,只和类有关。
2.7 main方法、编译、运行
import java.util.Date;public class Test { public static void main(String[] args) { // main方法args用于接收命令行参数 System.out.println(new Date()); }}
2.8 注释和文档
2.8.1 java的注释
/* 多行注释 */// 单行注释
2.8.2 javadoc
javadoc是用于提取注释的工具,他可以找出程序内的特殊注释标签并解析。
javadoc输出的是一个HTML文件。所有javadoc命令都只能在/* */
注释中出现。使用javadoc有两种方式:嵌入HTML或使用文档标签独立文档标签:以@
字符开头,且要置于注释行的最前面行内文档标签:出现在任何地方,以@
开头,但要放在{}
内javadoc只能为public和protect成员进行文档注释,private和包内可访问的注释会被忽略,输出结果中看不到它们。使用-private标记可以把private注释也包括进去。 2.8.3 嵌入式HTML
不要在嵌入式HTML标签中使用标题如<h1>
、<hr>
,否则会跟javadoc自己的标题冲突。
2.8.4 文档标签
-
@see package.class#member
:允许用户引用其他类的文档 -
{@link package.class#member}
:跟@see
相似,只是它用于行内 -
{@docRoot}
:该标签产生到文档根目录的相对路径,用于文档树 -
{@inheritDoc}
:从这个类的基类继承相关文档到当前文档注释中 -
@version
:版本信息;-version标记可以从生成的HTML中提取出版本信息 -
@author
:作者信息;-author标记;可以使用多个@author
标签但是必须连续放置 -
@since
:程序代码最早的版本 -
@param
:方法的参数 -
@return
:方法的返回 -
@throws
:异常抛出 -
@deprecated
:过时
2.8.5 编码风格
类名:首字母大写、多个字母驼峰法
域名&方法名:首字母小写、多个字母驼峰法