java构造器

构造器:
构造器是一个特殊的方法,用于创建实例时执行初始化。构造器是创建对象的重要途径(即使使用工厂模式、反射等方式创建对象,其实质依然是依赖于构造器),因此Java类必须包含一个或一个以上的构造器。
使用构造器执行初始化
构造器最大的用处就是在创建对象时执行初始化,当创建一个对象时,系统为这个对象的实例变量进行默认初始化,这种默认的初始化把所有基本类型的实例变量设为0(对数值型实 例变量)或false(对布尔型实例变量),把所有引用类型的实例变量设为null。
如果想改变这种默认的初始化,想让系统创建对象时就为该对象的实例变量显式指定初始值,就可以通过构造器来实现。
注意:
如果程序员没有为Java类提供任何构造器,则系统会为这个类 提供一个无参数的构造器,这个构造器的执行体为空,不做任何事情。无论如何,Java类至少包含一个构造器。

学生提问:
构造器是创建Java对象的途径,是不是说构造器完全负责创建Java对象?
答:
不是!构造器是创建Java对象的重要途径,通过new关键字调用 构造器时,构造器也确实返回了该类的对象,但这个对象并不是完全 由构造器负责创建的。实际上,当程序员调用构造器时,系统会先为 该对象分配内存空间,并为这个对象执行默认初始化,这个对象已经 产生了——这些操作在构造器执行之前就都完成了。也就是说,当系统开始执行构造器的执行体之前,系统已经创建了一个对象,只是这个对象还不能被外部程序访问,只能在该构造器中通过this来引用。 当构造器的执行体执行结束后,这个对象作为构造器的返回值被返 回,通常还会赋给另一个引用类型的变量,从而让外部程序可以访问该对象。
一旦程序员提供了自定义的构造器,系统就不再提供默认的构造器 ,因此new
ConstructorTest()不再能创建对象了,因为该类不再包含无参数的构造器了。如果一定要用呢?那就手动将无参构造器写出来!
如果用户希望该类保留无参数的构造器,或者希望有多个初始化过程,则可以为该类提供多个构造器。如果一个类里提供了多个构造器,就形成了构造器的重载。因为构造器主要用于被其他方法调用,用以返回该类的实例,因而通常把构造器设置成public访问权限,从而允许系统中任何位置的类来创建该类的对象。除非在一些极端的情况下,业务需要限制创建 该类的对象,可以把构造器设置成其他访问权限,例如设置为protected,主要用于被其子类调用;把其设置为private,阻止其他类创建该类的实例。
构造器重载和方法重载基本相似:要求构造器的名字相同,这一点无须特别要求,因为构造器必须与类名相同,所以同一个类的所有构造器名肯定相同。为了让系统能区分不同的构造器,多个构造器的参数列表必须不同。

有一种奇葩,叫做构造器之间还有包含关系,脑残,但是也要知道:
对于这种构造器完全包含的情况,如果是两个方法之间存在这种关系,则可在方法B中调用方法A。但构造器不能直接被调用,构造器必须使用new关键字来调用。但一旦使用new关键字来调用构造器,将会导致系统重新创建一个对象。为了在构造器B中调用构造器A中的初始化代码,又不会重新创建一个Java对象,可以使用this关键字来调用相应的构造器。下面代码实现了在一个构造器中直接使用另一个构造器的初始化代码。
在这里插入图片描述
特别注意:
使用this调用另一个重载的构造器只能在构造器中使用,而且必须作为构造器执行体的第一条语句。使用this调用重载的构造器时,系统会根据this后括号里的实参来调用形参列表与之对应的构造器。

学生提问:
为什么要用this来调用另一个重载的构造器?我把另一个构造器里的代码复制、粘贴到这个构造器里不就可以了吗?
答:
如果仅仅从软件功能实现上来看,这样复制、粘贴确实可以实现这个效果;但从软件工程的角度来看,这样做是相当糟糕的。在软件开发里有一个规则:不要把相同的代码段书写两次以上!因为软件是 一个需要不断更新的产品,如果有一天需要更新图5.16中构造器A的初始化代码,假设构造器B、构造器C……里都包含了相同的初始化代 码,则需要同时打开构造器A、构造器B、构造器C……的代码进行修 改;反之,如果构造器B、构造器C……是通过this调用了构造器A的初始化代码,则只需要打开构造器A进行修改即可。因此,尽量避免 相同的代码重复出现,充分复用每一段代码,既可以让程序代码更加简洁,也可以降低软件的维护成本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值