构造方法

1.构造方法是什么?

你有没有想过,为什么我们实例化对象的时候要new 类名()呢?
类中除了main方法和我们自定义的方法,还有一种特殊的方法:构造方法,也被称为构造器,它就是那个类名()。

构造方法是类中一种特殊的方法,它是一个与类同名的方法,并且没有返回值,参数可有可无。

语法:[4个权限修饰符] 类名([参数]){

​ 类体;

}

例:

package com.dh.oop;

public class ConstructorDemo {

    //构造方法
   public ConstructorDemo(){

    }
}

2.构造方法的作用

对象的创建是通过构造方法来实现的,其主要功能是完成对象的初始化,当类实例化对象时,会自动的调用构造方法。

说到这里,可能有人就纳闷了,我们在上篇博客中,明明没有书写构造方法,但还是new对象了呀,这是怎么回事呢?

我们来实验一下:去掉上述的构造方法,并且在main方法中实例化一个对象

package com.dh.oop;

public class ConstructorDemo {

    //不书写构造方法

    public static void main(String[] args) {

        //实例化一个对象
        ConstructorDemo cd = new ConstructorDemo();

    }
}

运行是可以成功的,只不过我们只实例化了一个对象,没有其它操作,所以控制台没有内容输出。

所以这是不是我们弄错了构造方法的作用?并不是的,先别急,我们去看看该类的字节码文件。

扩展:如何在IDEA中查看class文件

我们查看一下该class文件:

可以看到,居然有一个构造方法!

所以,当我们不书写构造方法时,编译器会默认给我们提供一个无参的公有的构造方法。

3.构造方法的重载

既然系统已经给我们提供了默认的构造方法,那我们是不是不需要自己再书写构造方法了呢?并不是的,如果我们需要在构造方法里就初始化成员变量,这时候系统提供的默认的构造方法就做不到了,就需要我们自己书写一个我们需要的构造方法。

我们自己写一个带有参数的构造方法看看:

package com.dh.oop;

public class Person {

    public String name;
    public int age;

    public Person(String name,int age){
        
        //左边使用this来代表成员变量(下篇文章会说this的用法)
        //右边的变量为构造方法的形式参数
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        
        //传递构造方法所需要的实参,实例化一个对象
        Person person = new Person("Tom",3);
        System.out.println(person.name+"\t"+person.age);
    }
}

此时我们也去查看一下Person类的字节码文件:

可以看到,只剩下我们自己书写的有参构造方法了。

这是因为,当我们自己书写了构造方法时,编译器就不再提供构造方法了。

那我们还想要一个无参的构造方法呢?就需要我们自己去书写了,构造方法也和别的方法一样,支持重载。

package com.dh.oop;

public class Person {

    public String name;
    public int age;

    //无参构造方法(建议自己写了非无参构造的构造方法后,也随便书写无参构造)
    public Person(){

    }

    //有参构造方法
    public Person(String name,int age){

        //左边使用this来代表成员变量
        //右边的变量为构造方法的形式参数
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        
        //有参构造实例化对象
        Person person = new Person("Tom",3);
        System.out.println(person.name+"\t"+person.age);
        
        //无参构造实例化对象
        Person person1 = new Person();
        //可以看到,无参构造实例化对象初始化会比有参构造麻烦,但是有的时候我们就需要无参构造
        person1.name = "jerry";
        person1.age = 2;
        System.out.println(person1.name+"\t"+person1.age);
    }
}


构造方法很重要~

注意点总结:

构造器的方法必须与类同名;

构造器只能用四个权限修饰符修饰,不能用static等其它修饰符修饰;

构造器没有返回值,不是返回值为空,不能加void;

当我们不书写构造方法时,系统会默认提供一个无参的构造方法;

当我们书写构造方法时,系统将不再提供构造方法;


本人水平有限,若有错误,望指出。

posted @ 2021-01-19 08:22  deng-hui  阅读(4524)  评论(0编辑  收藏  举报