构造方法没有返回值,与 void 类型不同,void 方法自身不会返回什么,但仍可以选择让其返回别的东西。构造方法能在方法体内部调用其它的构造方法,但是不允许其它任何方法调用构造方法。
方法的重载基于参数列表的不同,即使是拥有相同的参数,参数的顺序不同也能达到重载的目的(会导致难以维护,最好不要使用该方式)。无法根据返回值进行重载,是因为在调用方法而忽略其返回值的情况下,会令 java 无法判断使用哪个方法。
对于基本类型的重载,如果传入的实际数据小于参数列表中声明的数据类型,会让实际数据类型得以提升;如果传入的实际数据大于参数列表中实际声明的类型,则会让实际数据类型下降。也就是说,传入的数据会被转化为参数列表设定的数据类型(char 类型略有不同,如果无法完全匹配,则直接将其变为 int 类型)。
对于创建了同一个类的多个对象的情况,如果这些对象都调用了同一个方法,为了对调用的对象能进行明确的区分识别,编译器会自动将“所操作对象的引用”作为第一个参数传递给被调用的方法。如类Banana的两个对象a,b,调用方法的语句:a.peel(1);
与b.peel(2);
,实际编译器的处理类似:Banana.peel(a,1);
与Banana.peel(b,2)
(实际开发时不能按这种方式书写)。而如果希望获得对当前对象的引用,则使用 this 关键字。
this 关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。在方法内调用同一个类下的其它方法时,可以直接调用而不添加 this 前缀,因为编译器会自动添加 this 关键字。只有在需要明确指出对当前对象的引用时,才需要手动添加。
static 方法中不能调用非静态方法,但是非静态方法可以调用静态方法。static 方法的主要用途是通过类本身调用,以访问其它静态方法和静态域。
虽然 java 针对对象的回收处理有垃圾回收机制,但是这种机制只能针对由 new 关键字创建出的对象,对于通过其它方式获得内存空间的对象无法处理。所以就有 finalize() 方法的出现。
finalize() 访法主要用于调用本地方法时开辟的空间未被回收的情况。java 只支持 C 与 C++ 两种语言编写的函数作为本地方法(但对于函数内部调用其它语言编写的内容则没有限制,所以相当于支持任何一种语言)。
垃圾回收器可以显著提高对象创建速度,也意味着 java 从堆分配空间的速度,可以与其它语言从堆栈上分配空间的速度媲美。垃圾回收器对对象重新排列,实现了一种高速且有无限空间可供分配的模型。
当需要装载某个类的时候(通常为该类创建第一个对象时),编译器会先找到 .class 文件,然后将其字节码装入内存。此时有两种选择:编译所有代码或者进行惰性评估。
编译所有代码的缺陷是,加载动作散落在整个程序的生命周期内,累计花费时间更长。并且会增加可执行代码的长度(字节码比编译器展开的本地机器码小很多),将产生页面调度进而降低程序速度。
惰性评估是指只有在需要的时候才进行编译,不需被执行的代码不会被编译。 HotSpot中应用了类似的方法,每次编译都会进行优化。所以执行次数越多,速度越快。
可以通过给变量调用方法来进行初始化操作:int i = f(); int f(){return 11;}
;,方法也可以是带参数的(参数必须是初始化完成的):int i = f(); int j = g(i);
此处 i 已经过初始化,所以代码正确;int j = g(i); int i= f();
此处 i 未经过初始化,因此给 j 赋值会报错。
自动初始化是无法被阻止的,将在构造方法被调用之前发生:int i; Counter(){i=7;}
此处 i 先被赋予默认值,然后再赋值为7。
对象的创建过程:
- 因为构造器实际上是静态方法,因此首次创建类对象或静态方法被访问时,解释器需要查找类路径,定位 .class 文件
- 载入 .class 文件,创建 class 对象,执行所有静态初始化动作。也因此静态初始化只有在 class 对象首次加载时进行
- 执行 new 语句创建对象时,首先在堆上为其分配足够的存储空间
- 存储空间清零,此时就自动将对象中所有的基本数据类型设成了默认值
- 执行所有出现于字段定义处的初始化操作
- 执行构造方法
可以直接使用 new 在数组中创建元素:Random r = new Random(47); int[] a = new int[r.nextInt(20)];
,对于数字及字符,数组中自动初始化为0,对于布尔值则初始化为 false。