一、隐式参数和显式参数
隐式参数出现在方法名的前面,比如: number007.raiseSalary(5); number007 就是隐藏对象。
显式参数位于方法名后面的括号中的数值。
二、静态域和静态方法
Java用static修饰的域,就是静态域。
静态域属于类,不属于任何对象。
建议使用类名来调用静态方法,不建议使用对象调用静态方法。因为静态方法属于类,与对象毫无关系。
三、方法的参数
方法的参数有两种类型:①基本数据类型;②对象引用。
一个方法不可能修改一个基本数据类型的参数。但方法可以改变对象参数状态。
方法得到的是对象引用的拷贝,对象引用及其他拷贝同时引用同一个对象。
一个方法不能让对象参数引用一个新的对象。
四、域和局部变量的主要不同点
必须明确地初始化方法中的局部变量。但是,如果没有初始化类中的域,将会被自动初始化为默认值(数值为0、boolean为false 或对象为null)。
包括静态域,没有初始化的时候,会被自动初始化。
五、一个构造器调用另一个构造器
如果构造器的第一个语句形如:this(...), 这样的构造器将调用同一个类的另一个构造器。
六、初始化域的方法
有三种方法对数据域进行初始化:①在构造器中设置值;②在声明中赋值;③在初始化代码块中赋值。
初始化代码块:只要构造函数类的对象,这些块就会被执行。
private static int nextId;
private int id;
{
id= nextId;
nextId ++;
}
调用构造器的具体处理步骤:
1. 所有数据域被初始化为默认值(0,false或null);
2. 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块;
3. 如果构造函数第一行调用了第二个构造器,则执行第二个构造器主题;
4. 执行这个构造器的主体。
如果对静态域的进行初始化的代码比较复杂,那么可以使用静态的初始化块。将一个代码放在一个块中,并标记关键字static。
static{
Random generator = new Random();
nextId = generator.nextInt(10000);
}
类第一次加载的时候:
1. 除非将它们显示地设置成其他值,否则默认的初始化值是0、false或null;
2. 所有的静态初始化语句以及静态初始化块都将依照类定义的顺序执行。
JDK 6 之前,存在bug
七、静态导入
import 语句不仅可以导入类,还增加了导入静态方法和静态域的功能。
这样可以不加类名前缀:
import static java.long.System.*;
....
out.println("Hello world");
exit(0);
八、编译器在编译源文件的时候不检查目录结构
假如一个源文件开头有:package com.mycompany;
即使这个源文件没有在子目录com/mycompany下,也可以进行编译。如果它不依赖其它包,就不会出现编译错误,但是,最终的程序将无法运行,除非先将所有类文件移到正确位置上。如果包与目录不匹配,虚拟机就找不到类。
九、类的导入
一个类可以使用所属包中的所有类,以及其他包中的共有类。也就是说,仅可以导入其他包中的共有类,一个源文件只能包含一个共有类。
十、什么时候需要设置类路径(class path)
类文件可以存储在文件系统的子目录中,也可以存储在JAR文件中。为了让类能够被多个程序共享,需要设置类路径(class path)。
注意:如果没有设置类路径,默认情况下类路径包含“ . ”目录(当前目录)。然而,如果设置了类路径却忘记了包含“ . ”目录,则程序仍然可以编译,但不能运行。
可以设置临时类路径,例如:
java CLASSPATH=c:\classdir;.;c:\archives\archive.jar MyProg
警告:将CLASSPATH环境变量设置为永久不变的值,总的来说这是一个很糟糕的注意。
将所有文件放在jre/lib/ext路径。这是一个极坏的注意。
十一、对象包装器
对象包装器类是不可变的,即一旦够早了包装器,就不允许更改包装在其中的值。
在两个包装器对象比较时调用equals方法。
十二、枚举类
比较两个枚举类型的值时,永远不需要调用equals,而直接使用“==”。
toString 方法,返回枚举常量名。
values 方法,将返回一个包含全部枚举值的数组。
ordinal 方法返回enum声明中枚举常量的位置。