首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

种中各属性的初始化顺序 ,构造器和初始化块

2012-08-25 
类中各属性的初始化顺序 ,构造器和初始化块对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化

类中各属性的初始化顺序 ,构造器和初始化块

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们可以通过下面的测试代码来验证这一点:<wbr></wbr>

Java代码<wbr></wbr>

<wbr><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">运行以上代码,我们会得到如下的输出结果:<wbr></wbr></span></span><br><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">静态变量<wbr></wbr></span></span><br><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">静态初始化块<wbr></wbr></span></span><br><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">变量<wbr></wbr></span></span><br><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">初始化块<wbr></wbr></span></span><br><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">构造器<wbr></wbr></span></span><br><br><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:<wbr></wbr></span></span><br><br><br><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">Java代码<wbr></wbr></span></span><br><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px"><wbr><wbr></wbr></wbr></span></span><br><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px"></span></span><textarea readonly name="code" class="java"><pre></pre></textarea><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">运行上面的代码,会得到如下的结果:<wbr></wbr></span></span><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">Test--A<wbr></wbr></span></span><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">静态初始化块<wbr></wbr></span></span><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">Test--B<wbr></wbr></span></span><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">大家可以随意改变变量a、变量b以及静态初始化块的前后位置,就会发现输出结果随着它们在类中出现的前后顺序而改变,这就说明静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。<wbr></wbr></span></span><p><span style="color:rgb(50,62,50); font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">了解了继承情况下类的初始化顺序之后,如何判断最终输出结果就迎刃而解了</span></span></span></p><p><span style="color:rgb(50,62,50); font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px"></span></span></span></p><p><span style="color:rgb(50,62,50); font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px"></span></span></span></p><p><span style="color:rgb(50,62,50); font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px">总结:</span></span></span></p><p><span style="color:rgb(50,62,50); font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; word-wrap:normal; word-break:normal; line-height:21px"><span style="word-wrap:normal; word-break:normal; line-height:25px"></span></span></span></p><h2 style="color:black">1,构造器的语法格式</h2><p></p><p>修饰符:public private,protected,default</p><p>类名:构造器的名字必须和类名一致</p><p>参数列表</p><h2 style="color:black">2,构造器的返回值类型</h2><p>构造器不能定义返回值的类型,如果定义了返回值的类型,编译并不会报错,因为JVM已经把所谓的构造器当做是一个普通的方法.没有返回值类型并不是没有返回值,构造器有返回值的,返回的是当前类的对象,因此构造器的返回值类型总是当前类,因此没有定义返回值的类型.可以理解为构造器的返回值是隐式的.</p><h2 style="color:black">3默认的构造器,</h2><p>如果程序中没有显示的定义构造器,系统会默认的给程序一个无参的构造器.一旦加了构造器,默认的构造器就不存在了.</p><h2 style="color:black"><span style="color:red">4,</span>构造器是创建对象的重要途径<span style="color:red">,</span>是不是说构造器就完全负责创建对象呢<span style="color:red">?</span></h2><p>不是,构造器是创建对象的重要途径,同构new关键字来调用构造器也可以返回一个该类实例,但是这个过程并不是完全有构造器执行的.</p><p>实际上,在系统调用构造器的时候,系统会先为该对象分配内存空间,为对象的成员变量赋初值,这个时候对象就已经产生了---这些操作都是在构造器的执行体之前执行的.也就是说,在构造器的执行体执行之前,对象就已经存在了,只是不能被外部的程序调用,构造体执行之后,对象就可以被外部的程序调用了.</p><h2 style="color:black">5,构造器的重载</h2><p><strong><span style="color:rgb(127,0,85)">public</span></strong><span style="color:black"></span><strong><span style="color:rgb(127,0,85)">class</span></strong><span style="color:black">ConstructorDemo {</span></p><p><span style="color:black"></span><strong><span style="color:rgb(127,0,85)">private</span></strong><span style="color:black"></span><strong><span style="color:rgb(127,0,85)">int</span></strong><span style="color:black"></span><span style="color:rgb(0,0,192)">a</span><span style="color:black">;</span></p><p><span style="color:black"></span></p><p><span style="color:black"></span><strong><span style="color:rgb(127,0,85)">private</span></strong><span style="color:black">String</span><span style="color:rgb(0,0,192)">s</span><span style="color:black">;</span></p><p><span style="color:black"></span></p><p><span style="color:black"></span><strong><span style="color:rgb(127,0,85)">public</span></strong><span style="color:black">ConstructorDemo() {</span></p><p><span style="color:black"></span>}</p><p><span style="color:black"></span></p><p><span style="color:black"></span><strong><span style="color:rgb(127,0,85)">public</span></strong><span style="color:black">ConstructorDemo(</span><strong><span style="color:rgb(127,0,85)">int</span></strong><span style="color:black">a ){</span></p><p><span style="color:black"></span><strong><span style="color:rgb(127,0,85)">this</span></strong><span style="color:black">.</span><span style="color:rgb(0,0,192)">a</span><span style="color:black">= a;</span></p><p><span style="color:black"></span>}</p><p><span style="color:black"></span></p><p><span style="color:black"></span><strong><span style="color:rgb(127,0,85)">public</span></strong><span style="color:black">ConstructorDemo (String s,</span><strong><span style="color:rgb(127,0,85)">int</span></strong><span style="color:black">a){</span></p><p><span style="color:black"></span><strong><span style="color:rgb(127,0,85)">this</span></strong><span style="color:black">(a);</span></p><p><span style="color:black"></span><strong><span style="color:rgb(127,0,85)">this</span></strong><span style="color:black">.</span><span style="color:rgb(0,0,192)">s</span><span style="color:black">= s;</span></p><p><span style="color:black"></span>}</p><p><span style="color:black">}</span></p><h2 style="color:black">6,初始化块(代码块)</h2><p>初始化块可以当做是Java程序里面的一种成员,代码块又分为:静态代码块和非静态的代码块,一个类中可以有多个代码块,代码块之间执行的顺序是根据代码块在程序中的位置来决定.静态的代码块总是比非静态的代码块先执行</p><p>非静态代码块:可以把它当做是类的成员属性来理解.每次创建对象的时候都会执行一遍是属于成员变量</p><p>静态的代码块:同样的可以把它理解成类变量,只有在加载类的时候才会执行.</p><p>程序对属性进行初始化的顺序是<span style="color:red">:</span>代码块<span style="color:red">à</span>属性声明时候指定的初始值<span style="color:red">à</span>构造器中指定的值</p><h2 style="color:black">7,初始化块和构造器</h2><p>从某种程度上来讲,可以理解为初始化快是构造器的补充,因为初始化快总是在构造器之前执行,同样也可以对对象初始化.</p><p>与构造器不同的是:初始化块只能执行一段固定的代码,不能够像构造器一样接受参数,而且是对类的所有的对象进行初始化.</p><p><span style="color:red"></span>跟构造器一样的<span style="color:red">,</span>程序在执行的时候不仅会执行当前类的初始化快和构造器<span style="color:red">,</span>会一直追溯到<span style="color:red">object</span>类的初始化快和构造器<span style="color:red">.</span>先执行父类的初始化块和构造器<span style="color:red">(</span>先初始化块<span style="color:red">,</span>再构造器<span style="color:red">),</span>然后再执行当前类的初始化块和构造器<span style="color:red">.</span></p><pre></pre><pre></pre><pre></pre></wbr>

热点排行