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


上一篇:类和对象之句柄、作用域

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

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

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

  1. 类型为 Dog 的一个对象首次创建时,或者 Dog 类的static 方法/static 字段首次访问时,Java 解释器 必须找到Dog.class(在事先设好的类路径里搜索)。
  2. 找到Dog.class 后(它会创建一个 Class 对象),它的所有 static 初始化模块都会运 行。因此,static 初始化仅发生一次——在 Class 对象首次载入的时候。
  3. 创建一个new Dog()时,Dog 对象的构建进程首先会在内存堆(Heap)里为一个 Dog 对象分配足够多的存 储空间。
  4. 这种存储空间会清为零,将Dog 中的所有基本类型设为它们的默认值。
  5. 进行字段定义时发生的所有初始化都会执行。
  6. 执行构建器。

明确地进行数据初始化

因为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()。

下一篇:类和对象之组合和继承

优质内容筛选与推荐>>
1、MySQL的索引
2、Hibernate_cascade常用属性
3、员工流失对足浴会所的影响
4、单词统计
5、crazy proj : No 6 - data binding + event handing


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号