类的构造函数
有的类可以有构造函数,有的可以没有构造函数,如果没有构造函数,编译器会自动给类添加一个默认的构造函数,此构造函数什么也做。
默认构造函数是无参的,因为调用它的时候什么也不需要去做,构造函数提供了在创建对象的时候初始化数据。当然还有一种初始化代码块的方法,
初始化代码块在构造函数之前执行。看代码。
public class TTest { public static void main(String[] args) { TPerson person; //初始化代码块和构造函数都没执行 person = new TPerson(); //打印结果 //这里是代码初始块。 //这里是构造函数。 } } class TPerson{ //初始化代码块 static{ //只能初始化静态变量 System.out.println("这里是代码初始块。"); } private double salary; public TPerson(){ System.out.println("这里是构造函数。"); } public void setSalary(double salary) { this.salary = salary; } }
多个构造函数实际学习方法的时候已经知道了,不需要多说,关键是构造函数调用构造函数,使用this()
public class TTest { public static void main(String[] args) { TPerson person = new TPerson("YUE",31,8888.0); System.out.println(person.getName()); } } class TPerson{ private double salary; private String name; private int age; public TPerson(String _name){ name = _name; } public TPerson(String _name,int _age) { this(_name); age = _age; } public TPerson(String _name,int _age,double _salary){ this(_name,_age); salary = _salary; } public String getName() { return name; } public byte getAge() { return age; } public double getSalary() { return salary; } }
使用构造函数复制对象
在实际开发中有时候会遇到创建了一个对象后,另一个对象和第一个创建的对象完全一样,这时就需要复制对象。
假如person是TPerson的一个对象,现在person2要和person一样。
TPerson person = new TPerson("YUE",31,8888.0);
TPerson person2 = person 这样是不能复制的。因为person2没有new,没有new是不会执行构造函数的,所以person初始化的数据在person2中是没有的。和预期的结果不相同。如何复制呢?
代码如下:
public class TTest { public static void main(String[] args) { TPerson person = new TPerson("YUE",31,8888.0); TPerson person2 = new TPerson(person); //这样person和person2完全一样 } } class TPerson{ private double salary; private String name; private int age; //复制对象 public TPerson(final TPerson _person){ salary = _person.salary; name = _person.name; age = _person.age; } public TPerson(String _name){ name = _name; } public TPerson(String _name,int _age) { this(_name); age = _age; } public TPerson(String _name,int _age,double _salary){ this(_name,_age); salary = _salary; } public String getName() { return name; } public byte getAge() { return age; } public double getSalary() { return salary; } }