在C++中引入了构造器的概念,这是一个在创建对象时被自动调用的特殊方法,JAVA中也采用了构造器,并额外提供了垃圾回收器,对于不再使用的的内存资源,垃圾回收器能自动将其释放。
- 用构造器确保初始化
在JAVA中,通过提供构造器,类的设计则可以确保每个对象都会得到初始化,创建对象时,如果其类具有构造器,JAVA就会在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行。
问题是如何命名这个方法,有两个问题,第一 :所取的任何名字都可能与类的某个成员名称想冲突,第二:调用构造器是编译器的责任,所以必须让编译器知道应该调用那个方法。在JAVA中采用了C++中的方法,即构造器采用与类相同的名称,考虑到初始化期间要自动调用构造器,这种做法就顺利成章了。
现在,在创建对象时
New Rock();将会为对象分配存储空间,并调用相应的构造器,这就确保了在你能操作对象之前,它已经被恰当的初始化。
不接受任何参数的构造器叫做默认构造器,JAVA文档中通常使用术语无参构造器,同时构造器也能带参数。
如果Tree(int)是Tree类中唯一的构造器,那么编译器将不会允许你以其他任何方式创建Tree对象。
构造器是一种特殊类型的方法,并使代码更易于阅读,这与返回值为空(void)明显不同,对于空返回值,尽管方法本身不会自动返回什么,但仍可选择让它返回别的东西,构造器则不会反悔任何东西,你别无选择(new 表达式确实返回了对新建对象的引用,但构造器并没有任何返回值)。假如构造器具有返回值,并且允许人们自行选择返回类型,那么势必得让编译器知道该如何处理此返回值。
(构造器的作用是用于对象的初始化,即给对象传递参数,故没有返回值)
- 方法重载
假如你要创建一个类,即可以用标准方式进行初始化,也可以从文件中读取信息来初始化,这就需要两个构造器,一个默认构造器,另一个取字符串作为形式参数------该初始化表示初始化对象所需的文件名称,为了让方法名相同,而形式参数不同的构造器同时存在,必须用到方法重载。
2.1 区分重载的方法
要是有几个方法有相同的名称,JAVA如何才能知道你指的是哪一个,其实规则很简单:每个重载的方法具有一个独一无二的参数列表。
2.2 涉及基本类型的重载
如果传入的数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升。
如果传入的实际参数类型较大,就得通过参数类型转换来执行窄化转换,如果不这样做,编译器会报错。
- 默认构造器
默认构造器有名无参构造器,它的作用是创造一个默认对象,如果你写的类中没有构造器,则编译器会自动帮你创建一个默认的构造器。但是你如果定义了一个构造器,编译器就不会帮你自动创建默认构造器。
- This关键字
4.1 This关键字只能在方法内部使用,表示对”调用方法的那个对象”的引用,this的用法和其他对象引用并无不同,但是注意,如果在方法内部调用同一个类的另一个方法,就不必使用。
只有当需要明确指出对当前对象的引用时,才需要使用this关键字。例如:当需要返回对当前对象的引用时,就常常在return语句中这样写
Public class Leaf {
Int i=0
Leaf increment(){
I++;
Return this;
}
}
创建Leaf对象时,调用increment()方法时,返回的是Leaf对象的引用。
4.2 不仅如此,this关键字对于将当前独享传递给其他方法也很有用。
例如:class A ple{
Apple getPeeled(){
Return Peeler.peel(this);
}
}
在此处,this相当于引入Apple对象引用
4.3 在构造器中调用构造器
可能为一个类写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以避免重复代码,可用this关键字做到这一点。
通常写this的时候,都是指“这个对象”或者“当前对象”,而且它本身表示对当前对象的引用,在构造器中,如果为this添加了参数列表,那么就有了不同的意义,这将产生对符合此参数的数列表的某个构造器的明确调用。
public class Flower {
int PetalCount=0;
String s="initial value";
public Flower(int petals) {
PetalCount = petals;
System.out.println("Constructor w / int arg only.PetalCount="+PetalCount);
}
public Flower(String ss) {
s = ss;
System.out.println("Constructor w / String arg only.s="+ss);
}
public Flower(int petals, String ss) {
this(petals);
PetalCount = petals;
this.s = ss;
}
public Flower() {
this(47,"hello");
System.out.println("default constructor (no args)");
}
void pringPetalCount(){
System.out.println("PetalCount=="+PetalCount+"s=="+s);
}
public static void main(String[] args) {
Flower f = new Flower();
f.pringPetalCount();
}
}
输出结果:
Constructor w / int arg only.PetalCount=47
default constructor (no args)
PetalCount==47s==hello
构造器表名,尽管可以用this调用一个构造器,但却不能调用两个,此外,必须将构造器置于最起始处,否则编译会发生错误。
除构造器之外,编译器禁止在其他任何方法中调用构造器,如果在其他方法中调用构造器,会报错。