您的位置:首页 > 其它

第五章 初始化与清理

2017-06-18 17:55 274 查看

5.2 方法重载

1.方法名相同,参数类型列表不同。
2.传参时,当传的参数是这个方法参数的子类时,会自动转换类型,如果传入的实际参数大于重载方法声明的形式参数时,就必须进行强制类型的转换,不然编译不通过。
3.不能通过返回值区分重载方法。
注:char略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升为int类型。

5.3 默认构造器

1.不写构造方法,系统默认会自动帮你创建一个无参的默认构造器,当你编写一个有参数的默认构造器时,系统就不自动创建一个默认的构造器。

2.子类继承父类时,如果子类的构造没有显式地调用父类的构造方法,系统会默认自动的调用父类无参的构造函数,如果父类没有无参的构造函数,子类必须要显式super调用。

5.4 this关键字

this表示当前对象的引用。

可以使用this返回当前对象的引用“return this”。

5.4.1 在构造器中调用构造器

public  class Flower{
public Flower(){
System.out.println("我是无参的构造函数");
}
public Flower(int i){
this();
this();//编译不通过,不能调用两个构造函数。
System.out.println("我是有参的构造函数"+i);
this();//编译不通过,必须将构造函数调用置于最起始处。
}
public void printPetalCount(){
this(11);//编译不通过,编译器禁止在其他任何方法中调用构造器。
}

}

5.4.2 static的含义

在static方法内部不能调用非静态方法,在类中置入static方法就可以访问其他static方法和static域。

5.5 清理:终结处理和垃圾回收

垃圾回收期只知道释放那些经由new分配的内存,假定你的对象(并非使用new)获得了一块“特殊”的内存区域,它不知道该如何释放该对象的这块“特殊”内存,为了应对这种情况,java允许在类中定义一个名为finalize()的方法。

1.对象可能不被垃圾回收。
2.垃圾回收并不等于“析构”。

finalize()用途何在

使用finalize()方法一般发生在使用“本地方法”的情况下,本地方法是一种在java中调用非java代码的方式。比如C、C++代码,C或者C++分配内存空间,使用完必须要释放空间(使用free()函数释放空间),不然会造成内存泄漏,而,free()函数是C和C++中的函数,所以需要在finalize()中用本地方法调用它。

垃圾回收时,系统会自动调用finalize方法。

5.6 成员初始化

1.局部变量要为它设置初始值。
2.类的数据成员,系统默认会有一个初始值,可以不为它指定一个初始值。

5.7 构造器初始化

在类的内部,成员变量的初始化在构造器或者其他方法-被调用之前发生。

5.7.2 静态数据的初始化

1.无论创建多少个对象,静态数据都只占用一份存储区域,并且只在第一次调用或者第一次创建对象的时候初始化一次。
2.static关键之不能应用于局部变量。
3.static数据被该类的所有对象共享。

5.7.3 显式的静态初始化

public class Spoon{
static int i;
static{
i=47;
}
}
静态代码块与静态初始化动作一样,这段代码只执行一次(首次生成这个类的一个对象或者首次访问属于哪个类的静态数据成员)。

5.7.4 非静态实例初始化

public class Mug{
private int i;

{
i=2;
}
public Mug(){
System.out.println("构造器初始化");
}
}
与静态代码块初始化相比,少了个static关键字,但每次创建该类的实例对象时,该代码块都会执行一次,并且该实例初始化子句是在构造函数之前执行的(父类的构造器执行再到实例初始化子句执行)。

验证父类的构造器先于实例初始化子句执行

public class Father {
public Father(){
System.out.println("Father构造器初始化~~~~~~~");
}
}


public class Child extends Father {
int i;
{
i=4;
System.out.println("实例子句初始化");

}
public Child(){
System.out.println("Child构造器初始化");

}
}
public class Main {

public static void main(String[] args) {
Child c1=new Child();
System.out.println( c1.i);
Child c2=new Child();
System.out.println( c2.i);

}
}

输出结果:
Father构造器初始化~~~~~~~
实例子句初始化
Child构造器初始化
8
Father构造器初始化~~~~~~~
实例子句初始化
Child构造器初始化
8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: