深入构造器(1):使用构造器执行初始化

前言:构造器是一个特殊的方法,它主要的作用是在实例化对象的时候,进行对象初始化。构造器是创建对象的重要途径(即使使用工厂模式、反射等方式创建对象,其实质依然是依赖于构造器),因此, Java 类必须包含—个或一个以上的构造器。
篇2:构造器的重载与相互调用


1、构造器的作用

​ 构造器最大的用处就是在创建对象时执行初始化。前言中已经介绍过了,当创建一个对象时,系统为这个对象的实例变量进行默认初始化,这种默认的初始化把所有基本类型的实例变最设为默认值,如下表所示:

数据类型默认初始化
byte、short、int、long0
float、double0.0
char一个空字符(空格),即 ’\u0000’
booleanfalse
引用数据类型null,表示变量不引用任何对象

​ 通过构造器就可以改变这种默认的初始化,在系统创建对象时就为该对象的实例变量显式指定初始值。

2、构造器的使用

2.1、自定义构造器

​ 下面类提供了一个自定义的构造器,通过这个构造器就可以让程序员进行自定义的初始化操作。

(1)代码表示
public class ConstructorTest {
    public String name;
    public int count;

    /**
     * 提供自定义的构造器,该构造器包含两个参数,提供了自定义构造器,则不会再提高无参构造器了。
     * @param name
     * @param count
     */
    public ConstructorTest(String name, int count) {
        // 构造器里的 this 代表它进行初始化的对象
        // 下两行代码将转入的 2 个参数赋给 this 所代表对象的 name 和 count 实例变量
        this.name = name;
        this.count = count;
    }

    /**
     * main 方法
     * @param args
     */
    public static void main(String[] args) {
        // 使用自定义的构造器来创建对象,系统会对该对象进行自定义的初始化
        ConstructorTest corn = new ConstructorTest("玉米", 100);

        //输出两个实例变量
        System.out.println("农作物的名称:" + corn.name);
        System.out.println("农作物的数量:" + corn.count);
    }
}
(2)运行结果
农作物的名称:玉米
农作物的数量:100

3、知识补充

3.1、关于系统提供无参构造问题
  • 程序员没有为 Java 类提供任何构造器:系统会为这个类提供一个无参数的构造器,这个构造器的执行体为空,不做任何事情。无论如何,Java 类至少包含一个构造器。
  • 程序员提供了自定义的构造器:系统就不再捉供默认的构造器,因此上面的 ConstructorTest 类不能再通过 new ConstructorTest(); 代码来创建实例,因为该类不再包含无参数的构造器。如果用户希望该类保留无参数的构造器,或者希望有多个初始化过程,则可以为该类提供多个构造器。如果一个类里提供了多个构造器,就形成了构造器的重载(这个知识点下篇讲)。
3.2、关于构造器权限修饰符问题

​ 因为构造器主要用于被其他方法调用(构造器可以调用器,后面会讲的哦~~~_~~~),用以返回该类的实例,因而通常把构造器设置成 public 访问权限,从而允许系统中任何位置的类来创建该类的对象。除非在一些极端的情况下,业务需要限制创建该类的对象,可以把构造器设置成其他访问权限。例如:

  • 设置为 protected:主要用于被其子类调用。
  • 设置为 private:可以阻止其他类创建该类的实例(这点其实可以体现 static 关键字的好处,直接类调用方法 ~(~ ̄▽ ̄)~,下次分析!)。
3.3、构造器是创建 Java 对象的途径,是不是说构造器完全负责创建 Java 对象?

​ 不是!构造器是创建 Java 对象的重要途径,通过 new 关键字调用构造器时,构造器也确实返回了该类的对象,但这个对象并不是完全由构造器负责创建的。实际上,当程序员调用构造器时,系统会先为该对象分配内存空间,并为这个对象执行默认初始化,这个对象已经产生了( 这些操作在构造器的执行之前就都完成了。也就是说,当系统开始执行构造器的执行体之前,系统已经创建了一个对象,只是这个对象还不能被外部程序访问,只能在该构造器中通过 this 来引用)。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值