Java--类和对象之初始化和清除

2018-02-05 10:37:56来源:oschina作者:Superheros人点击

分享

类中方法的重载比较简单,只要方法所需的参数不同即可,返回类型可以相同可以不相同。但要注意一种情况:


参数中主类型也有隐式类型转换:


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 的类:

类型为 Dog 的一个对象首次创建时,或者 Dog 类的static 方法/static 字段首次访问时,Java 解释器 必须找到Dog.class(在事先设好的类路径里搜索)。
找到Dog.class 后(它会创建一个 Class 对象),它的所有 static 初始化模块都会运 行。因此,static 初始化仅发生一次——在 Class 对象首次载入的时候。
创建一个new Dog()时,Dog 对象的构建进程首先会在内存堆(Heap)里为一个 Dog 对象分配足够多的存 储空间。
这种存储空间会清为零,将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()。

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台