初始化与清理

一、构造器

1. 重载

重载根据参数的数量、类型、顺序来区分同名方法,但不能根据返回值来区分。
如两个方法:
void f(){}
int f(){ return 1;}
调用的时候只写了f(),编译器无法确定你想要调用的是哪一个。

2. 构造器

除构造器外,编译器禁止在其他任何方法中调用构造器;

二、 清理:终结处理和垃圾回收

Java虚拟机具有自动垃圾回收机制,在合适的时候,虚拟机会开启一个线程,去清理垃圾对象。

但是,Java里的对象并非总是被垃圾回收的。你会发现,只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。如果程序执行结束,并且垃圾回收器一直都没有释放你创建的任何对象的存储空间,则随着程序的退出,那些资源也会全部交还给操作系统。这个策略是恰当的,因为垃圾回收本身也会有开销,要是不使用它,那就不用支付这部分开销了。

1. finalize()方法

一旦垃圾回收器准备好释放对象占用的存储空间,会首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象的内存。所以要是你打算用该方法,就能在垃圾回收时刻做一些重要的清理工作。我们可能会认为当一个对象中含有其他对象时,而垃圾回收只清空了当前对象的内存,实则不然,垃圾回收会清理该对象所占用的所有内存,那么finalize()方法到底在什么时候使用呢?
而finalize()方法的使用场合很有限——这种情况主要发生在使用“本地方法”时,本地方法是一种在Java中调用非Java方法的方式。在非Java代码中,也许会调用C的malloc()函数系列来分配存储空间,而且除非调用了free()函数,否则存储空间将得不到释放,从而造成内存泄露。当然,free()是C和C++中的函数,所以需要在finalize()中使用本地方法调用它。
finalize()方法还有一个作用,由于程序员的错误,可能一些没有被引用的对象还是有用的或者是不能被回收的。我们可以在finalize()方法在回收之前做一个判断,是否满足被回收的要求,如果不满足回收要求,需要进行异常处理。

2. System.gc()方法

System.gc()用于强制进行终结动作。它提醒虚拟机:程序员希望进行一次垃圾回收,但不能保证垃圾回收一定执行,而且什么时候执行取决于VIM,不同的VIM有不同的对策。

三、初始化顺序

在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,他们仍然会在任何方法(包括构造器)被调用之前得到初始化。

1. 静态数据初始化

静态变量、静态方法、静态代码块:
在创建第一个类对象时,静态数据才会被舒适化。之后,静态对象不会再次被初始化。

2. 可变参数列表
方法的参数为数组时,可以写成可变参数列表的样式:

void f(Object... args){ }
//调用时:
f(47,"one",new A());  //可以任意长度的object对象
f((Obect[]) new Integer[]{1,2,3,4});  //可以是一个数组
f();  //可以为空

//还可以定义这种:
void f(int required,String... trailing){ }

有了可变参数,就再也不用显式地编写数组语法了,当你指定参数时,编译器实际上会为你去填充数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值