??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品区一区二区三,欧美在线观看天堂一区二区三区,三级网站视频在在线播放http://www.aygfsteel.com/majianan/category/13673.html<br> <div align=center > <img width=200 height=50 src="http://www.aygfsteel.com/images/blogjava_net/majianan/14891/r_5858488902000cu2.gif" name="welcome"> </div> <br> <script language="JavaScript"> <!-- Begin text = "人本是hQ不必刻意去做hQ世本是世,无须_ֿd世;自然的才是快乐的?; color1 = "blue"; color2 = "red"; fontsize = "2"; speed = 100; i = 0; if (navigator.appName == "Netscape") { document.write("<layer id=a visibility=show></layer><br><br><br>"); } else { document.write("<div id=a></div>"); } function changeCharColor() { if (navigator.appName == "Netscape") { document.a.document.write("<center><font face=arial size =" + fontsize + "><font color=" + color1 + ">"); for (var j = 0; j < text.length; j++) { if(j == i) { document.a.document.write("<font face=arial color=" + color2 + ">" + Text.charAt(i) + "</font>"); } else { document.a.document.write(text.charAt(j)); } } document.a.document.write('</font></font></center>'); document.a.document.close(); } if (navigator.appName == "Microsoft Internet Explorer") { str = "<center><font face=arial size=" + fontsize + "><font color=" + color1 + ">"; for (var j = 0; j < text.length; j++) { if( j == i) { str += "<font face=arial color=" + color2 + ">" + text.charAt(i) + "</font>"; } else { str += text.charAt(j); } } str += "</font></font></center>"; a.innerHTML = str; } (i == text.length) ? i=0 : i++; } setInterval("changeCharColor()", speed); // End --> </script> zh-cnWed, 28 Feb 2007 12:01:31 GMTWed, 28 Feb 2007 12:01:31 GMT60在java中用@环定义会出现哪些问题Q?http://www.aygfsteel.com/majianan/archive/2006/10/19/76100.html马嘉?/dc:creator>马嘉?/author>Thu, 19 Oct 2006 02:58:00 GMThttp://www.aygfsteel.com/majianan/archive/2006/10/19/76100.htmlhttp://www.aygfsteel.com/majianan/comments/76100.htmlhttp://www.aygfsteel.com/majianan/archive/2006/10/19/76100.html#Feedback4http://www.aygfsteel.com/majianan/comments/commentRss/76100.htmlhttp://www.aygfsteel.com/majianan/services/trackbacks/76100.html                               在Java中用@环定义会出现哪些问题  

                                               马嘉?/font>         2006-10-19


在上一文章? inconstant constants ( 变化无常的常?)   》的基础?我们再来研究一?font color="#000000">?Java 中用@环定义会出现哪些问题?/font>

老规矩,代码伺?^+^

?Q?br />
public class
ClassX{
   public static final int= 2*
ClassY.Y;
}

public class
ClassY{
   public static final int=ClassZ.Z+ 1
;
}

public class  ClassZ  extends
ClassX{
   public static final int Z= X + 3
;
}

public class 
ClassTest{
   public static void
main(String[] args){
      System.out.println(ClassX.X
+ ClassY.Y +
ClassZ.Z);
   }
}


代码中的static final变量XQYQZQ@环定义?/font>

你可以先想一下,q个g是多?看看与实际结果是否一致?/font>

输出l果Q?/font>


现在对ClassTest.javaq行一点修改,如下Q?br />

?Q?br />
public class
ClassTest{
   public staticvoid
main(String[] args){
      System.out.println(ClassZ.Z
+ ClassY.Y +
ClassX.X);
   }
}

两次的输出结果会一样么Q?br />我既然这么问了,你肯定会说不一P那你知道原因么?你知道这ơ的输出l果么?
可以先思考一下?br />
输出l果Q?/font>


让我来告诉你q是怎么回事?/p>

我们可以看见Q对于三个staitc final 变量 XQYQZQ他们的初始化表辑ּ是@环定义的。在~译期间不能定它们的|所以它们是q行期间帔R( runtime constants )Q编译器不会q行帔R替换?br />而且每个表达式的计算会依赖于类装蝲的顺序?br />
例如Qؓ了计出?中的 ClassTest l果Q我们可以预见,ClassX 是第一个被装蝲的类Q但是第一个完成初始化的类却是 ClassZ.

