在编写的每个类中都会定义一个initialize(),会提醒你使用对象前调用initialalize(),创建一个构造器。构造器采用与类相同的名字。如果我们没有给数据成员赋予初始化值,数据成员会更急其类型采用默认初始值(无参构造器)。
显式初始化要求我们在写程序时就确定初始值,这有时很不方便。我们可以使用构造器(constructor)来初始化对象。构造器可以初始化数据成员,还可以规定特定的操作。这些操作会在创建对象时自动执行。
定义构造器
一、构造器是干什么用的?(what)
构造器是用来生成一个类的实例是用来初始化这个实例用的
二、构造器如何工作?(how)
Java在构造实例时的顺序是这样的:
1、分配对象空间,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。
2、执行属性值的显式初始化
3、执行构造器
4 、将变量关联到堆中的对象上
基本特征如下:
1.构造器的名字与类名相同
2.构造器没有返回值
public class Test2 {
public static void main (String[]args){
Bird bird = new Bird(3);
System.out.println(bird.getAge());
}
}
class Bird{
private int age;//成员变量
Bird(int age){
this.age = age;//局部变量
System.out.println("my age is");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
/*out
my age is
3 */
此时构造器整体就放入了main方法中,其中做了2件事
- 把局部变量的值赋予给成员变量 this.age = age ;
- 输出语句 System.out.println("my age is");
构造器是怎么使用的呢?通过创建new Bird(new Bird())的形式,调用Bird构造器。其实Java都会默认提供一个无参构造器,当你定义了构造器,Java会调用定义的构造器,把age初始化为3。
初始化方法的优先级
通过debug测试可以看到其顺序,如果成员变量有值的话,会采用成员变量的值。但是最终经过构造器中,通过构造器获取的局部变量最终对成员变量进行赋值。
public Test{
public static void main (String[]args){
Bird bird = new Bird(3);
System.out.println(bird.getAge());
}
}
class Bird{
private int age = 4;
Bird(int age){ // 先获得3
this.age = age;//经过成员变量获得4,但最终经过构造器获得3
}
public int getAge() {
return age;
}
}
/*
* out
* 3
*/
最终结果是3。
顺序是 构造方法 > 成员变量
通过Thinking in Java中的一段关于初始化顺序,可以自己debug看看顺序
class Window {
Window(int marker) { System.out.println("Window(" + marker + ")"); }
}
class House {
Window w1 = new Window(1); // Before constructor
House() {
// Show that we're in the constructor:
System.out.println("House()");
w3 = new Window(33); // Reinitialize w3
}
Window w2 = new Window(2); // After constructor
void f() { System.out.println("f()"); }
Window w3 = new Window(3); // At end
}
public class OrderOfInitialization {
public static void main(String[] args) {
House h = new House();
h.f(); // Shows that construction is done
}
}
/*
* Window(1)
* Window(2)
* Window(3)
* House()
* Window(33)
* f()
*/
构造器方法重载
一个类中可以定义不止一个构造器,通过方法重载可以构造多个构造器
public Test3{
public static void main(String[]args){
Bird bird = new Bird(3,"bugu");
System.out.println(bird.getAge());
}
}
clas Bird{
private int age;
private String s;
Bird(int age){ //不适用
this.age = age;
}
Bird(int age, String s){
this.age = age;
this.s = s;
System.out.println("Im say "+s);
}
int getHeight()
{
return this.height;
}
public String getS() {
return s;
}
}
/*
* out
* Im say bugu
* 3
*/
上面定义了2个构造器,名字都是Bird。但在new一个新对象时,Java会根据提供的参数选择对应的构造器。
chong
在面试中也会被经常问一道题构造器可以被重写(Override)吗?
答:不能,首先构造器不能被继承,(因为每个类名不同,构造器又和类名相同,所以没法继承)。所以没法重写,
只能重载。