关于java对象的构造
java提供多种编写构造器的机制
重载
对于某一个类,可能有多个构造器,这些构造器的名字都一样,java可以通过不同的参数来辨别不同的构造器,这个功能叫做java的重载
如果多个方法出现了相同的名字,不同的参数,便出现了重载,这个时候编译器必须严格挑选出具体调用哪个方法,并进行匹配。如果找不到匹配的参数,便会出现编译错误,这个过程称为重载解析。
默认字段初始化
如果构造器中没有显式的为字段设置初值,那么就会被自动地赋为默认值
数值为0
布尔值为false
对象引用为null
无参数的构造器
无参数的构造器在重载中用到挺多。由无参数构造器创建的对象,对象的状态会设置为适当的默认值。
如果写一个类时没有编写构造器,那么java会自动给你提供一个无参数构造器,这个构造器将会给所有参数设置为初始值。
注意!!!
如果类中至少提供了一个构造器,但是没有提供无参数构造器,那么构造对象时如果没有提供参数那就是不合法的。这个时候程序将产生错误。
如果希望所有字段都设置为默认值,那么有下面的便捷方法:
new ClassName();
public ClassName(){};
调用另一个构造器
如果在一个构造器中调用另外的同类的构造器,这涉及到this的另一种用法。如果在一个构造器的第一行有this(…)表示调用同一个类的另一个构造器,通过this里面的参数进行匹配。
总结
下面是对上面代码的总的应用:
import java.util.*;
/**
* This program demonstrates object construction.
*
* @author Cay Horstmann
* @version 1.02 2018-04-10
*/
public class ConstructorTest {
public static void main(String[] args) {
// fill the staff array with three Employee objects
var staff = new EmployeeFour[3];
staff[0] = new EmployeeFour("Harry", 40000);
staff[1] = new EmployeeFour(60000);
staff[2] = new EmployeeFour();
// print out information about all Employee objects
for (EmployeeFour e : staff)
System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="
+ e.getSalary());
}
}
class EmployeeFour {
private static int nextId;
private int id;
private String name = ""; // instance field initialization
private double salary;
// static initialization block
static {
var generator = new Random();
// set nextId to a random number between 0 and 9999
nextId = generator.nextInt(10000);
}
// object initialization block
{
id = nextId;
nextId++;
}
// three overloaded constructors
public EmployeeFour(String n, double s) {
name = n;
salary = s;
}
public EmployeeFour(double s) {
// calls the Employee(String, double) constructor
this("EmployeeFour #" + nextId, s);
}
// the default constructor
public EmployeeFour() {
// name initialized to ""--see above
// salary not explicitly set--initialized to 0
// id initialized in initialization block
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public int getId() {
return id;
}
}
下面是上面程序的输出:
name=Harry,id=9502,salary=40000.0
name=EmployeeFour #9503,id=9503,salary=60000.0
name=,id=9504,salary=0.0