??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品三级视频,日本a人精品,一区二区三区四区视频http://www.aygfsteel.com/4cai/天地之间有杆U,拿秤砣砸老百姓?/description>zh-cnTue, 17 Jun 2025 12:08:52 GMTTue, 17 Jun 2025 12:08:52 GMT60JVM中finally子句介绍http://www.aygfsteel.com/4cai/archive/2014/06/08/414503.htmlRolandzRolandzSat, 07 Jun 2014 18:42:00 GMThttp://www.aygfsteel.com/4cai/archive/2014/06/08/414503.htmlhttp://www.aygfsteel.com/4cai/comments/414503.htmlhttp://www.aygfsteel.com/4cai/archive/2014/06/08/414503.html#Feedback1http://www.aygfsteel.com/4cai/comments/commentRss/414503.htmlhttp://www.aygfsteel.com/4cai/services/trackbacks/414503.html
finally子句

JVM执行Java字节码时Q它有几U方式可以退Z个代码块Q花括号中间的语句)。其中之一Q就是简单的执行完其中所有的语句Q然后退Z码块。第二种QJVM可能会在代码块中间的M一处,遇到像breakQcontinueQreturn之类的语句,强制它蟩代码块。第三种QJVM可能会在执行q程中,出现了异常,然后它蟩转到匚w的catch子句Q或者没有找到相应的catch子句Q直接退出当前线E。由于单个代码块有如此多的潜在退出点Qexit pointQ,拥有一个简单的方式来表䏀无Z码块以什么方式退出,有些事情总能发生”是很值得的。然后就有了try-finally子句?nbsp; 阅读全文

Rolandz 2014-06-08 02:42 发表评论
]]>
JVM中的异常处理http://www.aygfsteel.com/4cai/archive/2014/06/02/414314.htmlRolandzRolandzSun, 01 Jun 2014 19:54:00 GMThttp://www.aygfsteel.com/4cai/archive/2014/06/02/414314.htmlhttp://www.aygfsteel.com/4cai/comments/414314.htmlhttp://www.aygfsteel.com/4cai/archive/2014/06/02/414314.html#Feedback0http://www.aygfsteel.com/4cai/comments/commentRss/414314.htmlhttp://www.aygfsteel.com/4cai/services/trackbacks/414314.htmlƢ迎来到“Under The Hood”W六期。本期我们介l?a title="jvm中的异常处理" target="_blank" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: none; color: #21759b;">JVM处理异常的方?/a>Q包括如何抛出和捕获异常及相关的字节码指令。但本文不会讨论finally子句Q这是下期的主题。你可能需要阅?a title="under the hood" target="_blank" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: none; color: #21759b;">往?/a>的文章才能更好的理解本文?/em>

异常处理

在程序运行时Q异常让你可以^滑的处理意外状况。ؓ了演CJVM处理异常的方式,考虑NitPickyMathc,它提供对整数q行加,减,乘,除以及取余的操作?br />

NitPickyMath提供的这些操作和Java语言?#8220;+”Q?#8220;-”Q?#8220;*”Q?#8220;/”?#8220;%”是一LQ除了NitPickyMath中的Ҏ在以下情况下会抛出检查型QcheckedQ异常:上溢出,下溢Z及被0除?做除数时QJVM会抛出ArithmeticException异常Q但是上溢出和下溢出不会引发M异常。NitPickyMath中抛出异常的Ҏ定义如下Q?/p>

  1. class OverflowException extends Exception {
  2. }
  3. class UnderflowException extends Exception {
  4. }
  5. class DivideByZeroException extends Exception {
  6. }

NitPickyMathcM的remainder()Ҏ是一个抛出和捕获异常的简单方法?/p>

  1. static int remainder(int dividend, int divisor)
  2.     throws DivideByZeroException {
  3.     try {
  4.         return dividend % divisor;
  5.     }
  6.     catch (ArithmeticException e) {
  7.         throw new DivideByZeroException();
  8.     }
  9. }

