上一篇:类和对象之句柄、作用域
类中方法的重载比较简单,只要方法所需的参数不同即可,返回类型可以相同可以不相同。但要注意一种情况:
参数中主类型也有隐式类型转换:
public class TSD {
// public void test(int a) {
// System.out.println("int");
// }
public void test(double a) {
System.out.println("double");
}
public static void main(String[] args) {
du a = new TSD();
a.test(1);
}
}
上面的代码输出结果是double,即如果实参类型“小于”形参,是可以隐式转换的。如果不注释掉2~4行,则输出结果是int。
this关键字:
Banana a = new Banana(), b = new Banana();
a.f(1);
b.f(2);
如上代码所示,方法f()是如何判断是哪个对象调用的本方法?实际上内部形式为:
Banana.f(a,1);
Banana.f(b,2);
this 关键字(注意只能在方法内部使用)就是这个隐藏起来的参数, 可为已调用了其方法的那个对象生成相应的句柄。可象对待其他任何对象句柄一样对待这个句柄。Python中将这个参数显式的列了出来,即每个方法第一个参数必须是this参数(python中通常写作self)。
在为一个类写多个构造器时,可以通过this调用已有的构造器来节省代码量:
public class Banana{
int a;
Banana(String s){
System.out.println("a banana");
}
Banana(int a,String s){
this.Banana(s);
this.a = a;
System.out.println(a + "bananas");
}
}
总结一下对象的创建过程。考虑一个名为 Dog 的类:
明确地进行数据初始化:
因为Java中类只能由字段和方法组成,所以下面这种代码会报错:
public class Banana{
int i;
i = 10;
static int j;
j = 0;
//其他字段和方法...
}
Java中明确地进行静态初始化和非静态初始化应该如下做:
public class Banana{
int i;
{
i = 10;
}
static int j;
static {
j = 0;
}
//其他字段和方法...
}
对象的清除:
垃圾收集器只知道释放那些由new 分配的内存,假如对象分配了一个“特殊”的区域,垃圾收集器不知道如何释放对象的“特殊”内存。为 解决这个问题,Java 提供了一个名为finalize()的方法,可为我们的类定义它。在理想情况下,它的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用 finalize(),然后在下 一次垃圾收集过程中,才会真正回收对象的内存。所以如果使用finalize(),就可以在垃圾收集期间进行一 些重要的清除或清扫工作。
通常情况下不需要使用finalize()。因为Java对象都是由new创建的。但Java固有地支持C和C++,而C和C++又可以调用其他语言编写的子程序,所以Java能够有效地调用任何东西。比如 C 的 malloc()系列函数,用它分配存储空间。而且除非调用了free(),否则存储空间不会得到释放,从而造成内存“漏洞”的出现。如果C代码中忘记free(), 这时我们可以在 finalize()内部的一个固有方法中调用free()。
下一篇:类和对象之组合和继承