在面向对象编程中,编程人员应该在意“资源”。比如
<a href="http://www.bysocket.com/?p=566#">?</a>
1
<code>string hello = "hello";</code>
在代码中,我们很在意在内存中string类型的hello,它是有一个生命周期的。在它生命周期中,初始化(initialization)和清理(cleanup)是两个重要的环节。尤其是c程序中,很多bug会出现在对象初始化和清理的环节。这样会造成一些程序安全问题。
《think in java》中说道:
随着计算机革命的发展,”不安全“的编程方式已逐渐成为编程代价高昂的主因之一。
在java开发中,针对对象会在乎内存的两个区域:对象的生存空间是堆(heap) — 方法调用及局部变量(也称栈变量)的生存空间栈(stack)。如图:

为了保证对象成功初始化,java像c++一样引入了构造器(constructor),即在创建对象的时候被自动调用的特殊方法。自然,java额外提供了gc(垃圾回收器),对于不再使用的资源,垃圾回收机制会自动释放资源。java通过类构造器创建新对象的时候,在使用此对象前,会调用其构造器进行初始化。如:
2
3
4
5
6
7
8
9
10
<code>public class voidconstructor {</code>
<code> </code>
<code> </code><code>voidconstructor(){</code>
<code> </code><code>// 构造器</code>
<code> </code><code>}</code>
<code> </code><code>void voidconstructor() {</code>
<code> </code><code>// void 方法,不是构造器</code>
<code>}</code>
1、默认构造器
这里,voidconstructor是一个类,如果需要创建一个voidconstructor对象只要
<code>voidconstructor constr = new voidconstructor();</code>
调用上面的代码就可以通过这个默认构造器(即无参构造器),就生成一个voidconstuctor对象。代码图解如下
2、注意,构造器是特殊的方法,采取与类名同名。它没有返回值,这与返回值为空的void方法不同。这里,void方法名命名也是不规范,应该是“每个方法首字母小写”,也一般不与类名相同。
另外,就算你类没有写构造器的话,编译器会生成一个默认构造器。
下面跑个带参构造器的例子:
11
12
13
14
15
16
17
18
19
<code>/**</code>
<code> </code><code>* @author jeff lee</code>
<code> </code><code>* @since 2015-9-7 16:54:19</code>
<code> </code><code>* 带参数简单构造器的展示</code>
<code> </code><code>*/</code>
<code>public class simpleconstructor2 {</code>
<code> </code><code>public static void main(string[] args) {</code>
<code> </code><code>for (int i = 0; i < 10; i++) {</code>
<code> </code><code>new child2(i);</code>
<code> </code><code>}</code>
<code>// child类</code>
<code>class child2 {</code>
<code> </code><code>child2(int i) {// 带参数的child类构造器</code>
<code> </code><code>system.out.print("child init " + i + " ");</code>
eclipse中,右键run as — java application:
上面child2(int)是child类的唯一构造器,此时你先在编译器中通过 new child2()来创建对象是不行的。
所以,构造器有助于避免开发中出现代码错误。
二者,构造器可以用来初始化资源。其中,对象的创建与资源的初始化是捆绑在一起的。
休息一下吧~ 看看小广告:
在创建一个对象时,所以继承下来的对象都会被调用各构造器。比如说下面这个例子:
20
21
22
<code> </code><code>* @since 2015-9-10 08:56:18</code>
<code> </code><code>* 继承中的构造器的案例</code>
<code>public class childconstructor extends personconstructor{</code>
<code> </code><code>childconstructor() {</code>
<code> </code><code>//super();</code>
<code> </code><code>system.out.println("making a child modle...");</code>
<code> </code><code>@suppresswarnings("unused")</code>
<code> </code><code>childconstructor childconstructor = new childconstructor();</code>
<code>class personconstructor {</code>
<code> </code><code>personconstructor() {</code>
<code> </code><code>system.out.println("making a person modle...");</code>
main函数运行结果如下:
1. 先分析下类uml,childconstructor 继承 personconstructor,personconstructor 继承 object:
2. super关键字,super用来调用父类的构造器。如果子类中没有super关键字,编译器会自动添加默认super()方法。因此,子类通过super()方法调用父类构造器。
3. 然后main函数中,通过new指令,启动了childconstructor对象的创建。子类 childconstructor 构造器在执行时,第一件事通过super()调用父类,这又会连锁反应到objerct类。所以,打印控制台先输出 “父类先初始化”。
这过程就是构造器链(constructor chaining),即child对象 is-a person对象同时也 is-a object对象。如果创建child对象,也同时创建了person对象和object对象的部分。
4. 过程流程图详解(图中是各对象构造器在堆栈块中调用流程 图中引用两字有歧义):
构造器虽小,关键还是非常关键的。
本文小结:
2、有参构造器 3、继承中的构造器 还有第一点的知识基础补充