Java 中的构造方法详细解析

 

本章要讲的是JAVA中的构造方法,构造方法包括默认构造方法和多构造方法。

在上一章节中 Java 面向对象和绑定参数的图文理解 我们知道定义了对象和对应属性,在外部调用赋值的时候,不能忘了调用setName()或者setAge(),否则实例内部的状态就是不正确的。

如何才能避免这个问题?

一、构造方法

创建实例的时候,实际上是通过构造方法来初始化实例的。所以我们可以一次性传入参数。在java中 例如:

public class Hello {
public static void main(String[] args) {
Man man = new Man("mui",12);
System.out.println(man.getName());
System.out.println(man.getAge());
// mui
// 12

}

}

class Man {
private String nameString;
private int age;
public  Man(String nameString, int age) {
this.nameString=nameString;
this.age=age;
}
public String getName() {
return this.nameString;
}
public int getAge() {
return this.age;
}
}

二、默认构造方法

看了上面的例子,为什么在类class的内部,定义的构造方法和类的名称相同?因为构造方法的名称就是类名。构造方法的参数没有限制,在方法内部,也可以编写任意语句。但是,和普通方法相比,构造方法没有返回值(也没有void),调用构造方法,必须用new操作符。

如果类没有定义构造方法,编译器会自动为我们生成一个默认构造方法,它没有参数,也没有执行语句而已。所以你实际new的是【隐形】的构造方法。如果想定义的和默认的构造方法都保留,也是可以的。

这里要注意的是,如果对字段进行初始化,又在构造方法中对字段进行初始化, 在Java中,创建对象实例的时候,字段值最终由构造方法的代码确定。

例如:

class Man{
    public Man() {
    }
}
Man man1 = new Man();
System.out.println(man1.getAge()); // 0

//没有在构造方法中初始化字段时,引用类型的字段默认是null,数值类型的字段用默认值,int类型默认值是0,布尔类型默认值是false。

三、多构造方法

由上面的例子我们可以知道,定义的构造方法可以和默认的构造方法同时存在,在java中,可以定义多个构造方法,在通过new操作符调用的时候,编译器通过构造方法的参数数量、位置和类型自动区分。

而且在java中,构造方法还可以相互嵌套,一个构造方法可以调用其他构造方法,这样做的目的是便于代码复用。调用其他构造方法的语法是this(参数)。调用该构造函数是已经内部已经赋值了的结果。

例如:

public class Hello {
public static void main(String[] args) {
Man man = new Man("mui");
System.out.println(man.getName());
System.out.println(man.getAge());
// luo
// 14


}

}

class Man {
private String nameString;
private int age;
public  Man(String nameString, int age) {
this.nameString=nameString;
this.age=age;
}
public  Man(String nameString) {
this("luo",14);
}
public String getName() {
return this.nameString;
}
public int getAge() {
return this.age;
}
}
本文为博主原创文章,知识共享,开源精神,转载注明出处。