引入:

          随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一(thinking in java),而初始化和清理正是涉及安全的两个问题。

      我们知道为了初始化变量,c++引入了构造器(constructor)的概念,这个大家都很熟悉,就是在创造对象的时候,自动调用的特殊方法,而java也采用了构造器。在c++中我们创建对象的时候,经常会调用构造器来初始化(有些时候只是一个空的方法,或者很多时候直接省略不写,系统会自动调用默认的构造器)。

      假设我们还不知道构造器,但是为了解决初始化的问题,我们必须要对每个类都创造一个方法来初始化,那么为了让程序员手动的初始化,这个方法就要有提醒的作用,而且不能与其它方法重名,必须让编译器知道该调用哪一个,所以方法名称就很重要(大家都知道,c++采用构造器与类同名的方式,而java也用这个方法,不得不说,c++创始人Bjarne Stroustrup博士真的厉害)。

     接下来我们来看一个带有构造函数的简单类的例子:

class cat{
	cat(){//这就是构造器
	System.out.print("cat ");
	}
}
public class Constructor {
	public static void main(String []args) {
		for(int i=0;i<10;i++)
		{
			new cat();
		}
	}
}

     输出:cat cat cat cat cat cat cat cat cat cat  

     创造对象时:new cat(),将会为对象分配存储空间,并调用相应的构造器。这里是我们手动的创造了构造器,现在就让我们来了解一下默认构造器(即无参构造器),它的作用就是创造一个默认对象,如果你写的类中没有构造器,编译器就会自动的帮你创建一个默认构造器。例如:

class cat{}
public class Constructor {
	public static void main(String []args) {
		cat c = new cat();
	}
}

      表达式new cat()创造了一个新对象,并且编译器自动的调用了默认构造器——即使你没用明确的定义它。但是如果你已经定义了构造器,编译器就不会帮你自动的调用了。例如:

class cat{
	cat(int i){}
	cat(double i){}
}
public class Constructor {
	public static void main(String []args) {
		cat c1 = new cat(1);
		cat c2 = new cat(1.0);
		cat c3 = new cat(); //试图调用默认构造器,错误的
	}
}

     上面的列子中,类里面已经定义了两个构造器,所以编译器就会认定你忽略了默认构造器不使用它。上面new cat()就是错误的,编译器会提示:- The constructor cat() is undefined。     

    此时你会发现构造器中有了参数,并且发生了重载(后面会提到的)。这里可以举一个有参数的小例子如下:

class cat{
	cat(int i){
		System.out.print("cat"+i+" ");
	}
}
public class Constructor {
	public static void main(String []args) {
		for(int i=0;i<7;i++)
			new cat(i);
	}
}

    我们在创造对象的时候,也就初始化了对象,所以实际上java中初始化和创建是捆绑在一起的,两者不能分开。也许你还发现了,是的,构造器是没有返回值的,虽然new会返回对象的引用,但是构造器本身没有任何的返回值。

 

总结:

     上面的例子中,隐约的感觉到了重载,是的,构造器肯定要和重载挂钩的,那么接下来就来看看方法重载吧。