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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Java中摆脱equals,compareTo和toString

我们都曾在POJO中重写过equals(),compareTo()和toString()方法。但是另有其他能做到职责分离的更好的方法并带来更简洁的代码。阅读这篇...

992
来自专栏博客园

Core官方DI解析(3)-ServiceCallSite.md

上一篇说过在整个DI框架中IServiceProviderEngine是核心,但是如果直接看IServiceProviderEngine派生类其实看不出也没什么...

1001
来自专栏xingoo, 一个梦想做发明家的程序员

Java程序员的日常—— 《编程思想》关于类的使用常识

Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题。世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的...

1866
来自专栏Web 开发

JavaScript的对象引用

在一个函数体内,var变量声明的变量,其作用域只在该函数体内,对于函数体外而言,是不可见的(废话)。

810
来自专栏Java爬坑系列

Java 强引用

不要被这个强字吓到,以为这个引用就很厉害,其实强引用就是程序中使用的一般引用类型。举个简单的栗子:

2322
来自专栏青玉伏案

窥探Swift之需要注意的基本运算符和高级运算符

  之前更新了一段时间有关Swift语言的博客,连续更新了有6、7篇的样子。期间间更新了一些iOS开发中SQLite、CollectionViewControl...

1985
来自专栏余林丰

Java中net.sf.json包关于JSON与对象互转的坑

  在Web开发过程中离不开数据的交互,这就需要规定交互数据的相关格式,以便数据在客户端与服务器之间进行传递。数据的格式通常有2种:1、xml;2、JSON。通...

3595
来自专栏Phoenix的Android之旅

深入分析ClassCastException

ClassCastException时常见,只要两个不同类强转换就会有这种问题,不过下面这种错误不知道见过没

551
来自专栏cmazxiaoma的架构师之路

你应该会的一道多线程笔试题

2823
来自专栏阿杜的世界

【转】Java知识点集锦(1~40)

答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primi...

1062

扫码关注云+社区

领取腾讯云代金券