JAVA编程思想学习笔记(四)初始化与清理

初始化与清理

用构造器确保初始化

JAVA采用和C++相同的方案,即构造器采用与类相同的名称,在创建对象时,将会为对象分配存储空间,并调用同名的构造器,达到确保初始化的目的。
构造器是一种特殊的方法,它是没有返回值的,与返回值为空(void)不同。
另外,如果自己没有实现构造器,就会调用默认构造器,但是,如果你创建了构造器,比如:

class A{
	A(int a){}
}
public class Test{
	public static void main(String[] args){
		A a = new A();
	}
}

这就是错误的,因为你已经有了构造器,就不会再为你创建那个无参构造器了。

方法重载

方法名相同,用参数类型不同进行区分,也可以用参数顺序不同作为区分,注:这里的顺序不同指的是类型顺序不同,如:function(String s,int i)和function(int i,String s)
基本类型的重载: 基本类型能从一个“较小”的类型自动提升到一个较大的类型,涉及到重载,可能会引起混乱。
但是对于char略有不同,在无法找到接收char参数的方法时,会直接提升到int型而不是经过byte, short再到int。
如果接受的较小的参数,而要传的是较大的参数,那么,就要通过类型转换来执行窄化转换
比如:

int x;
function(char(x));

在构造器中使用构造器

在为一个类写了多个构造器,为了避免代码重复,可能会想在一个构造器里调用另一个构造器,这样使用是没有问题的,但是只能使用一个,不能使用多个构造器。如下:

public class A{
	int  x;
	String y;
	A(int x){this.x = x;}
	A(String y){this.y=y;}
	A(int x,String y){
		A(x);
		//A(y);//只能和A(x)存在一个,不能两个一起用
		this.y=y;
	}
}

只能这么使用,而不能调用两个构造器.另外构造器必须在最起始处,否则会报错。

垃圾回收

在类中允许调用一个名为finalize()的方法,它是在垃圾回收器准备好释放对象占用的空间时,将首先调用finalize方法。并且在下一次垃圾回收动作发生时,才会真正回收对象空间。
需要注意,finalize不等于C++里面的析构函数。
对于垃圾回收要记住三点:

  1. 对象可能不被垃圾回收
  2. 垃圾回收并不等于析构
  3. 垃圾回收只与内存有关

finalize一般用在调用本地方法(非java代码)的时候。因为在本地的方法中,可能会有malloc这种申请内存空间的,不是对象,垃圾回收器无法回收,只能在finalize中写方法释放。

垃圾回收器机制

  1. 标记-清扫:
    遍历所有引用,找出所有存活的对象,每当找到一个就给其进行标记,这个过程不会回收任何对象,标记全部完成,清理动作才开始,清理过程不会发生复制,剩下的堆空间也不是连续的。进入稳定状态后用。
  2. 停止-复制:
    垃圾回收动作不会在后台运行,垃圾回收发生的时候,程序会被暂停,然后将当前所有存活的对象从当前堆复制到另一堆,没有被复制的全是垃圾,复制到新堆后保持紧凑排列。一般状态用。

初始化

对象的创建过程假设有个名为Dog的类

  1. 当首次创建Dog类型时,或者Dog类的静态方法/静态域被访问时,java解释器必须查找类路径,以定位Dog.class文件
  2. 然后载入Dog.class文件,有关静态初始化的所有动作都会被执行。因此,静态初始化只在类被加载的时候执行一次。
  3. 当用new Dog()创建对象时,首先为其分配足够的空间。
  4. 这块存储空间会被清零,这样就自动的为对象中的所有基本类型数据都设置成了默认值,而引用则被设置成了null
  5. 执行所有出现于字段定义处的初始化动作。
  6. 执行构造器。

静态与非静态实例初始化

首先看下面这段代码,就是非静态实例的初始化:

class A{
	A(int i){
		System.out.println("a:"+i);
	}
}

class As{
	static A a1;
	static A a2;
	 {
		a1=new A(1);
		a2=new A(2);
	}
	As(){
		System.out.println("end");
	}
}
public class ChuShiHua {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		As as1= new As();
		As as2= new As();
	}

}

在看这段静态实例的初始化:

class A{
	A(int i){
		System.out.println("a:"+i);
	}
}

class As{
	static A a1;
	static A a2;
	static{
		a1=new A(1);
		a2=new A(2);
	}
	As(){
		System.out.println("end");
	}
}
public class ChuShiHua {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		As as1= new As();
		As as2= new As();
	}

}

区别只有一个,就是个static关键字的事,但是输出却完全不一样。
非静态输出为:

a:1
a:2
end
a:1
a:2
end

静态输出为:

a:1
a:2
end
end

其原因就是静态只在类被加载的时候执行一次。

数组初始化

数组可以用new来初始化空间,即使是基本类型也可以。可以看如下代码:

public class ArrayNew {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a;
		a=new int[10];
		System.out.println(a.length);
	}

}
输出:
10

猜你喜欢

转载自blog.csdn.net/qq4131533523/article/details/84308055