码迷,mamicode.com
首页 > 编程语言 > 详细

Java对象的初始化过程

时间:2017-07-08 16:16:47      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:简单的   pre   order   tle   print   cto   xtend   空间   padding   

Java对象的初始化步骤如下:

1.首先将分配给对象的存储空间初始化为二进制的零;

2.如果有继承,则先调用基类的构造器;

3.按照声明的顺序调用成员的初始化方法;

4.调用导出类的构造器主体.

看下面的例子:

class Glyph
{
    void draw()
    {
        System.out.println("Glyph.draw()");
    }
    Glyph()
    {
        System.out.println("Glyph() before draw()");
        draw();
        System.out.println("Glyph() after draw()");
    }
}

class RoundGlyph extends Glyph
{
    private int radius = 1;
    RoundGlyph(int r)
    {
        radius = r;
        System.out.println("RoundGlyph.RoundGlyph().radius = " + radius);
    }
    void draw()
    {
        System.out.println("RoundGlyph.draw().radius = " + radius);
    }
}
public class PolyConstructors
{
    public static void main(String[] args)
    {
        new RoundGlyph(5);
    }
}

输出结果:

技术分享

结果分析:

1).导出类RoundGlyph覆盖了基类Glyph中的draw()方法.当基类Glyph构造器调用draw方法时,实际会调用RoundGlyph的draw()方法;

2).由于对象初始化时,首先将分配给对象的存储空间初始化为二进制的零,因此此时radius的值为0.

结论:

1).编写构造器时有一条有效的准则:"用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法";

2).在构造器内唯一能安全调用的那些方法是基类中的final方法(也适用于private方法,它们自动属于final方法).这些方法不能被覆盖,因此也就不会出现上述令人惊讶的问题.

Java对象的初始化过程

标签:简单的   pre   order   tle   print   cto   xtend   空间   padding   

原文地址:http://www.cnblogs.com/miotyan/p/7137016.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!