Java构造器(constructor)

初始化和清除

“初始化”和“清除”是这些安全问题的其中两个。C++为我们引入了“构造器”(构造函数)的概念。这是一种特殊的方法,在一个对象创建之后自动调用。Java 也沿用了这个概念,但新增了自己的“垃圾收集器”,能在资源不再需要的时候自动释放它们。

用构造器初始化

在 Java 中,由于提供了名为“构造器”的一种特殊方法,所以类的设计者可担保每个对象都会得到正确的初始化。若某个类有一个构造器,那么在创建对象时,Java 会自动调用那个构造器——甚至在用户毫不知觉的情况下。

接着的一个问题是如何命名这个方法。存在两方面的问题。第一个是我们使用的任何名字都可能与打算为某 个类成员使用的名字冲突。第二是由于编译器的责任是调用构造器,所以它必须知道要调用是哪个方法。C++采取的方案看来是最简单的,且更有逻辑性,所以也在Java 里得到了应用:构造器的名字与类名相同。这样一来,可保证象这样的一个方法会在初始化期间自动调用。

package com.xu.javaoop;

public class Rock {
    //这是个构造器
    Rock() {
        System.out.println("构造Rock");
    }
}
package com.xu.javaoop;

/**
 * 简单的构造器示例
 */
public class SimpleConstructor {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Rock();
        }
    }
}

输出:

构造器方法过载

构造器也能使用自变量,也能方法重载(过载):

package com.xu.javaoop;

public class Rock {
    //这是个构造器
    Rock() {
        System.out.println("无参数构造");
    }

    Rock(int i) {
        System.out.println("构造Rock" + i);
    }
}
package com.xu.javaoop;

/**
 * 带参数构造器示例以及方法过载
 */
public class SimpleConstructor {
    public static void main(String[] args) {
        //i为奇数调用含参构造器否则调用无参构造器
        for (int i = 0; i < 10; i++) {
            if ((i % 2) == 0) {
                new Rock();
            } else {
                new Rock(i);
            }

        }
    }
}

image-20220114091105260

默认构造器规则

对于下面这一行:

new Bird();

它的作用是新建一个对象,并调用默认构造器——即使尚未明确定义一个象这样的构造器。若没有它,就没

有方法可以调用,无法构造我们的对象。然而,如果已经定义了一个构造器(无论是否有自变量),编译程

序都不会帮我们自动合成一个:

class Bush {

Bush(int i) {}

Bush(double d) {}

}

现在,假若使用下述代码:

new Bush();

编译程序就会报告自己找不到一个相符的构造器。就好象我们没有设置任何构造器,编译程序会说:“你看

来似乎需要一个构造器,所以让我们给你制造一个吧。”但假如我们写了一个构造器,编译程序就会说:

“啊,你已写了一个构造器,所以我知道你想干什么;如果你不放置一个默认的,是由于你打算省略它。”

posted @ 2022-01-14 10:31  奈若何!?  阅读(304)  评论(0)    收藏  举报