4.3.4 从构造器开始

下面先看看Employee类的构造器:

  
  
  
  
  1. public Employee(String n, double s, int year, int month, int day) 
  2.     name = n; 
  3.     salary = s; 
  4.     GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); 
  5.     hireDay = calendar.getTime(); 

已经看到,构造器与类同名。在构造Employee类的对象时,构造器被运行,以便将实例域初始化为所希望的状态。

例如,当使用下面这条代码创建Employee类实例时:

  
  
  
  
  1. new Employee("James Bond"100000195011); 

将会把实例域设置为:

  
  
  
  
  1. name = "James Bond"
  2. salary = 100000
  3. hireDay = January, 11950;  

构造器域其他的方法有一个重要的不同。构造器总是伴随着new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。例如:

  
  
  
  
  1. james.Employee("James Bond"250000195011);    //ERROR 

将产生编译错误。

本章稍后,还会更加详细地介绍有关构造器的内容。现在只需要记住:

  • 构造器与类同名
  • 每个可以有一个以上的构造器
  • 构造器可以有0个、1个和1个以上的参数
  • 构造器没有返回值
  • 构造器总是伴随着new操作一起调用

C++注释:Java构造器的工作方式与C++一样。但是,要记住所有的Java对象都是在堆中构造的,构造器总是伴随着new操作符一起使用。C++程序员最易犯的错误就是忘记new操作符:

  
  
  
  
  1. Employee number007("James Bond", 100000, 1950, 1, 1);    //C++, not Java 

这条语句在C++中能够正常运行,但在Java中却不行。

警告:请注意,不要在构造器中定义与实例域重名的局部变量。例如,下面的构造器将无法设置salary。

  
  
  
  
  1. public Employee(String n, double s, ...) 
  2.     String name = n;   //ERROR 
  3.     double salary = s;    //ERROR 
  4.     . . . 

这个构造器声明了局部变量name和salary。这些变量只能在构造器内部访问。这些变量屏蔽了同名的实例域。有些程序设计者(例如,本书的作者)常常不假思索地写出这类代码,因为他们习惯于增加这类数据类型。这种错误很难被检查出来,因此,必须注意在所有的方法中不要命名与实例域同名的变量。

你可能感兴趣的:(Java核心技术I)