构造方法的特征
- 它具有与类相同的名称;
- 它不含返回值;
-
它不能在方法中用return语句返回一个值
注意:在构造方法里不含返回值的概念是不同于“void”的,在定义构造方法时加了“void”,结果这个方法就不再被自动调用了。
构造方法的作用:
当一个类的实例对象刚产生时,i这个类的构造方法就会被自动调用,我们可以在这个方法中加入要完成初始化工作的代码。
注: 当一个类中没有定义任何构造方法时,系统将自动创建一个空的构造方法(public 类名(){ }),如果我们手动定义了构造方法,则系统就不会为我们创建空构造方法了,这一点要注意
构造方法的重载
-
和一般的方法重载一样,重载的构造方法具有不同个数或不同类型的参数,编译器就可以根据这一点判断出用new 关键字产生对象时,该调用哪个构造方法了。产生对象的格式是:new 类名(参数列表) ;
重载构造方法可以完成不同初始化的操作, 如:p3=new Person(“Tom”,18);语句,会做这样几件事:创建指定类的新实例对象,在堆内存中为实例对象分配内存空间,并调用指定类的构造方法,最后将实例对象的首地址赋值给引用变量p3。
class Person
{
private String name="unknow";
private int age=-1;
public Person(String name,int age)
{
this.name=name;
this.age=age;
}
}
p3=new Person(“Tom”,18) 的内存状态变化过程分析
1、用new产生一个对象后,首先是系统默认初化成员变量的值(如整型为0,字符串为null) ,如下图
2、然后是参数传递,即把p3=new Person(“Tom”,18)里的实参传给构造方法public Person(String name,int age)里的形参
3、然后是成员变量的显示初始化,即执行:private String name="unknow"; private int age=-1;如下图:
4、然后执行构造方法里的语句,即: this.name=name; this.age=age; 如下图:
5、最后把对象的首地址赋值给p1,如下图:
this是什么?
- 如果func2方法被调用 ,一定是事先已经有了一个存在的对象,func2被作为那个对象的方法被使用。
- 在func2内部能引用别的对象 ,同样也能引用func2所属的那个对象。
-
在func2中,自己所属的那个对象的引用名称是什么呢? this关键字在java程序里的作用和它的词义很接近,它在函数内部就是这个函数所属的对象的引用变量。 如下图,在a1.func2()中使用this,则这个this就是对象a1的引用变量,即this变量指向a1对象的首地址0x3000。如下图:
this引用句柄的应用
- 假设我们有一个容器类和一个部件类,在容器类的某个方法中要创建部件类的实例对象,而部件类的构造方法要接收一个代表其所在容器的参数。
-
构造方法是在产生对象时被java系统自动调用的,我们不能在程序中象调用其他方法一样去调用构造方法。但我们可以在一个构造方法里调用其他重载的构造方法,但是不能用构造方法名,而是用this(参数列表)的形式,根据其中的参数列表,系统会自动选择相应的构造方法。如:
class Person
{
int age;
String name;
public Person(String name)
{
this.name=name;
}
public Person(String name,int age)
{
this(name);
this.age=age;
}
}
垃圾回收过程分析
- c++中的析构方法:当一个对象在内存中准备被释放掉时,析构方法就自动被调用,这个析构方法中的代码就得到了执行。有了这个析构方法我们的程序就可以实现每一个对象被释放前都自动完成一些清理方面的事情, 在C++中常用析构方法去释放对象在生成期间所占用的资源
-
java中的finalize()方法
每个类中都有一个finalize方法,这是从object类中继承到的。finalize方法不是对象变成垃圾之前被调用,而是对象变成垃圾且即将要从内存中清除之前被调用, 当一个对象变成垃圾的时候,什么时候会从内存中清除是由垃圾回收器来做的,垃圾回收器的启用不是由程序员控制的,它的启用没有什么规律的。 - 当一个构造方法被调用时,则可知道这个对象是刚刚生产的
- 当一个finalize( )方法被调用时,则可知道这个对象即将要消亡了
- System.gc( ); 作用:强制启动垃圾回收器来回收垃圾
-
gc 是garbage collector的缩写,这个词组的意思为:n.清洁工,清除垃圾的人,垃圾回收器
实例:
class AA
{
public void finalize()
{
System.out.println("对象即将被释放!");
}
public static void main(String args[ ])
{
new AA();
new AA();
new AA();
System.gc();
}
}