- Java编程思想:一切都是对象
- 一、对象创建
- 1.1 数据储存位置
- 1.2 特例:基本数据类型
- 1.3 Java中的数组
- 二、对象销毁
- 2.1 作用域
- 2.2 对象的作用域
- 三、创建新的数据类型:类
- 3.1 字段和方法
- 四、方法、参数和返回值
- 4.1 参数列表
- 五、构建一个Java程序
- 5.1 名字的可见性
- 5.2 运用其他构建
- 5.3 static关键字
- 六、编译和运行
- 七、注释
- 7.1 语法
- 7.2 嵌入式HTML
- 7.3 一些标签示例
- 7.4 文档示例
- 7.5 代码风格
本博客内容大量抄袭主要参考《Java编程思想》。该内容仅供学习研究之用,如若喜欢请购买正品书籍Java编程思想。
- 寄存器:这是最快的存储区,但数量极其有限,所以寄存器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。
- 堆栈:这是一种快速有效的分配存储方法,仅次于寄存器。虽然某些Java数据存储于堆栈中——特别是对象引用,但是Java对象并不存储于其中。
- 堆:一种通用的内存池(也位于RAM区),用于存放所有的Java对象。当需要一个对象时,只需用new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。
- 常量存储:常量值通常直接存放在程序代码内部,这样做是安全的。在嵌入式系统中也可以选择将其存放在ROM(只读存储器)中。
- 非RAM存储:如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是流对象和持久化对象。在流对象中,对象转化成字节流,通常被发送给另一台机器。在“持久化对象”中,对象被存放于磁盘上,因此,即使程序终止,它们仍可以保持自己的状态。
- 这些变量不是引用类型,可以直接存储“值”,并存储在 堆栈 中。
- 所有数值类型都有正负号。
- 高精度计算的类:BigInteger和BigDecimal
- BigInteger支持任意精度的整数。
- BigDecimal支持任何精度的定点数。
| 类型 | 占用存储空间 | 表示数值范围 |
|---|---|---|
| boolean | - | - |
| byte | 1字节=8bit位 | -128 ~ 127 |
| char | 2字节 | Unicode 0 ~ Unicode 2 16 − 1 2^{16} -1 216−1 |
| short | 2字节 | − 2 15 -2^{15} −215 ~ 2 15 − 1 2^{15}-1 215−1 |
| int | 4字节 | − 2 31 -2^{31} −231 ~ 2 31 − 1 2^{31}-1 231−1(约21亿) |
| long | 8字节 | − 2 63 -2^{63} −263 ~ 2 63 − 1 2^{63}-1 263−1 |
| float | 4字节 | -3.403E38 ~ 3.403E38 |
| double | 8字节 | -1.798E308 ~ 1.798E308 |
| void | - | - |
- Java确保数组会被初始化,而且不能在它的范围之外被访问。
- 当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null。一旦Java看到null,就知道这个引用还没有指向某个对象。在使用任何引用前,必须为其指定一个对象;如果试图使用一个还是null的引用,在运行时将会报错。
Java会自动回收对象,因此不需要我们手动销毁对象。
2.1 作用域- 在Java中,作用域由花括号的位置决定。
- 在作用域里定义的变量只可用于作用域结束之前。
Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,它可以存活于作用域之外。
{
String s = new String("a string");
}
引用s在作用域终点就消失了。然而,s指向的String对象仍继续占据内存空间。Java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。
三、创建新的数据类型:类 3.1 字段和方法- 可以在类中设置两种类型的元素:字段(有时被称作数据成员)和方法(有时被称作成员函数)。字段可以是任何类型的对象,可以通过其引用与其进行通信;也可以是基本类型中的一种。如果字段是对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象(如前所述,使用new来实现)相关联。
- 每个对象都有用来存储其字段的空间;普通字段不能在对象间共享。
- 基本成员默认值
基本类型 默认值 boolean false char ‘u0000’(null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d - 当变量作为类的成员使用时,Java才确保给定其默认值,以确保那些是基本类型的成员变量得到初始化
- 上述确保初始化的方法并不适用于“局部”变量(即并非某个类的字段)。
- 方法的基本组成部分包括:名称、参数、返回值和方法体。下面是它最基本的形式:
ReturnType methodName() {
}
- 返回类型描述的是在调用方法之后从方法返回的值。参数列表给出了要传给方法的信息的类型和名称。方法名和参数列表(它们合起来被称为“方法签名”)唯一地标识出某个方法。
- 对象调用方法: objectName.methodName(arg1, arg2, arg3);这种调用方法的行为通常被称为发送消息给对象。
在参数列表中必须指定每个所传递对象的类型及名字。像Java中任何传递对象的场合一样,这里传递的实际上也是引用,并且引用的类型必须正确。
五、构建一个Java程序 5.1 名字的可见性- 为了给一个类库生成不会与其他名字混淆的名字,Java设计者希望程序员反过来使用自己的Internet域名,因为这样可以保证它们肯定是独一无二的。由于我的域名是MindView.net,所以我的各种奇奇怪怪的应用工具类库就被命名为net.mindview.utility.foibles。
- 这种机制意味着所有的文件都能够自动存活于它们自己的名字空间内,而且同一个文件内的每个类都有唯一的标识符
import指示编译器导入一个包,也就是一个类库(在其他语言中,一个库不仅包含类,还可能包括方法和数据;但是Java中所有的代码都必须写在类里)。这样就可以不必写一长串的反转域名。
import java.util.ArrayList;//使用ArrayList类 import java.util.*//使用util包含的众多类5.3 static关键字
- 当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域。
- 通常,你必须创建一个对象,并用它来访问数据或方法。因为非static域和方法必须知道它们一起运作的特定对象。
- 一个static字段对每个类来说都只有一份存储空间,而非static字段则是对每个对象有一个存储空间。下面的代码就生成了一个static字段,并对其进行了初始化:
class StaticTest { static int i = 47; }//即使你创建了两个StaticTest对象,StaticTest.i也只有一份存储空间,这两个对象共享同一个i。 StaticTest st1 = new Statictest(); StaticTest st2 = new Statictest();
- 引用static变量有两种方法。如前例所示,可以通过一个对象去定位它,如st2.i;也可以通过其类名直接引用StaticTest.i++;,而这对于非静态成员则不行。
- 既可以像其他方法一样,通过一个对象来引用某个静态方法,也可以通过特殊的语法形式ClassName.method()加以引用。定义静态方法的方式也与定义静态变量的方式相似:
class Incrementable { static void increment() { staticTest.i++;} } //调用 Incrementable sf = new Incrementble(); sf.increment(); - static方法的一个重要用法就是在不创建任何对象的前提下就可以调用它。正如我们将会看到的那样,这一点对定义main()方法很重要,这个方法是运行一个应用时的入口点。
在HelloDate所在目录下
javac HelloDate.java//编译 java HelloDate//运行七、注释
Java 支持 3 种注释,分别是单行注释、多行注释和文档注释。文档注释以 public class Documentation1{ public int i; public void f() {} }///:~
文档注释中,位于每一行开头的星号和前导空格都会被javadoc丢弃。javadoc会对所有内容重新格式化,使其与标准的文档外观一致。不要在嵌入式HTML中使用标题标签,例如或
,因为javadoc会插入自己的标题,而你的标题可能同它们发生冲突。所有类型的注释文档——类、域和方法——都支持嵌入式HTML。
object/Documentation2.java ///:~7.3 一些标签示例
- @see:引用其他类
@see标签允许用户引用其他类的文档。javadoc会在其生成的HTML文件中,通过@see标签链接到其他文档(javadoc不会检查你所提供的超链接是否有效)。格式如下:
@see classname - {@link package.class#member.label}
该标签与@see极其相似,只是它用于行内,并且是用“label”作为超链接文本而不用“See Also”。 - {@docRoot}
该标签产生到文档根目录的相对路径,用于文档树页面的显式超链接。 - {@inheritDoc}
该标签从当前这个类的最直接的基类中继承相关文档到当前的文档注释中。 - @version
@version version-information
“version-information”可以是任何你认为适合包含在版本说明中的重要信息。如果javadoc命令行使用了“-version”标记,那么就从生成的HTML文档中特别提取出版本信息。 - @author
@author author-information
author-information一看便知是你的姓名,但是也可以包括电子邮件地址或者其他任何适宜的信息。如果javadoc命令行使用了-author标记,那么就从生成的HTML文档中特别提取作者信息。
可以使用多个标签,以便列出所有作者,但是它们必须连续放置。全部作者信息会合并到同一段落,置于生成的HTML中。 - @since
该标签允许你指定程序代码最早使用的版本,可以在HTML Java文档中看到它被用来指定所用的JDK版本的情况。 - @param
@param paramter-name description
该标签用于方法文档中,parameter-name是方法的参数列表中的标识符,description是可延续数行的文本,终止于新的文档标签出现之前。可以使用任意多个这种标签,大约每个参数都有一个这样的标签。 - @return
@return description
“description”用来描述返回值的含义,可以延续数行。 - @throws
- @throws fully-qualified-class-name description
fully-qualified-class-name给出一个异常类的无歧义的名字,而该异常类在别处定义。description(同样可以延续数行)告诉你为什么此特殊类型的异常会在方法调用中出现。 - @Deprecated
该标签用于指出一些旧特性已由改进的新特性所取代,建议用户不要再使用这些旧特性,因为在不久的将来它们很可能会被删除。如果使用一个标记为@Deprecated的方法,则会引起编译器发布警告。
//: object/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());
}
}
///:~
用一个“:”作为特殊记号说明这是包含源文件名的注释行。该行包含文件的路径信息(此时,object代表本章),随后是文件名。最后一行也是一行注释,这个“///:~”标志源代码清单的结束。自此,在通过编译器和执行检查后,文档就可以自动更新成本书的文本。
7.5 代码风格- 标识符(Identifier):Java对各种变量、方法和类等要素命名时使用的字符序列。
- 技巧:凡是可以自主命名的都是标识符。
- 标识符命名规则:
- 由26个英文字母大小写,0-9,_或$组成
- 数字不可以用于开头
- 不可以使用关键字和保留字,但可以包含关键字和保留字
- Java中严格区分大小写,长度无限制
- 标识符不能包含空格。
- Java中的名称命名规范:
- 包名:多单词组成时所有字母小写,xxxyyyzzz
- 类名、接口名:多单词组成时,所有单词的首字母大写,XxxYyyZzz
- 变量名、方法名:多单词组成时,第一个单词首字母小写,从第二个单词开始每个单词首字母大写,xxxYyyZzz
- 常量名:所有字母都大写,多单词时每个单词用下划线连接,XXX_YYY_ZZZ
- 《代码整洁之道》
- 注意事项:
- 命名尽量有意义,“见名知意”
- Java采用Unicode字符集,因此标识符可以使用汉字声明,但不建议使用汉字。



