1.类之间最常见关系
1)依赖(“use-a”)一个类的方法操作了另一个类的对象
2)聚合(“has-a”)
3)继承(“is-a”)
2.对象变量并不包含对象,它只是指向一个对象。在Java中,任何对象变量的值都是指向存储在别处的对象的一个引用。new运算符的返回值也是一个引用。
3.本地对象变量并不会被自动初始化为null,必须对它们进行初始化:或者通过调用new,或者将它们设为null。
4.所有的Java对象都存储在堆中,当一个对象包含另一个对象变量时,这个变量包含的只是指向堆中另一个对象的指针。
5.Date类用来表示当前的时间点,GregorianCalendar类用我们熟悉的日历符号表示日期,是对更一般的Calendar类的扩展。
6.方法不仅可以访问调用该方法的对象中的私有数据,还可以访问其所在类的所有对象的私有数据。
7.如果一个类的所有字段都是final,那么此类是不可变的,它的对象在被构造之后永远不变。不可变的类有一个重要的优点:它们不会被共享引用。
8.Java语言总是使用传值调用,也即方法得到的只是所有参数值的拷贝,因此方法不能修改传递给它的任何参数变量的内容。
9.对于对象参数来说,方法得到的是对对象引用的一个拷贝,原来的对象变量和这个拷贝所指向的是同一个对象。也即并不向对象使用引用调用,对象引用是通过值来传递的。
10.Java中利用方法参数可以做到和不能做到的几种情况:
1)方法不能修改基本类型的参数
2)方法可以修改对象参数的状态
3)方法不能让对象参数指向新的对象
11.如果在构造器中没有显式给某个字段赋值,那么它会被自动赋为默认值:数字变量为0,布尔变量为false,对象引用为null。
12.如果编写的类没有构造器,系统会提供默认构造器,它会把所有的实例字段设为默认值。如果一个类提供至少一个构造器,但没有提供默认构造器,那么构造没有构造参数的对象是非法的。
13.显式字段初始化:可以在类的定义中简单地把值赋给任何字段,构造器执行之前,赋值会先被执行。当类的所有构造器要把某个特定实例字段赋以相同的值时,这种语法特别有用。初始值未必一定要是常量。
14.调用其他构造器:如果构造器的第一个语句具有形式this(…),那么这个构造器将调用同一类中的其他构造器。
15.初始化块:不管用哪个构造器构造对象,初始化块都首先被运行,然后才是构造器的主题部分被执行。
16.调用构造器后详细的执行过程:
1)初始化所有数据字段为默认值
2)按照在类声明中出现的次序依次执行所有字段初始化语句和初始化块
3)如果构造器的第一行代码调用了另一个构造器,则执行被调用的构造器主体
4)执行构造器主体
17.如果静态字段需要复杂的初始化代码,则可以使用静态初始化块:
static int nextId=1;
static
{
Random ran=new Random();
nextId=ran.nextInt(1000);
}
在类第一次被加载时,会进行静态初始化。
可利用这一点实现不用main方法就写出一个“Hello world”程序:
public class Hello
{
static
{
System.out.println(“Hello,World”);
}
System.exit(0);
}
18.Java使用包把类聚集起来,所有的标准Java包都处于java与javax包层次中(java与javax不是包)。从编译器的角度看,嵌套的包之间没有任何关系,例如包java.util和java.util.jar就是彼此无关的,它们每一个都有自己独立的类集合。
19.import语句应该放在源文件的顶部,但是要在所有package语句下面。
20.只能使用*符号引入一个包。不能使用import java.*或是import java.*.*来引入所有以java为前缀的包。
21.要把类放入包中,必须把包的名字放在源文件顶部,即放在对包中的类进行定义的代码之前。如果在源文件中没有加入package语句,那么源文件中的类将属于默认包,默认包没有包名。包中的文件被放在与完整包名匹配的子目录中。