remainder()ҎQ只是简单的对当作参C递进来的2个整数进行取余操作。如果取余操作的除数?Q会引发ArithmeticException异常。remainder()Ҏ捕获q个异常Qƈ重新抛出DivideByZeroException异常?/p>

DivideByZeroException和ArithmeticException的区别是QDivideByZeroException是检查型QcheckedQ异常,而ArithmeticException是非查(uncheckedQ型异常。由于ArithmeticException是非查型异常Q一个方法就会抛出该异常,也不必在其throw子句中声明它。Q何Error或RuntimeException异常的子cd帔R是非查型异常。(ArithmeticException是RuntimeException的子cR)通过捕获ArithmeticException和抛出DivideByZeroExceptionQremainder()Ҏ它的调用者去处理除数?的可能性,要么捕获它,要么在其throw子句中声明DivideByZeroException异常。这是因为,像DivideByZeroExceptionq种在方法中抛出的检查型异常Q要么在Ҏ中捕P要么在其throw子句中声明,二者必选其一。而像ArithmeticExceptionq种非检查型异常Q就不需要去昑ּ捕获和声明?/p>

javac为remainder()Ҏ生成的字节码序列如下Q?/p>

  1. // The main bytecode sequence for remainder:
  2. 0 iload_0               // Push local variable 0 (arg passed as divisor)
  3. 1 iload_1               // Push local variable 1 (arg passed as dividend)
  4. 2 irem                  // Pop divisor, pop dividend, push remainder
  5. 3 ireturn               // Return int on top of stack (the remainder)
  6. // The bytecode sequence for the catch (ArithmeticException) clause:
  7. 4 pop                   // Pop the reference to the ArithmeticException
  8.                         // because it is not used by this catch clause.
  9. 5 new #5 < Class DivideByZeroException >
  10.                         // Create and push reference to new object of class
  11.                         // DivideByZeroException.
  12. 8 dup                   // Duplicate the reference to the new
  13.                         // object on the top of the stack because it
  14.                         // must be both initialized
  15.                         // and thrown. The initialization will consume
  16.                         // the copy of the reference created by the dup.
  17. 9 invokenonvirtual #9 < Method DivideByZeroException.< init >()V >
  18.                         // Call the constructor for the DivideByZeroException
  19.                         // to initialize it. This instruction
  20.                         // will pop the top reference to the object.
  21. 12 athrow               // Pop the reference to a Throwable object, in this
  22.                         // case the DivideByZeroException,
  23.                         // and throw the exception.

remainder()Ҏ的字节码?个单独的部分。第一部分是该Ҏ的正常执行\径,q部分从W?行开始,到第3行结束。第二部分是从第4行开始,?2行结束的catch子句?/p>

d节码序列中的irem指o可能会抛出ArithmeticException异常。如果异常发生了QJVM通过在异常表中查扑֌配的异常Q它会知道要跌{到相应的异常处理的catch子句的字节码序列部分。每个捕获异常的ҎQ都跟类文g中与Ҏ字节码一起交付的异常表关联。每一个捕获异常的try块,都是异常表中的一行。每?条信息:开始行PfromQ和l束行号QtoQ,要蟩转的字节码序列行PtargetQ,被捕L异常cȝ帔R池烦引(typeQ。remainder()Ҏ的异常表如下所C:

FROM
TO
TARGET
TYPE
0 4 4 < Class java.lang.ArithmeticException >

上面的异常表表明Q行??范围内,ArithmeticException被捕获。异常表中的“to”下面的结束行号始l比异常捕获的最大行号大1Q上表中Q结束行号ؓ4Q而异常捕L最大行h3。行??的字节码序列对应remainder()Ҏ中的try块?#8220;target”列中Q是??的字节码发生ArithmeticException异常时要跌{到的目标行号?/p>

如果Ҏ执行q程中生了异常QJVM会在异常表中查找匚w行。异常表中的匚w行要W合下面的条Ӟ当前pc寄存器的D在该行的表示范围之内Q[from, to)Q且产生的异常是该行所指定的异常类或其子类。JVM按从上到下的ơ序查找异常表。当扑ֈ了第一个匹配行QJVM把pc寄存器设为新的蟩转行P从此行l往下执行。如果找不到匚w行,JVM弹出当前栈Qƈ重新抛出同一个异常。当JVM弹出当前栈Ӟ它会l止当前Ҏ的执行,q回到调用该Ҏ的上一个方法那里。这Ӟ在上一个方法里Qƈ不会l箋正常的执行过E,而是抛出同样的异常,促JVM重新查找该方法的异常表?/p>

JavaE序员可以用throw语句抛出像remainder()Ҏ的catch子句中的异常QDivideByZeroException。下表列Z抛出异常的字节码Q?/p>
OPCODE
OPERAND(S)
DESCRIPTION
athrow (none) pops Throwable object reference, throws the exception

athrow指o把栈元素弹出,该元素必LThrowable的子cL其自w的对象引用Q而抛出的异常cd由栈弹出的对象引用所指明?/p>

本文译自Q?a target="_blank" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: none; color: #21759b;">How the Java virtual machine handles exceptions



Rolandz 2014-06-02 03:54 发表评论
]]>
对象和数l:JVM中,处理对象和数l的字节码介l?/title><link>http://www.aygfsteel.com/4cai/archive/2014/05/30/414259.html</link><dc:creator>Rolandz</dc:creator><author>Rolandz</author><pubDate>Thu, 29 May 2014 18:14:00 GMT</pubDate><guid>http://www.aygfsteel.com/4cai/archive/2014/05/30/414259.html</guid><wfw:comment>http://www.aygfsteel.com/4cai/comments/414259.html</wfw:comment><comments>http://www.aygfsteel.com/4cai/archive/2014/05/30/414259.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/4cai/comments/commentRss/414259.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/4cai/services/trackbacks/414259.html</trackback:ping><description><![CDATA[     摘要: Ƣ迎来到“Under The Hood”W五期。本期我们来看看JVM中处理对象和数组的字节码。你可能需要阅d期的文章才能更好的理解本文?面向对象的机?JVM中的数据?UŞ式:对象QobjectQ,对象引用Qobject referenceQ和原始cdQprimitive typeQ。对象存攑֜垃圾攉堆中Q对象引用和原始cdQ根据它们作用域范围的不同,分别存放?..  <a href='http://www.aygfsteel.com/4cai/archive/2014/05/30/414259.html'>阅读全文</a><img src ="http://www.aygfsteel.com/4cai/aggbug/414259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/4cai/" target="_blank">Rolandz</a> 2014-05-30 02:14 <a href="http://www.aygfsteel.com/4cai/archive/2014/05/30/414259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初窥JVM点q算http://www.aygfsteel.com/4cai/archive/2014/05/26/414118.htmlRolandzRolandzMon, 26 May 2014 07:09:00 GMThttp://www.aygfsteel.com/4cai/archive/2014/05/26/414118.htmlhttp://www.aygfsteel.com/4cai/comments/414118.htmlhttp://www.aygfsteel.com/4cai/archive/2014/05/26/414118.html#Feedback1http://www.aygfsteel.com/4cai/comments/commentRss/414118.htmlhttp://www.aygfsteel.com/4cai/services/trackbacks/414118.html阅读全文

Rolandz 2014-05-26 15:09 发表评论
]]>
字节码基QJVM字节码初?/title><link>http://www.aygfsteel.com/4cai/archive/2014/05/22/413950.html</link><dc:creator>Rolandz</dc:creator><author>Rolandz</author><pubDate>Wed, 21 May 2014 18:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/4cai/archive/2014/05/22/413950.html</guid><wfw:comment>http://www.aygfsteel.com/4cai/comments/413950.html</wfw:comment><comments>http://www.aygfsteel.com/4cai/archive/2014/05/22/413950.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/4cai/comments/commentRss/413950.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/4cai/services/trackbacks/413950.html</trackback:ping><description><![CDATA[     摘要: 字节码是JVM的机器语a。JVM加蝲cL件时Q对cM的每个方法,它都会得C个字节码。这些字节码保存在JVM的方法区中。在E序q行q程中,当一个方法被调用Ӟ它的字节码流׃被执行。根据特定JVM设计者的选择Q它们可以通过解释的方式,x~译QJust-in-time compilationQ的方式或其他技术的方式被执行?nbsp; <a href='http://www.aygfsteel.com/4cai/archive/2014/05/22/413950.html'>阅读全文</a><img src ="http://www.aygfsteel.com/4cai/aggbug/413950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/4cai/" target="_blank">Rolandz</a> 2014-05-22 02:07 <a href="http://www.aygfsteel.com/4cai/archive/2014/05/22/413950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavacL件的基本l构http://www.aygfsteel.com/4cai/archive/2014/05/19/413821.htmlRolandzRolandzSun, 18 May 2014 19:49:00 GMThttp://www.aygfsteel.com/4cai/archive/2014/05/19/413821.htmlhttp://www.aygfsteel.com/4cai/comments/413821.htmlhttp://www.aygfsteel.com/4cai/archive/2014/05/19/413821.html#Feedback2http://www.aygfsteel.com/4cai/comments/commentRss/413821.htmlhttp://www.aygfsteel.com/4cai/services/trackbacks/413821.html阅读全文

