前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java--类和对象之初始化和清除

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

作者头像
SuperHeroes
发布2018-05-22 16:06:18
6770
发布2018-05-22 16:06:18
举报
文章被收录于专栏:云霄雨霁云霄雨霁

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

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

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

代码语言:javascript
复制
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关键字:

代码语言:javascript
复制
Banana a = new Banana(), b = new Banana();
a.f(1);
b.f(2);

如上代码所示,方法f()是如何判断是哪个对象调用的本方法?实际上内部形式为:

代码语言:javascript
复制
Banana.f(a,1);
Banana.f(b,2);

this 关键字(注意只能在方法内部使用)就是这个隐藏起来的参数, 可为已调用了其方法的那个对象生成相应的句柄。可象对待其他任何对象句柄一样对待这个句柄。Python中将这个参数显式的列了出来,即每个方法第一个参数必须是this参数(python中通常写作self)。

在为一个类写多个构造器时,可以通过this调用已有的构造器来节省代码量:

代码语言:javascript
复制
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中类只能由字段和方法组成,所以下面这种代码会报错:

代码语言:javascript
复制
public class Banana{
    int i;
    i = 10;
    static int j;
    j = 0;
    //其他字段和方法...
}

Java中明确地进行静态初始化和非静态初始化应该如下做:

代码语言:javascript
复制
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()。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档