基本类型重载时会自动将小类型提升到int类型
如下的程序
public class Test
{
public static void main(String args[])
{
Test t = new Test();
t.f1(3); //默认提升为int
t.f1('a');//调用的还是char
t.f1((char)3);//进行了显示的转换,所以会调用char的函数
}
void f1(char x)
{
System.out.println("char");
}
void f1(byte x)
{
System.out.println("byte");
}
void f1(short x)
{
System.out.println("short");
}
void f1(int x)
{
System.out.println("int");
}
void f1(long x)
{
System.out.println("long");
}
}
为什么不能通过返回值来区别重载
如果是通过
int ret = func()的形式来调用的,则编译器知道需要调用返回int的函数
但是如果是没有使用返回值,直接是
func()来调用的那么就无法识别需要调用那个函数。
默认构造器
当用户自己定义了构造函数的时候,编译器将不会提供默认构造函数。
this的两种用法
代表当前对象,当做构造函数来用
另外,由于构造函数必须在其他构造函数第一句来调用,所以一个函数中不能同时调用两个构造函数(总有一个放在第二句的)。
public class Test
{
String s = "member var";
public static void main(String args[])
{
Test t = new Test("TT");
}
Test()
{
System.out.println("constructor");
}
Test(String s)
{
//Test(); 构造函数的调用必须用this
this();
System.out.println(s);
System.out.println(this.s); //this的第二种用法,代表当前对象
// this(); 调用构造函数必须在第一行中调用
}
Test(int third)
{
this();
this("hello"); //由于构造函数必须在其他构造函数中第一句调用,所以不能同时调用两个构造函数
}
void func()
{
//this(); 不能在非构造函数中调用构造函数
}
}
Finalize方法
Java中得finalize方法不等同于C++的析构,只有在内存资源不足的时候才会被执行。另外如果是通过Java的方法正常new出来的对象是不需要在finalize中去释放的。当使用本地方法即C或C++的内存分配的时候,就需要在finalize中释放这些内存。
由于finalize的父类中被定义为protected类型的,所以在定义finalize的时候必须定义为protected的,或者public的。
强制系统进行垃圾回收
System.gc()
关于初始化
函数的局部变量必须在使用前进行初始化。
但是类的成员变量,系统会进行默认初始化。
所以如果要对成员变量进行初始化就直接在定义的时候进行,如果要是在构造函数中进行初始化,则默认的初始化了一次,在构造中又进行了一次就出现了浪费的情况。
之所以在构造函数初始化的原因:并不是所有的构造函数中都会对成员变量进行初始化,在构造之前进行初始化一次能够保证所有的对象在创建时都会被初始化。
如下例子,成员变量的初始化总是出现在构造函数之前。
class Window{
Window(int marker) {
System.out.println("window("+marker+")");
}
}
class House{
Window w1 = new Window(1);
House()
{
System.out.println("House()");
w3 = new Window(33);
}
Window w2 = new Window(2);
void f(){ System.out.println("f()");}
Window w3 = new Window(3); //变量会先于构造函数初始化
}
public class Test{
public static void main(String[] args)
{
House s = new House();
s.f();
}
}
<完>