Rolandz 2014-05-19 03:49 发表评论
]]>
短小_悍的虚拟机QJVM基本l构和功能介l?/title><link>http://www.aygfsteel.com/4cai/archive/2014/05/17/413789.html</link><dc:creator>Rolandz</dc:creator><author>Rolandz</author><pubDate>Sat, 17 May 2014 13:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/4cai/archive/2014/05/17/413789.html</guid><wfw:comment>http://www.aygfsteel.com/4cai/comments/413789.html</wfw:comment><comments>http://www.aygfsteel.com/4cai/archive/2014/05/17/413789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/4cai/comments/commentRss/413789.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/4cai/services/trackbacks/413789.html</trackback:ping><description><![CDATA[<em>Ƣ迎来到“<a ><span style="color: #0000ff;">Under The Hood</span></a>”W一期。本期,我将l出JVM的基本结构和功能介绍? </em> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">什么是JVMQؓ什么要有它Q?/strong></em></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">JVMQJava虚拟机)是一个运行已~译JavaE序的抽象计机。之所以说?#8221;虚拟“的,是因为它Z“真正”的硬件^台和操作pȝQ一般以软g的Ş式实现。所有的JavaE序都ؓJVM而编译。因此,在特定^Cq行已编译JavaE序之前Q该q_的JVM必须先要被实现?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">JVM在Java的跨q_Ҏ中Qv着中间人的角色。它在已~译JavaE序与底层硬件^台和操作pȝ之间Q提供一个抽象层。JVM对Java的可UL性非常关键,因ؓQ已~译JavaE序q行在JVM之上Qƈ独立于底层JVM的具体实现?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">那么Q是什么导致JVM的短精悍?当被实现成Y件时QJMV很小巧。它被设计成q样Q是Z让它能够适用于尽可能多的地方Q比如机盒Q手机和个h电脑。JVM很精悍,是因为它的野心?#8221;无处不在Q?#8220;是它的战斗口受它惌无处不在Qƈ且JavaE序”一ơ编写,到处q行“的程度说明了它的成功?br /> </p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">Java字节?/strong></em></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">JavaE序被编译成一U叫做字节码的东东。JVM执行Java字节码,所以字节码可以被认为是JVM的机器语a。Java~译器读取Java源文Ӟ把它译成Java字节码ƈ保存到类文gQ?class文gQ中。编译器会ؓ源码中的每一个类生成一个类文g?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">对JVM来说Q字节码就是指令序列。每条指令包含一个单字节的操作码和零个或多个操作数。操作码告诉JVM要执行的操作。如果JVM需要除操作码之外更多的信息L行一Ҏ作,那么Q需要的信息作ؓ操作敎ͼ紧跟在操作码之后?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">每个字节码都有一个助记符Q它可被当作JVM的汇~语a。例如,有个指o会让JVM?压到堆栈中。该指o的助记符是iconst_0Q字节码值是0×60。该指o没有操作数。另一个指令让E序的执行在内存中无条g向前向后跌{。这个指令需要一个操作数Q它是一个指明从当前内存地址开始的2字节无符号偏U量。通过把偏U量加到当前内存地址QJVM可以获得要蟩转的目标内存地址。该指o的助记符是gotoQ它的字节码值是0xa7?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">虚拟部分</strong></em></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">JVM?#8220;虚拟g”可以分ؓ四个部分Q寄存器l,栈区Q垃圾收集堆和方法区。这些部分很抽象Q就像由它们l成的虚拟机一P但是它们必须在每个JVM的实CQ以某种形式存在?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">JVM中地址的是32位(4字节Q的Q因此,JVM可以处理4GBQ??2ơ方Q的内存。栈区,垃圾攉堆和Ҏ区处在这4GB内存中的某个地方Q至于它们的具体内存地址Q这取决于每个特定JVM的实现者?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">JVM中一个字QwordQ的长度?2位的。JVM中有数几个原始数据cdQbyteQ?位)QshortQ?6位)QintQ?2位)QlongQ?4位)QfloatQ?2位)QdoubleQ?4位)QcharQ?6位)。除了无W号Unicode字符char之外Q其?U数字类型都是有W号的。这些类型可以方便的映射到JavaE序员可用的数据cd。另一个原始类型是对象句柄Q它是一个指向堆中对象的32位地址?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">׃包含字节码,ҎZ字节边界寚w。栈和垃圾收集堆以字Q?2位)边界寚w<span style="margin: 0px; padding: 0px; border: 0px; font-size: 11px; vertical-align: baseline; line-height: 0; position: relative; top: -0.5em;">1</span>?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">寄存器:我少我自?/strong></em></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">JVM?个程序计数器QcounterQ和3个管理栈的寄存器QregisterQ。它只有很少的寄存器Q是因ؓJVM字节码指令主要操作栈区。这U面向栈的设计,使得JVM指o集和JVM实现很小巧?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">JVM使用E序计数器(也叫pc寄存器)Q跟t当前执行指令的内存位置。另?个寄存器Qoptop寄存器,frame寄存器和vars寄存器)指向当前执行Ҏ栈上不同的部位。执行方法的栈持有特定Ҏ调用的状态(本地变量Q即时计结果等Q?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">Ҏ区和E序计数?/strong></em></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">Ҏ区是字节码呆的地斏V程序计数器跟踪执行U程。当前字节码指o执行后,E序计数器会包含下一条执行指令的地址Q一条指令执行之后,JVM把程序计数器讄为紧跟上一条指令的指o地址Q除非上一条指令具体指明一ơ蟩转?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">Java栈和相关寄存?/strong></em></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">Java栈用来保存字节码指o的参数和执行l果Q给Ҏ传递参数和q回l果Q保存每个方法调用的状态。方法调用的状态被UCؓ调用栈。var寄存器,frame寄存器和optop寄存器指向当前栈帧的不同部位?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">Java栈?个区Q本地变量,执行环境和操作数栈。本地变量区Q包含当前方法调用中使用的所有本地变量。它由vars寄存器指向。执行环境区用来l护栈区本n的操作。它被frame寄存器指向。操作数区用来作为字码指令的工作区。正是在q里Q存攄字节码指令的参数和其q回l果。操作数栈区的顶部被optop寄存器指向?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">执行环境通常夹在本地变量和操作数栈中间。当前执行方法的操作数栈L在栈区的最上面Q所以optop寄存器L指向整个Java栈的剙?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">垃圾攉?/strong></em></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">堆是Java对象生存的地斏VQ何时候,你用new操作W分配的内存Q都来自堆中。Java语言不允怽直接释放分配的内存。运行时环境会跟t堆上每个对象的引用Q自动释N些不被引用的对象所占据的内存,q个q程被称为垃圾收集?/p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">参?/strong></em></p> <ol style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; list-style-position: outside; list-style-image: initial; line-height: 1.714285714;"> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">关于内存寚w方式Q请参?a style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: none; color: #9f9f9f;">Data alignment: Straighten up and fly right</a>?/li> </ol> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;">本文译自Q?a style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: none; color: #9f9f9f;">The lean, mean, virtual machine</a></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">原创文章Q{载请注明Q?/strong> 转蝲?a style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: none; color: #9f9f9f;"><span style="color: #0000ff;">LetsCoding.cn</span></a><br /> <strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">本文链接地址:</strong> <a style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: none; color: #9f9f9f;"><span style="color: #0000ff;">短小_悍的虚拟机QJVM基本l构和功能介l?/span></a></p><img src ="http://www.aygfsteel.com/4cai/aggbug/413789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/4cai/" target="_blank">Rolandz</a> 2014-05-17 21:50 <a href="http://www.aygfsteel.com/4cai/archive/2014/05/17/413789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中,状态模式和{略模式的区?/title><link>http://www.aygfsteel.com/4cai/archive/2014/05/16/413717.html</link><dc:creator>Rolandz</dc:creator><author>Rolandz</author><pubDate>Thu, 15 May 2014 19:23:00 GMT</pubDate><guid>http://www.aygfsteel.com/4cai/archive/2014/05/16/413717.html</guid><wfw:comment>http://www.aygfsteel.com/4cai/comments/413717.html</wfw:comment><comments>http://www.aygfsteel.com/4cai/archive/2014/05/16/413717.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/4cai/comments/commentRss/413717.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/4cai/services/trackbacks/413717.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt; font-family: Arial;">本文转自Q?a ><span style="color: #3366ff;">码农合作C?/span></a>?/span><a target="_blank"><span style="font-size: 12pt; color: #3366ff;">Java中,状态模式和{略模式的区?/span></a><span style="font-size: 12pt; font-family: Arial;"><br /></span><span style="font-size: 12pt; font-family: Arial;"><br />Ja</span><span style="font-size: 12pt; font-family: Arial;">va开发者,要想?/span><span style="font-size: 12pt; font-family: Arial;">当的使用状态模式和{略模式Q必L楚的理解它们之间的区别。虽然状态模式和{略模式拥有怼的结构,虽然它们都基?/span><a style="line-height: 1.714285714; font-size: 14px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: none; color: #9f9f9f;"><span style="font-size: 12pt; font-family: Arial;">SOLID设计原则</span></a><span style="line-height: 1.714285714; font-size: 12pt; font-family: Arial;">中的OQ开闭原则)Q但是,它们的意图是完全不同的?/span> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><span style="font-size: 12pt; font-family: Arial;">{略模式通过装一l相关算法,为Client提供q行时的灉|性。Client可以在运行时Q选择M法Q而不改变使用法的Context。一些流行的{略模式的例子是写那些用算法的代码Q例如加密算法、压~算法、排序算法。另一斚wQ状态模式允许对象,在不同的状态拥有不同的行ؓ。因为现实世界中的对象通常都是有状态的Q所以它们在不同状态,行ؓ也不一栗例如,VMQ自动售货机Q只在hasCoin状态才l你吐商品;你不投币Q它是不会吐的。现在你可以清楚的看出它们的不同之处了:它们的意图是不同的。状态模式帮助对象管理状态,而策略模式允许Client选择不同的行为?/span><br /> </p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><span style="font-size: 12pt; font-family: Arial;">另一个不那么Ҏ能看出来的区别是Q是谁促使了行ؓ的改变。策略模式中Q是Client提供了不同的{略lContextQ状态模式中Q状态{UȝContext或State自己理。另外,如果你在State中管理状态{U,那么它必L有Context的引用。例如,在VM的例子中QState对象需要调用VM的setState()ҎL变它的状态。另一斚wQStrategy从不持有Context的引用,是Client把所选择的Strategy传递给Context。由于状态模式和{略模式的区别,是流行的Java设计原则c面试题之一Q我们将会在本文探讨在Java中,状态模式和{略模式的异同,q可以加׃对它们的理解?/span></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-size: 14pt; font-family: Arial;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">怼之处</strong></em></p><p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><span style="font-size: 12pt; font-family: Arial;">如果你看看状态模式和{略模式的UML图,׃发现它们的结构非常相伹{用State对象改变自己行ؓ的对象被UCؓContext对象Q相似的Q用Strategy对象改变自己行ؓ的对象叫Context对象。记住,Client和Context打交道。在状态模式中QContext把方法调用委托给当前的状态对象,而在{略模式中,Context使用的Strategy对象Q是被当做参C递过来的Q或在Context对象被创建时p提供的?/span></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><img src="http://letscoding.cn/images/State%20Design%20Pattern.png" alt="状态模式UMLcd" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; max-width: 100%; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 4px;" /></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><span style="font-size: 12pt; font-family: Arial;">q是专ؓl典的VM问题而设计的状态模式UMLcd。你可以看出QVM的状态是个接口,它有表示不同状态的具体实现。每一个状态都持有Context的引用,用它来管理由Context触发的行为导致的状态{UR?/span></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><img src="http://letscoding.cn/images/Strategy%20Design%20Pattern%20in%20Java.png" alt="{略模式UMLcd" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; max-width: 100%; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 4px;" /></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><span style="font-size: 12pt; font-family: Arial;">q是专ؓ实现排序功能而设计的{略模式UMLcd。因为存在很多排序算法,该模式让Client在排序时选择适当的算法。事实上QJava的集合框架就使用q个模式Q实C用来排序的Collections.sort()Ҏ。不同的是,它不允许Client选择排序法Q而是让它传递Comparator或Comparable接口的实例来指定比较{略?/span></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><span style="font-size: 12pt; font-family: Arial;">让我们来看看它们之间更多的相g处:</span></p> <ol style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; list-style-position: outside; list-style-image: initial; line-height: 1.714285714;"> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">d新的状态或{略都很ҎQ而且不需要修改用它们的Context对象?/span></li> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">它们都让你的代码W合OCP原则。在状态模式和{略模式中,Context对象对修Ҏ关闭的,d新的状态或{略Q都不需要修改Context?/span></li> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">正如状态模式中的Context会有初始状态一P{略模式同样有默认策略?/span></li> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">状态模式以不同的状态封装不同的行ؓQ而策略模式以不同的策略封装不同的行ؓ?/span></li> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">它们都依赖子cd实现相关行ؓ?/span></li> </ol> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-size: 14pt; font-family: Arial;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">不同之处</strong></em></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><span style="font-size: 12pt; font-family: Arial;">现在我们知道Q状态模式和{略模式的结构是怼的,但它们的意图不同。让我们重温一下它们的主要不同之处Q?/span></p> <ol style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; list-style-position: outside; list-style-image: initial; line-height: 1.714285714;"> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">{略模式装了一l相关算法,它允许Client在运行时使用可互换的行ؓQ状态模式帮助一个类在不同的状态显CZ同的行ؓ?/span></li> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">状态模式封装了对象的状态,而策略模式封装算法或{略。因为状态是跟对象密切相关的Q它不能被重用;而通过从Context中分d{略或算法,我们可以重用它们?/span></li> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">在状态模式中Q每个状态通过持有Context的引用,来实现状态{U;但是每个{略都不持有Context的引用,它们只是被Context使用?/span></li> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">{略实现可以作ؓ参数传递给使用它的对象Q例如Collections.sort()Q它的参数包含一个Comparator{略。另一斚wQ状态是Context对象自己的一部分Q随着旉的推U,Context对象从一个状态{Ud另一个状态?/span></li> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">虽然它们都符合OCP原则Q策略模式也W合SRP原则Q单一职责原则Q,因ؓ每个{略都封装自q法Q且不依赖其他策略。一个策略的改变Qƈ不会D其他{略的变化?/span></li> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">另一个理Z的不同:{略模式定义了对?#8220;怎么?#8221;的部分。例如,排序对象怎么Ҏ据排序。状态模式定义了对象“是什?#8221;?#8220;什么时候做”的部分。例如,对象处于什么状态,什么时候处在某个特定的状态?/span></li> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">状态模式中很好的定义了状态{Uȝơ序Q而策略模式ƈ无此需要:Client可以自由的选择M{略?/span></li> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">一些常见的{略模式的例子是装法Q例如排序算法,加密法或者压~算法。如果你看到你的代码需要用不同类型的相关法Q那么考虑使用{略模式吧。而识别何时用状态模式是很简单的Q如果你需要管理状态和状态{U,但不想用大量嵌套的条g语句Q那么就是它了?/span></li> <li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;"><span style="font-size: 12pt; font-family: Arial;">最后但最重要的一个不同之处是Q策略的改变由Client完成Q而状态的改变Q由Context或状态自己?/span></li> </ol> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><span style="font-size: 12pt; font-family: Arial;">本文译自Q?/span><a style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: none; color: #9f9f9f;"><span style="font-size: 12pt; font-family: Arial;">Difference between State and Strategy Design Pattern in Java</span></a></p> <p style="margin: 1rem 0px; padding: 0px; border: 0px; vertical-align: baseline; line-height: 1.714285714;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-size: 12pt; font-family: Arial;">原创文章Q{载请注明Q?/strong><span style="font-size: 12pt; font-family: Arial;"> 转蝲?/span><a style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: none; color: #9f9f9f; font-size: 12pt; font-family: Arial;"><span style="color: #0000ff;">LetsCoding.cn</span></a><br style="font-size: 12pt; font-family: Arial;" /><span style="font-size: 12pt; font-family: Arial;"> </span><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-size: 12pt; font-family: Arial;">本文链接地址:</strong><span style="font-size: 12pt; font-family: Arial;"> </span><a style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: none; color: #9f9f9f; font-size: 12pt; font-family: Arial;"><span style="color: #0000ff;">Java中,状态模式和{略模式的区?/span></a></p><img src ="http://www.aygfsteel.com/4cai/aggbug/413717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/4cai/" target="_blank">Rolandz</a> 2014-05-16 03:23 <a href="http://www.aygfsteel.com/4cai/archive/2014/05/16/413717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 8QLambda表达式(二)http://www.aygfsteel.com/4cai/archive/2014/05/11/413510.htmlRolandzRolandzSun, 11 May 2014 04:07:00 GMThttp://www.aygfsteel.com/4cai/archive/2014/05/11/413510.htmlhttp://www.aygfsteel.com/4cai/comments/413510.htmlhttp://www.aygfsteel.com/4cai/archive/2014/05/11/413510.html#Feedback2http://www.aygfsteel.com/4cai/comments/commentRss/413510.htmlhttp://www.aygfsteel.com/4cai/services/trackbacks/413510.html阅读全文

Rolandz 2014-05-11 12:07 发表评论
]]>
Java 8QLambda表达式(三)http://www.aygfsteel.com/4cai/archive/2014/05/11/413511.htmlRolandzRolandzSun, 11 May 2014 04:07:00 GMThttp://www.aygfsteel.com/4cai/archive/2014/05/11/413511.htmlhttp://www.aygfsteel.com/4cai/comments/413511.htmlhttp://www.aygfsteel.com/4cai/archive/2014/05/11/413511.html#Feedback0http://www.aygfsteel.com/4cai/comments/commentRss/413511.htmlhttp://www.aygfsteel.com/4cai/services/trackbacks/413511.html阅读全文

Rolandz 2014-05-11 12:07 发表评论
]]>
վ֩ģ壺 ¤| | | | | ߮| µ| ƾ| ӱʡ| | û| | н| ڰ| ʱ| | | | | | | ٹ| | ɽ| | | ij| | ɽ| Ҿ| Ӫ| | ĩ| ԭ| | | | | | ̩| |