本文是《Java学习指南》原书的网络版,作者邵发,拥有本书的全部权利。相关视频课程在此查看。
目录
第10章 对象的创建与销毁
10.1 构造方法
本章引入一种特殊的方法:构造方法。
在前面几章的练习中,当要初始化一个类的时,我们是这么做的。先定义一个类Student,
public class Student
{
public String id;
public String name;
public boolean sex;
}
然后创建对象,并初始化各个属性的值,
Student s = new Student();
s.id = "20180001";
s.name = "邵发";
s.sex = true;
下面,我们引入一个新的方式,可以创建对象的同时对属性的值做初始化。
10.1.1 添加构造方法
构造方法和普通方法类型,例如,
public class Student
{
public String id;
public String name;
public boolean sex;
// 添加一个构造方法
public Student(String id,String name,boolean sex)
{
this.id = id;
this.name = name;
this.sex = sex;
}
}
在这里,添加了一个构造方法,其形式上基本和普通方法一样,但有以下区别:
(1) 构造方法的名字,必须和类名相同
(2) 构造方法不能加返回值,即使是void也不能加
如果一个方法符合上述两条特征,那么就称它为构造方法。
10.1.2 构造方法的作用
构造方法用于对象的初始化,在new出对象的时候会调用它。
例如,
Student s = new Student("20180001", "邵发", true);
这样,在创建Student对象时,同时传入了这3个参数。这些参数会传递到构造方法里。
10.1.3 构造方法的重载
一个类可以加多个构造方法,只要参数列表不同就没问题。这称为构造方法的重载。
例如,
public class Student
{
public String id;
public String name;
public boolean sex;
public Student(String name)
{
this.id = "0000";
this.name = name;
}
public Student(String id,String name,boolean sex)
{
this.id = id;
this.name = name;
this.sex = sex;
}
}
这样就是重载了2个构造方法,第一个的参数列表为(String),第二个参数列表为(String, String, boolean)。
在创建对象时,可以有2种选择,
Student s1= new Student("小李");
Student s2 = new Student("20180001", "邵发", true);
显然,由参数列表不同,在执行时它们会对应上不同的构造方法。
10.1.4 默认构造方法
如果有一个构造方法没有带参数,则称为默认构造方法。或者也可以直接叫无参构造方法。
比如,
public class Student
{
public String id;
public String name;
public boolean sex;
public Student()
{
this.id = "0000";
this.name = "无名";
this.sex = true;
}
}
在此例中,有一个构造方法没有带参数,所以称为默认构造方法。
现在有一个问题:如果一个类里没有添加任何构造方法,那么这种情况怎么解释呢?这种情况下,编译器会自动生成一个空的默认构造方法。
10.1.5 构造方法的访问控制
一般情况下,构造方法应该用public修改,但在某些特殊情况下(比如单例设计)也可以用private。例如,
public class Example
{
private int number = 10;
private Example() // 构造方法是private的!
{
}
}
像这种用private的构造方法也是可以的,但并不常见。初学者了解即可,不必掌握。
10.2 对象的销毁
在Java语言,程序员只管创建对象,不管销毁对象。对象的销毁由系统自动完成的。比如,使用new可以创建一个对象,
Student stu = new Student();
创建完了,就使用它即可。当对象不再被使用时,会由Java的垃圾回收机制自动回收。( 注:垃圾回收,简称GC,Garbage Collection ) 。
那么,什么情况下对象是“不再被使用呢”?准确地讲,指的是当一个对象失去引用的时候。在第五章和第六章中已经介绍过什么叫“失去引用”。例如,
Student stu = new Student();
stu = new Student();
这里就创建了两个对象,但是第一个对象没有人引用它,它就是“失去引用”了,所以它将被GC自动回收。
关于对象的销毁,并不需要我们了解太深,因为它是一个自动的过程。大家只需要对GC这个术语有个印象就够了。