1,由于构造器的名称必须与类名完全相同,所以“每个方法首字母小写”的编码风格并不适用于构造器。
2,构造器是一种特殊的方法,因为它没有返回值。这与返回值为void明显不同。对于空返回值,尽管方法本身不会自动返回什么,但是仍可选择让他返回别的东西,构造器则不会返回任何东西。
3,对于默认的构造函数,如果没有构造函数,编译器会提供一个默认的构造函数,如果自己定义了构造函数,编译器就不会在提供默认的构造函数。此时如果需要无参的构造函数就需要自己定义。
4,java允许在构造器中调用构造器,可以使用this来完成,这是java与C++不同之处。需要注意的是,尽管可以用this调用一个构造器,但不能调用两个。此外,必须将构造器调用置于最起始处,否则会编译出错;除构造器之外,编译器禁止在任何其他方法中调用构造器。
5,static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来倒是可以。static方法只能调用静态方法或者静态数据成员。
6,java中成员方法的局部变量如果未初始化,java编译器会报错。如果是类的数据成员,编译器会对这些成员进行自动初始化,这个时候会给数据成员赋默认值。这一点在前面的博客记录过。自动初始化在构造函数执行前初始化,无法阻止,先自动初始化,在赋相应的值。
7,java中允许在类定义中对数据成员初始化。这一点在C++中是不允许的。
8,java中初始化的顺序是先静态对象(如果他们尚未因前面的对象创建过程而被初始化),而后是“非静态”对象。java中提供了一种使用{}进行初始化的语法。下面的代码是静态的,非静态的实例也可以使用类似的方法。
public class Spoon{ static int i; static { i = 47; } }9,java中定义数组的时候编译器不允许指定数组的大小,因为这个时候只是定义了一个数组的引用,为了给数组创建相应的存储空间,必须写初始化表达式,一种是new,另一种是直接用{},注意直接使用{}编译器分配的内存也是在堆上和new等价。
所有的数组都有一个固定的成员,可以通过它获知数组内包含了多少元素,但是不能对其修改。这个成员就是length。java创建数组的时候是在运行的时候进行的。
10,java中一切类都直接或者间接的继承于object类。java中不允许创建局部对象,必须都要是new创建。
11,enum的这些枚举值并不会必然的将其自身的取值限制在这个常量集的范围之内,因此它们显得更有风险。在java中,当创建了enum,编译器会自动创建一些有用的特性。例如,它会创建toString()方法,以便你可以很方便地显示某个enum实例的名字,编译器还会创建oridinal()方法,用来表示某个特定enum常量的声明顺序,以及static values()方法,用来按照enum常量的声明顺序,产生由这些常量构成的数组。
12,java有垃圾回收器负责回收无用对象占据的内存资源。但是也存在特殊情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收只知道放那些经由new分配的内存,所以她不知道该如何释放该对象的这块“特殊”内存。java允许在类中定义一个名为finalize()的方法。它的工作原理:在垃圾回收器准备回收一个对象时,会先调用这个对象中的finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用内存。需要注意的是垃圾回收不等于析构,java中的对象可能不被垃圾回收。
垃圾回收只与内存有关。 之所以要有finalize(),是由于在分配内存时可能采用了类似C语言的做法,而非java中的通用做法。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在java中调用非java代码的方式,目前只支持C和C++,但是他们又可以调用其他语言代码,如果在C语言中调用了malloc,这个时候就可能会在finalize函数中通过本地方法调用free。
因为垃圾回收器的存在,使得java从堆上分配空间的速度可以和其他语言从堆栈上分配空间的速度相媲美。