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中,创建对象实例时,按照如下顺序进行初始化:

  1. 先初始化字段,例如,int age = 10;,表示字段初始化为10String name;,表示引用类型字段默认初始化为null
  2. 执行构造方法的代码进行初始化。
    因此,构造方法的代码由于后运行,所以,字段的值存的是构造方法传过来的值。
  • 多构造方法
    可以根据需求定义多个构造方法,在通过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;
    }
}
posted @ 2020-09-13 15:10  Cherish486  阅读(52)  评论(0编辑  收藏  举报