Java基础------构造器

构造器

在C程序语言中,一部分程序出错的原因是由于程序员忘记初始化一个变量造成的。对于一个现成的库,如果不知道怎么去初始化这个库里的组件,那么当使用这个库里的组件时,就会出错。

所以,在C++程序语言中,引入“构造器”的概念。之后,java中也沿用了这个概念。

所以说构造器最大的作用便是初始化

什么是构造器?

一种特殊的方法,在一个对象创建之后自动调用,用来初始化对象

为什么要使用构造器?

由于java是面向对象的,那么在使用对象之前,肯定也要对这个对象进行初始化,在这点上可以参考上面说的库,而对象中的属性和方法就可以看做是库里的组件。

在Java中,由于提供了名为“构造器”的一种特殊方法,所以类的设计者可担保每个对象都会得到正确的初始化。

因为当一个类有一个构造器时,那么在创建那个类的对象时,java会自动调用那个构造器,所以说,类的设计者可担保。

构造器的命名

因为构造器属于一种特殊的方法,那么也就必须要对构造器进行命名。而针对于构造器的命名,存在着两方面的原因:

  1. 我们使用的任何名字都可能与那个类中的成员变量使用的名字冲突。
  2. 由于编译器的责任是调用构造器,所以它必须知道要调用是哪个方法。

基于这两个原因,java沿用了C++中采取的方案,构造器的名字和类名相同。

关于构造器的相关介绍

  1. 构造器最大的作用是在创建对象后执行初始化对象操作
  2. 被其他方法调用,用以返回该类的实例(该类的类对象)
  3. 通常把构造器设置成public访问权限,从而允许系统中任何位置的类来创建该类的实例
  4. 构造器属于一种较为特殊的方法类型,因为它没有返回值。(与void返回值的区别:对于void返回值,尽管方法本身不会自动返回什么,但仍然可以让它返回另一些东西。构造器则不同,它不仅什么也不会自动返回,而且根本不能有任何选择。)
  5. 构造器中允许存在return语句,但是return什么都不返回,如果你指定了返回值,虽然编译器不会报出任何错误,但是jvm会认为它是一个与构造器同名的函数,这样就会出现一些莫名其妙的无法找到构造器的错误。

构造器特性

  1. java类中,如果一个类没有创建构造器,java编译器就会自动识别,在jvm中为这个类创建一个默认构造器,这个构造器没有参数。当类创建一个构造器时,不管这个构造器是否有参数,JVM就不再为该类创建一个无参的构造器了,为了防止这个类被其他类继承,所以我们要强调,在为类创建构造器时就要创建一个无参的构造器,以防止子类初始化时,调用父类的默认构造器。所以创建的这个无参构造器,也是默认构造器。

  2. 构造器的修饰符比较的有限,仅仅只有public private protected这三个,其他的例如任何修饰符都不能对其使用,也就是说构造器不允许被成名成抽象、同步、静态等等访问限制以外的形式。

构造的粗略过程

  1. 通过new关键字创建对象,并分配少量的地址空间,将对象中成员初始化为0或者空或者指定值,java不允许用户操纵一个不定值的对象。
  2. 执行属性值的显式初始化
  3. 执行构造器
  4. 将变量关联到堆中的对象上

构造器使用中几个注意点

  1. this() :调用当前构造器中的参数或者调用其他构造器
  2. super():调用父类构造器时使用
  3. 在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行

使用构造器进行初始化例子

public class Person {

    // 自定义构造器
    public Person() {
    System.out.println("Creating Person");
    }

    public static void main(String[] args) {

        Person p = new Person();
}

现在,一旦创建一个对象 new Person();就会分配相应的存储空间,并调用构造器。这样可保证在我们经手之前,对象得到正确的初始化。

因为构造器是一种特殊的方法,所以构造器也能使用自变量,以便指定对象的具体创建方式。

自变量构造器初始化例子

public class Person {

    public String name;
    public int age;

    // 自定义构造器
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        // 使用自定义的自变量构造器创建对象(构造器是创建对象的重要途径)
        Person p = new Person("小明", 12);
        System.out.println(p.age);
        System.out.println(p.name);
}

构造器重载

由于构造器属于一种特殊的方法,在重载这个特性上,构造器和普通的方法也一样,都具备重载的特性,参数列表(参数个数,参数类型)不同,即是构造器重载。

当要多次初始化不同数量的对象属性时候就可以使用构造器重载,这样给对象赋值更方便。

构造器重载例子

//程序员可以选择不同数量的对象属性进行初始化操作
public class Person {

    public String name;
    public int age;

    //空的构造器 因为下面自定义构造器 所以系统不提供默认空构造器 
    //如果需要,得自行写一个空的构造器 形成构造器重载(参数列表不同)
    public Person() {
     }

    // 自定义构造器
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        // 使用自定义的构造器创建对象(构造器是创建对象的重要途径)
        Person p = new Person("小明", 12);
        System.out.println(p.age);
        System.out.println(p.name);
}

构造器注意点

构造器是创建java对象的途径,但构造器不是完全负责java对象的创建。

构造器是创建Java对象的重要途径,通过new关键字来调用构造器,构造器也确实返回了该类的对象,但是这个对象并不是完全由构造器来负责创建的。

实际上,当程序调用构造器时,系统会为对象分配内存空间,并为这个对象执行默认初始化,如果这个对象已经产生了,那么这些操作在执行构造器之前就已经都完成了。

所以说,当系统开始构造器的执行体之前,系统已经创建了一个对象,只是这个对象还不能够被程序外界访问,只能在该构造器中通过this来引用。当构造器的执行体结束之后,这个对象作为构造器的返回值被返回通过赋值给另一个引用类型的变量,从而让外部程序访问。

也就是说,通过new关键字创建对象,并调用构造器,通过构造器对对象中的属性和方法进行初始化操作。

猜你喜欢

转载自blog.csdn.net/zxzzxzzxz123/article/details/78321970