重载:方法名相同,参数列表不同(参数类型、个数、顺序)。
以基本类型参数重载方法时,会优先调用该类型的参数的方式,如果没有找到相同类型时,则提升最近的参数类型。
this(type x)用来在构造函数中调用其他构造函数,也只能用于构造函数中,并且只能用在第一行。
如果你的对象(并非使用new)获得了一块“特殊”的内存区域中,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存。
finalize():该方法并不是用来释放由Java程序本身分配的空间,因为它有可能不被调用,由Java程序本身分配的空间会由JVM在适当的时机释放,有可能不调用,分配的空间直到程序运行完时一次性还给操作系统,那其作用是什么呢?由于在分配内存时可能采用了类似C语言中的做法,而非Java中的通常做法。这种情况主要发生在使用“本地方法”的情况下,在非Java代码中,也许会调用C的malloc()函数系列来分配存储空间,而且除非调用了free()函数,否则存储空间将得不到释放,从而造成内存泄露。当然free()是C与C++中的函数,所以需要在finalize()中用本地方法来调用它。
C++中在堆栈中创建的对象相当于局部对象(Java是不可以在栈上创建对象的),会在方法调用完毕时自动销毁对象。但如果是采用的new方式创建的对象(类似Java),那么程序员调用C++的delete操作符时(Java中没有该命令),就会调用相应的析构函数。如果没有调用delete,那么就不会调用析构函数,这样就会引起内存泄露。
可变参数
如果有多个参数,则可变参数只能放在最后,否则编译不能通过。
可变参数接收到所有参数时,实质上是一个数组,所以可变参数的所有参数都是同一类型的。
即然是可变的,当然我们也可不输出任何参数。
public static void main(String[] args) {
print("you input:", 1, 2, 3);
//与下面等效,即可变参数也可使用数组进行传递
print("you input:", new int[] { 1, 2, 3 });
}
private static void print(String msg, int... is) {
System.out.print(msg + " ");
for (int i : is) {
System.out.print(i + " ");
}
}
可变参数重载时,有时有问题,如下:
static void f(float i, Character... args) {}
static void f(Character... args) {}
因为在只传一个参数时可能引起模糊,所以这样是不允许的,如果你给这两个方法都添加一个非可变参数,就可以解决问题:
static void f(float i, Character... args) {}
static void f(char c, Character... args) {}