让我们一步一步看看都发生了什么?br />
1.   X = 2 * ClassY.Y;      计算XQ需要知道ClassY.Y的|下一步计Y?br />2.   Y = ClassZ.Z + 1;      计算YQ需要知道ClassZ.Z的|下一步计Z?br />3.   Z = X + 3;                计算ZQ需要知道X的|而此时X的D没有被计出?又{回来了,居然是个圈,呵呵^+^)Q所以我们用X的默认??br />
因此Q?br />      Z = 3;
      Y = 4;
      X = 8;

所?ClassX.X + ClassY.Y + ClassZ.Z  =  15

?当中Q也是同一道理
不同的是QClassZ是第一个被装蝲的类QClassX是第一个完成初始化的类
1. Z = X + 3;
2. X = 2 * ClassY.Y;
3. Y = ClassZ.Z + 1;(此时使用Z的默认?)

因此Q?/font>
      Y = 1;
      X = 2;
      Z = 5;

所?ClassZ.Z + ClassY.Y + ClassX.X = 8

只是单的改变的输出顺序,l果却截然不同。哪一个才是你惌得结果呢Q?/font>

我的例子看v来有ҎI心思钻牛角,但是在大型项目当中,也许׃出现与例子当中相同的循环定义Q如果真的存在的话,那么在纷J的代码当中惌发现循环定义可不是gҎ的事情?br />
如果独立看每一个定义的话,g都可以进行常量替换,看不ZQ何问题。但是这L代码在不久的来׃引发问题Q而且不易被我们所察觉?br />
在你的应用程序当中不l意的代码改变(例如CZ代码中我们只是改变了输出序Q却产生了截然不同的l果Q,׃D不同的类装蝲序和计顺序,或者在q发的线E调度中Q可能也会导致致不同的类装蝲序和计顺序。不q的是,大多数编译器不认U代码是错误Q也不会对编Eh员给ZQ何警告?/font>

我只是讲了一下@环定义会引发的问题,我暂时也想不Z么好的解军_法,只能在编E的q程当中量注意啦?br />

注:有错误请告诉我,非常感谢Q?/font>



]]>
inconstant constantsQ变化无常的帔RQ?/title><link>http://www.aygfsteel.com/majianan/archive/2006/10/18/75972.html</link><dc:creator>马嘉?/dc:creator><author>马嘉?/author><pubDate>Wed, 18 Oct 2006 08:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/majianan/archive/2006/10/18/75972.html</guid><wfw:comment>http://www.aygfsteel.com/majianan/comments/75972.html</wfw:comment><comments>http://www.aygfsteel.com/majianan/archive/2006/10/18/75972.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.aygfsteel.com/majianan/comments/commentRss/75972.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/majianan/services/trackbacks/75972.html</trackback:ping><description><![CDATA[ <p> <font face="Verdana"> <font style="BACKGROUND-COLOR: #ffffff" color="#000000"> <font color="#0000ff">                       <font size="4">         inconstant constants</font> ( 变化无常的常?)</font> </font> <br />                                          <br />                                           </font> <a href="/majianan"> <font face="Verdana"> <font color="#0000ff">马嘉?/font> </font> </a> <font face="Verdana">               2006-10-18 <br /><br /><br /></font> <font face="Verdana" size="2">看到q个题目也许你会感到奇怪,会想我在胡说八道什么,一定又是v个怪异的名字,骗取点击率。还请你耐心看完Q如果你有所收获Q那么我很高_如果你还是觉得上当了Q那我l努力写出点有用的东西,呵呵?br /><br />其实我想了很久,也还是不知道起一个什么题目好Q就套用了?<font color="#0000ff">The Java Language Specification </font>》中的一个名词?<font color="#0000ff">inconstant constants</font>”,我把他翻译成?font color="#0000ff">变化无常的常?/font>?</font> </p> <p> <font face="Verdana" size="2">注:部分内容在?</font> <a href="/majianan/archive/2006/10/14/75097.html"> <font size="2"> <font face="Verdana"> <font color="#0000ff">使用Java中的final变量需要注意的地方</font> </font> </font> </a> <font face="Verdana" size="2">》有提到Q不q我转蝲的原文不够详l深入,q才重新写一下?br /></font> </p> <p> <font face="Verdana" size="2">我们q是来先看一D代码,׃码引出问题:<br /><br /></font> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font size="2"> <font face="Verdana"> <span style="COLOR: #0000ff">public </span> <span style="COLOR: #0000ff">class</span> </font> </font> <font size="2"> <font face="Verdana"> <span style="COLOR: #000000"> ClassX {<br />   </span> <span style="COLOR: #0000ff">public </span> <span style="COLOR: #0000ff">static </span> <span style="COLOR: #0000ff">final </span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">  X  </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">   </span> <span style="COLOR: #000000">2</span> </font> </font> <font size="2"> <font face="Verdana"> <span style="COLOR: #000000"> ;<br />}<br /><br /></span> <span style="COLOR: #0000ff">public </span> <span style="COLOR: #0000ff">class </span> </font> </font> <font size="2"> <font face="Verdana"> <span style="COLOR: #000000">ClassTest {<br />   </span> <span style="COLOR: #0000ff">public </span> <span style="COLOR: #0000ff">static </span> <span style="COLOR: #0000ff">void </span> </font> </font> <span style="COLOR: #000000"> <font face="Verdana" size="2">main(String[] args){<br />      System.out.println(ClassX.X);<br />   }<br />}   </font> </span> </div> <p> <br /> <font face="Verdana" size="2">输出l果Q?br /><br />2 </font> </p> <p> <font face="Verdana" size="2">l果是显而易见的Q这里需要说明的是:<br />ҎJava语言规范Q对于java中的static final变量Q如果用一个在~译期间(complie time)可以计算出结果的表达式进行初始化Q则用到此变量的地方会被该表辑ּ的结果所替代。本例中Q在~译期间QClassTest.main() 函数?ClassX.X 被2所替代?br /><br />此时Q在cClassTest main()中不再有指向ClassX的动态链接,告诉ClassTest在运行的时候从ClassX获得X的|你可以通过使用javap反编译器帮助你理解?br /><br />1. 先编译ClassTest.java文g<br />            javac ClassTest.java<br />2. 使用javap<br />            javap -c ClassTest<br /><br />屏幕输出Q?<br /><br /></font> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font size="2"> <font face="Verdana"> <span style="COLOR: #000000">Complied from "ClassTest.java"<br />public class ClassTest extends java.lang.Object{<br />public ClassTest();<br />   Code:<br />      0: aload_0<br />      1: invokespecial     #1; //Method java/lang/Object."<init></span> </font> </font> <font face="Verdana" size="2"> <span style="COLOR: #000000">":()V<br />      4: return<br /><br />public static void main(java.lang.String[]);<br />   Code:<br />      0: getstatic         #2; //Field java/lang/System.out:Ljava/io/PrintStream;<br />      3: iconst_2 <br />      4: invokevirtua      #3; //Method java/io/PrintStream.println:(I)V<br />      7: return<br /><br />} </span> </font> </div> <p> <br /> <font face="Verdana" size="2">可以看出Q在调用System.out.println()之前Q整?已经被放在JVM的堆栈中Q不再有指向ClassX.X的链接。如果此Ӟ改变ClassX.X的gؓ1,q且重新~译ClassX.X文gQ但是ƈ不重新编译ClassTest.java文gQ运行ClassTestQ输出结果仍然是2.<br /><br />q么?帔R替换)的一个原因是Z在编译期间检查switch case语句。switch语句中的每一个case都需要一个常量|而且每两个之间都不能相同Q编译器在编译期间将会做查?<br /><br />如果用来lstatic final变量q行初始化的表达式,只能在运行时L可以计算出|那么帔R替换׃会发?例如Q?</font> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font size="2"> <font face="Verdana"> <span style="COLOR: #0000ff">public </span> <span style="COLOR: #0000ff">class </span> </font> </font> <font size="2"> <font face="Verdana"> <span style="COLOR: #000000">ClassX {<br /></span> <span style="COLOR: #0000ff">   public </span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #0000ff">final</span> <span style="COLOR: #0000ff">int</span> X<span style="COLOR: #000000"> </span><span style="COLOR: #000000">=</span> <span style="COLOR: #0000ff">new</span>  </font> </font> <span style="COLOR: #000000"> <font face="Verdana" size="2">java.util.Random().nextInt();<br />}   </font> </span> </div> <p> <br /> <font face="Verdana" size="2">ClassX 改变了,我们再来看一下Main.main(): </font> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font size="2"> <font face="Verdana"> <span style="COLOR: #000000">Complied from "ClassTest.java"<br />public class ClassTest extends java.lang.Object{<br />public ClassTest();<br />   Code:<br />      0: aload_0<br />      1: invokespecial      #1; //Method java/lang/Object."<init></span> </font> </font> <font face="Verdana" size="2"> <span style="COLOR: #000000">":()V<br />      4: return<br /><br />public static void main(java.lang.String[]);<br />   Code:<br />      0: getstatic          #2; //Field java/lang/System.out:Ljava/io/PrintStream;<br />      3: getstatic          #3; //Field ClassX.X:I <br />      6: invokevirtual      #4; //Method java/io/PrintStream.println:(I)V<br />      9: return<br /><br />} </span> </font> </div> <p> <br /> <font face="Verdana" size="2">此时我们可以看见有个引用指向了Field X?br />( 如果把类ClassXҎInterfaceQ仍然会出现上面的结?) <br /><br />当然有方法可以你避免出?font color="#0000ff">"inconstant constants"</font>问题?br /><br /></font> <font size="2"> <font face="Verdana"> <font color="#008000"> <font color="#000080">W一U方法:</font> <br /> </font>当你要声明一个编译期间常量的时候,一定要保证此变量不会或者不太可能改变,或者尽量少使用声明为static final的变量。当然这只能L不能LQ所以我推荐使用W二U方法?br /><br /><font color="#000080">W二U方法:</font><br />变量声明ؓprivateQ同时声明一个方法来获得此变量的?<br /></font> </font> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font size="2"> <font face="Verdana"> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">ClassX.java修改如下Q?/span> </font> </font> <span style="COLOR: #008000"> <br /> </span> <font size="2"> <font face="Verdana"> <span style="COLOR: #0000ff">public<font color="#000000"></font></span> <span style="COLOR: #0000ff">class</span>  </font> </font> <font size="2"> <font face="Verdana"> <span style="COLOR: #000000">ClassX {<br /></span> <span style="COLOR: #0000ff">   private</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #0000ff">final</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">X </span><span style="COLOR: #000000">=</span> <span style="COLOR: #000000">2</span></font> </font> <font size="2"> <font face="Verdana"> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #0000ff">   public  </span> <span style="COLOR: #0000ff">static </span> <span style="COLOR: #0000ff">int </span> </font> </font> <font size="2"> <font face="Verdana"> <span style="COLOR: #000000">getX(){<br /></span> <span style="COLOR: #0000ff">      return </span> </font> </font> <font size="2"> <font face="Verdana"> <span style="COLOR: #000000">X;<br />   }<br />}<br /><br /></span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">ClassTest.java修改如下Q?/span> </font> </font> <span style="COLOR: #008000"> <br /> </span> <font size="2"> <font face="Verdana"> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">class</span>  </font> </font> <font size="2"> <font face="Verdana"> <span style="COLOR: #000000">ClassTest{<br /></span> <span style="COLOR: #0000ff">   public</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #0000ff">void</span>  </font> </font> <font face="Verdana" size="2"> <span style="COLOR: #000000">main(String[] args){<br />      System.out.println(ClassX.getX());<br />   }<br />} </span> </font> </div> <p> <br /> <font face="Verdana" size="2">此时再改变ClassX.X的gؓ1Q重新编译ClassX.javaQ而不~译ClassTestQ结果就会显C?Q而非2。这避免了"<font color="#0000ff">inconstant constants</font>"的问题?<br /><br />下一准备讲一?/font> <a href="/majianan/archive/2006/10/19/76100.html"> <font face="Verdana" color="#0000ff" size="2">《在java中用@环定义会出现哪些问题Q?/font> </a> <font face="Verdana" color="#0000ff" size="2"> </font> </p> <p> <br /> <font face="Verdana">  </font> </p> <img src ="http://www.aygfsteel.com/majianan/aggbug/75972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/majianan/" target="_blank">马嘉?/a> 2006-10-18 16:27 <a href="http://www.aygfsteel.com/majianan/archive/2006/10/18/75972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>请问Q谁有电子版的《java pitfalls》啊Q给我一?/title><link>http://www.aygfsteel.com/majianan/archive/2006/08/15/63591.html</link><dc:creator>马嘉?/dc:creator><author>马嘉?/author><pubDate>Tue, 15 Aug 2006 01:20:00 GMT</pubDate><guid>http://www.aygfsteel.com/majianan/archive/2006/08/15/63591.html</guid><wfw:comment>http://www.aygfsteel.com/majianan/comments/63591.html</wfw:comment><comments>http://www.aygfsteel.com/majianan/archive/2006/08/15/63591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/majianan/comments/commentRss/63591.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/majianan/services/trackbacks/63591.html</trackback:ping><description><![CDATA[谁有电子版的《java pitfalls》啊Q?br /><br />请发l我一份,非常感谢Q?br /><br />Email:jianan.ma@gmail.com<img src ="http://www.aygfsteel.com/majianan/aggbug/63591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/majianan/" target="_blank">马嘉?/a> 2006-08-15 09:20 <a href="http://www.aygfsteel.com/majianan/archive/2006/08/15/63591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͭɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank">μԴ</a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʹ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ٽ</a>| <a href="http://" target="_blank">ʲ</a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǫ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ͻ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ȫ</a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">޻</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͭ</a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˹</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>