Java面向对象基础(2-构造方法)
构造方法
创建实例的同时初始化这个实例的字段。例如:
public class Main {
public static void main(String[] args) {
Person hong = new Person("Hong",14);
System.out.println(hong.getName()); //输出Hong
System.out.println(hong.getAge()); //输出14
}
}
class Person {
private String name;
private int age;
public Person(String name,int age){
this.age=age;
this.name=name;
}
public String getName(){
return this.name;
}
public int getAge(){
return age;
}
}
构造函数的名称就是类名,构造函数的参数牙没有限制,在方法内部也可以编写任意语句。但是,和普通方法相比,构造函数没有返回值(也没有void
),调用构造函数,必须用new
操作符。
- 默认构造方法
所有class
都有构造方法,如果一个类没有定义构造方法,那么编译器会自动为我们生成一个默认构造方法,它没有参数,也没有执行语句,类似这样:
class Person{
public Person(){
}
}
注意:如果我们自定义了一个构造方法,那么编译器就不再
自动创建默认构造方法,例如:
public class Main {
public static void main(String[] args) {
Person hong = new Person(); //编译错误:找不到这个构造方法
}
}
class Person {
private String name;
private int age;
public Person(String name,int age){
this.age=age;
this.name=name;
}
public String getName(){
return this.name;
}
public int getAge(){
return age;
}
}
如果既要能使用带参数的构造方法,又想保留不带参数的构造方法,那么就只能把两个构造方法都定义出来:
public class Main {
public static void main(String[] args) {
Person hong = new Person("Hong",14);
Person ming = new Person();
}
}
class Person {
private String name;
private int age;
public Person(){
}
public Person(String name,int age){
this.age=age;
this.name=name;
}
public String getName(){
return this.name;
}
public int getAge(){
return age;
}
}
- 字段初始值
在没有构造方法中初始化字段时,引用类型的字段默认是null
,数值类型的字段用默认值,int
类型默认值是0
,布尔类型的默认值是false
:
除了使用构造方法对字段进行初始化,还可以对字段直接进行初始化:
class Person{
private String name = "Noname";
private int age=10;
}
那如果既对字段进行初始化,又在构造方法中对字段进行初始化,那最后的字段内存的是什么呢?
在Java中,创建对象实例时,按照如下顺序进行初始化:
- 先初始化字段,例如,
int age = 10;
,表示字段初始化为10
,String name;
,表示引用类型字段默认初始化为null
;- 执行构造方法的代码进行初始化。
因此,构造方法的代码由于后运行,所以,字段的值存的是构造方法传过来的值。
- 多构造方法
可以根据需求定义多个构造方法,在通过new
操作符进行调用时,编译器通过构造方法的参数数量、位置和类型自动匹配相应的构造函数:
public class Main {
public static void main(String[] args) {
Person ming = new Person(); //匹配到Person()构造函数
Person hong = new Person("Hong",14); //匹配到Person(String name,int age)构造函数
Person ming = new Person("Ming"); //匹配到Person(String name)构造函数
}
}
class Person {
private String name;
private int age;
public Person(){
}
public Person(String name){
this.name=name;
}
public Person(String name,int age){
this.age=age;
this.name=name;
}
}
一个构造方法可以调用其他构造方法,这样做的目的是便于代码复用。调用其他构造方法的语法是this(...)
class Person {
private String name;
private int age;
public Person(){
this("aaa"); //调用另一个构造方法Person(String)
}
public Person(String name){
this(name,17); //调用另一个构造方法Person(String ,int)
}
public Person(String name,int age){
this.age=age;
this.name=name;
}
}