﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-gembin-随笔分类-JavaSE</title><link>http://www.blogjava.net/gembin/category/29814.html</link><description>&lt;font color="red"&gt;OSGi, Eclipse Equinox, ECF, Virgo, Gemini,  Apache Felix, Karaf, Aires, Camel, Eclipse RCP&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;
&lt;font color="green"&gt;HBase, Hadoop, ZooKeeper, Cassandra&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;

&lt;font color="blue"&gt;Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;
&lt;font color="black"&gt;
There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.&lt;/font&gt;
&lt;br/&gt;&lt;br/&gt;

&lt;a href="http://about.me/gembin"&gt;About Me&lt;/a&gt;

&lt;script type="text/javascript" src="http://platform.linkedin.com/in.js"&gt;&lt;/script&gt;&lt;script type="in/share" data-counter="right"&gt;&lt;/script&gt;

</description><language>zh-cn</language><lastBuildDate>Sat, 14 Mar 2020 20:31:33 GMT</lastBuildDate><pubDate>Sat, 14 Mar 2020 20:31:33 GMT</pubDate><ttl>60</ttl><item><title>Overriding Vs Hiding  </title><link>http://www.blogjava.net/gembin/archive/2014/05/29/414246.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Thu, 29 May 2014 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2014/05/29/414246.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/414246.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2014/05/29/414246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/414246.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/414246.html</trackback:ping><description><![CDATA[<strong style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;"><a href="http://yuzan.me/">http://yuzan.me/</a><br /><br />Can I override a static method?</strong><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">Many people have heard that you can't override a static method. This is true - you can't. However it is possible to write code like this:</p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;"><code style="font-size: 12px; white-space: nowrap;"><br /><span style="font-weight: bold;">class</span>&nbsp;<span style="color: #002cdd;">Foo</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold;">public</span>&nbsp;<span style="font-weight: bold;">static</span>&nbsp;<span style="color: #002cdd;">void</span>&nbsp;method()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #002cdd;">System</span>.out.println(<span style="color: #bc0000;">"in&nbsp;Foo"</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="font-weight: bold;">class</span>&nbsp;<span style="color: #002cdd;">Bar</span>&nbsp;<span style="font-weight: bold;">extends</span>&nbsp;<span style="color: #002cdd;">Foo</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold;">public</span>&nbsp;<span style="font-weight: bold;">static</span>&nbsp;<span style="color: #002cdd;">void</span>&nbsp;method()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #002cdd;">System</span>.out.println(<span style="color: #bc0000;">"in&nbsp;Bar"</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></code></p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">This compiles and runs just fine. Isn't it an example of a static method overriding another static method? The answer is no - it's an example of a static method&nbsp;<em>hiding</em>&nbsp;another static method. If you try to override a static method, the compiler doesn't actually stop you - it just doesn't do what you think it does.</p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;"><strong>So what's the difference?</strong></p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">Briefly, when you&nbsp;<em>override</em>&nbsp;a method, you still get the benefits of run-time polymorphism, and when you&nbsp;<em>hide</em>, you don't. So what does that mean? Take a look at this code:</p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;"><code style="font-size: 12px; white-space: nowrap;"><br /><span style="font-weight: bold;">class</span>&nbsp;<span style="color: #002cdd;">Foo</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold;">public</span>&nbsp;<span style="font-weight: bold;">static</span>&nbsp;<span style="color: #002cdd;">void</span>&nbsp;classMethod()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #002cdd;">System</span>.out.println(<span style="color: #bc0000;">"classMethod()&nbsp;in&nbsp;Foo"</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold;">public</span>&nbsp;<span style="color: #002cdd;">void</span>&nbsp;instanceMethod()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #002cdd;">System</span>.out.println(<span style="color: #bc0000;">"instanceMethod()&nbsp;in&nbsp;Foo"</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="font-weight: bold;">class</span>&nbsp;<span style="color: #002cdd;">Bar</span>&nbsp;<span style="font-weight: bold;">extends</span>&nbsp;<span style="color: #002cdd;">Foo</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold;">public</span>&nbsp;<span style="font-weight: bold;">static</span>&nbsp;<span style="color: #002cdd;">void</span>&nbsp;classMethod()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #002cdd;">System</span>.out.println(<span style="color: #bc0000;">"classMethod()&nbsp;in&nbsp;Bar"</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold;">public</span>&nbsp;<span style="color: #002cdd;">void</span>&nbsp;instanceMethod()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #002cdd;">System</span>.out.println(<span style="color: #bc0000;">"instanceMethod()&nbsp;in&nbsp;Bar"</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;<br /><span style="font-weight: bold;">class</span>&nbsp;<span style="color: #002cdd;">Test</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold;">public</span>&nbsp;<span style="font-weight: bold;">static</span>&nbsp;<span style="color: #002cdd;">void</span>&nbsp;main(<span style="color: #002cdd;">String</span>[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #002cdd;">Foo</span>&nbsp;f&nbsp;=&nbsp;<span style="font-weight: bold;">new</span>&nbsp;<span style="color: #002cdd;">Bar</span>();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.instanceMethod();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.classMethod();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></code></p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">If you run this, the output is</p><pre style="font-size: 16px; line-height: normal; background-color: #faf7f1;">instanceMethod() in Bar classMethod() in Foo</pre><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">Why do we get instanceMethod from Bar, but classMethod() from Foo? Aren't we using the same instance f to access both of these? Yes we are - but since one is overriding and the other is hiding, we see different behavior.</p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">Since instanceMethod() is (drum roll please...) an instance method, in which Bar&nbsp;<em>overrides</em>&nbsp;the method from Foo, at run time the JVM uses the&nbsp;<em>actual</em>&nbsp;class of the instance f to determine which method to run. Although f was&nbsp;<em>declared</em>&nbsp;as a Foo, the actual instance we created was a new Bar(). So at runtime, the JVM finds that f is a Bar instance, and so it calls instanceMethod() in Bar rather than the one in Foo. That's how Java normally works for instance methods.</p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">With classMethod() though. since (<em>ahem</em>) it's a&nbsp;<em>class</em>&nbsp;method, the compiler and JVM don't expect to need an actual instance to invoke the method. And even if you provide one (which we did: the instance referred to by f) the JVM will never look at it. The compiler will only look at the&nbsp;<em>declared type</em>&nbsp;of the reference, and use that declared type to determine,&nbsp;<em>at compile time</em>, which method to call. Since f is declared as type Foo, the compiler looks at f.classMethod() and decides it means Foo.classMethod. It doesn't matter that the instance reffered to by f is actually a Bar - for static methods, the compiler only uses the declared type of the reference. That's what we mean when we say a static method does not have run-time polymorphism.</p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">Because instance methods and class methods have this important difference in behavior, we use different terms - "overriding" for instance methods and "hiding" for class methods - to distinguish between the two cases. And when we say you can't override a static method, what that means is that even if you write code that&nbsp;<em>looks</em>&nbsp;like it's overriding a static method (like the first Foo and Bar at the top of this page) - it won't&nbsp;<em>behave</em>&nbsp;like an overridden method.</p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;"><strong>So what about accessing a static method using an instance?</strong></p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">It's possible in Java to write something like:</p><pre style="font-size: 16px; line-height: normal; background-color: #faf7f1;">   f.classMethod();</pre><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">where f is an instance of some class, and classMethod() is a class method (i.e. a static method) of that class. This is legal, but it's a bad idea because it creates confusion. The actual&nbsp;<em>instance</em>&nbsp;f is not really important here. Only the&nbsp;<em>declared type</em>&nbsp;of f matters. That is, what class is f declared to be? Since classMethod() is static, the class of f (as determined by the compiler at compile time) is all we need.</p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">Rather than writing:</p><pre style="font-size: 16px; line-height: normal; background-color: #faf7f1;">    f.classMethod();</pre><span style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">It would be better coding style to write either:</span><pre style="font-size: 16px; line-height: normal; background-color: #faf7f1;">    Foo.classMethod();</pre><span style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">or</span><pre style="font-size: 16px; line-height: normal; background-color: #faf7f1;">    Bar.classMethod(); </pre><span style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">That way, it is crystal clear which class method you would like to call. It is also clear that the method you are calling is indeed a class method.</span><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">Barring that, you could always come up with this monstrosity:</p><pre style="font-size: 16px; line-height: normal; background-color: #faf7f1;">    f.getClass().getMethod("classMethod", new Class[]).invoke(null, new Object[]);</pre><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">But all this could be avoided by simply not trying to override your static (class) methods. :-)</p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;"><strong>Why does the compiler sometimes talk about overriding static methods?</strong></p><p style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: normal; background-color: #faf7f1;">Sometimes you will see error messages from the compiler that talk about overriding static methods. Apparently, whoever writes these particular messages has not read the Java Language Specification and does not know the difference between overriding and hiding. So they use incorrect and misleading terminology. Just ignore it. The Java Language Specification is very clear about the difference between overriding and hiding, even if the compiler messages are not. Just pretend that the compiler said "hide" rather than "override"..<br /><br />ref:&nbsp;<span style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px;">http://www.coderanch.com/how-to/java/OverridingVsHiding</span></p><img src ="http://www.blogjava.net/gembin/aggbug/414246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2014-05-29 15:52 <a href="http://www.blogjava.net/gembin/archive/2014/05/29/414246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Exception Practices</title><link>http://www.blogjava.net/gembin/archive/2012/12/26/393525.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Wed, 26 Dec 2012 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2012/12/26/393525.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/393525.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2012/12/26/393525.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/393525.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/393525.html</trackback:ping><description><![CDATA[<strong style="color: red; ">Just keep it for reference.</strong><br /><br /><div><strong style="color: #0000ff; ">Best Practices for Exception Handling</strong></div>http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html<br /><br /><div><strong style="color: #0000ff; ">The Trouble with Checked Exceptions</strong></div><div>http://www.artima.com/intv/handcuffs.html<br /><br /><div><strong style="color: #0000ff; ">Exception-Handling Antipatterns</strong></div><div>http://today.java.net/pub/a/today/2006/04/06/exception-handling-antipatterns.html<br /><br /><div><strong style="color: #0000ff; ">Exception management and error tracking in J2EE</strong></div><div>http://www.javaworld.com/javaworld/jw-07-2005/jw-0711-exception.html?page=1<br /><br /><div><strong style="color: #0000ff; ">Exceptional practices</strong></div><div>http://www.javaworld.com/javaworld/jw-12-2001/jw-1221-exceptions.html?page=1<br /><br /><div><strong style="color: #0000ff; ">Exception Handling</strong><br /><div>http://www.objectsource.com/j2eechapters/Ch18-Exception_Handling.htm</div></div><br /><div><strong style="color: #0000ff; ">Spring MVC REST Exception Handling Best Practices&nbsp;</strong></div>http://www.stormpath.com/blog/spring-mvc-rest-exception-handling-best-practices-part-1<br />http://www.stormpath.com/blog/spring-mvc-rest-exception-handling-best-practices-part-2</div></div></div></div><img src ="http://www.blogjava.net/gembin/aggbug/393525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2012-12-26 23:56 <a href="http://www.blogjava.net/gembin/archive/2012/12/26/393525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The Trouble with Checked Exceptions</title><link>http://www.blogjava.net/gembin/archive/2012/12/26/393523.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Wed, 26 Dec 2012 15:35:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2012/12/26/393523.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/393523.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2012/12/26/393523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/393523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/393523.html</trackback:ping><description><![CDATA[<blockquote style="color: #212324; font-family: Arial, Helvetica, sans-serif; font-size: medium; line-height: normal; background-color: #ffffff; "><strong>Summary</strong><br />Anders Hejlsberg, the lead C# architect, talks with Bruce Eckel and Bill Venners about versionability and scalability issues with checked exceptions.</blockquote><p style="color: #212324; font-family: Arial, Helvetica, sans-serif; font-size: medium; line-height: normal; background-color: #ffffff; ">Anders Hejlsberg, a distinguished engineer at Microsoft, led the team that designed the C# (pronounced C Sharp) programming language. Hejlsberg first vaulted onto the software world stage in the early eighties by creating a Pascal compiler for MS-DOS and CP/M. A very young company called Borland soon hired Hejlsberg and bought his compiler, which was thereafter marketed as Turbo Pascal. At Borland, Hejlsberg continued to develop Turbo Pascal and eventually led the team that designed Turbo Pascal's replacement: Delphi. In 1996, after 13 years with Borland, Hejlsberg joined Microsoft, where he initially worked as an architect of Visual J++ and the Windows Foundation Classes (WFC). Subsequently, Hejlsberg was chief designer of C# and a key participant in the creation of the .NET framework. Currently, Anders Hejlsberg leads the continued development of the C# programming language.</p><p style="color: #212324; font-family: Arial, Helvetica, sans-serif; font-size: medium; line-height: normal; background-color: #ffffff; ">On July 30, 2003, Bruce Eckel, author of&nbsp;<em>Thinking in C++</em>&nbsp;and&nbsp;<em>Thinking in Java</em>, and Bill Venners, editor-in-chief of Artima.com, met with Anders Hejlsberg in his office at Microsoft in Redmond, Washington. In this interview, which will be published in multiple installments on Artima.com and on an audio CD-ROM to be released this fall by Bruce Eckel, Anders Hejlsberg discusses many design choices of the C# language and the .NET framework.</p><ul style="color: #212324; font-family: Arial, Helvetica, sans-serif; font-size: medium; line-height: normal; background-color: #ffffff; "><li>In&nbsp;<a href="http://www.artima.com/intv/csdes.html" style="color: #800080; text-decoration: none; ">Part I: The C# Design Process</a>, Hejlsberg discusses the process used by the team that designed C#, and the relative merits of usability studies and good taste in language design.</li><li>In this second installment, Hejlsberg discusses versionability and scalability issues with checked exceptions.<br /><br /><h1>Remaining Neutral on Checked Exceptions</h1><p><strong>Bruce Eckel</strong>: C# doesn't have checked exceptions. How did you decide whether or not to put checked exceptions into C#?</p><p><strong>Anders Hejlsberg</strong>: I see two big issues with checked exceptions: scalability and versionability. I know you've written some about checked exceptions too, and you tend to agree with our line of thinking.</p><p><strong>Bruce Eckel</strong>: I used to think that checked exceptions were really great.</p><p><strong>Anders Hejlsberg</strong>: Exactly. Frankly, they look really great up front, and there's nothing wrong with the idea. I completely agree that checked exceptions are a wonderful feature. It's just that particular implementations can be problematic. By implementing checked exceptions the way it's done in Java, for example, I think you just take one set of problems and trade them for another set of problems. In the end it's not clear to me that you actually make life any easier. You just make it different.</p><p><strong>Bruce Eckel</strong>: Was there a lot of disagreement in the C# design team about checked excpetions?</p><p><strong>Anders Hejlsberg</strong>: No, I think there was fairly broad agreement in our design group.</p><p>C# is basically silent on the checked exceptions issue. Once a better solution is known&#8212;and trust me we continue to think about it&#8212;we can go back and actually put something in place. I'm a strong believer that if you don't have anything right to say, or anything that moves the art forward, then you'd better just be completely silent and neutral, as opposed to trying to lay out a framework.</p><p>If you ask beginning programmers to write a calendar control, they often think to themselves, "Oh, I'm going to write the world's best calendar control! It's going to be polymorphic with respect to the kind of calendar. It will have displayers, and mungers, and this, that, and the other." They need to ship a calendar application in two months. They put all this infrastructure into place in the control, and then spend two days writing a crappy calendar application on top of it. They'll think, "In the next version of the application, I'm going to do so much more."</p><p>Once they start thinking about how they're actually going to implement all of these other concretizations of their abstract design, however, it turns out that their design is completely wrong. And now they've painted themself into a corner, and they have to throw the whole thing out. I have seen that over and over. I'm a strong believer in being minimalistic. Unless you actually are going to solve the general problem, don't try and put in place a framework for solving a specific one, because you don't know what that framework should look like.</p><p><strong>Bruce Eckel</strong>: The Extreme Programmers say, "Do the simplest thing that could possibly work."</p><p><strong>Anders Hejlsberg</strong>: Yeah, well, Einstein said that, "Do the simplest thing possible, but no simpler." The concern I have about checked exceptions is the handcuffs they put on programmers. You see programmers picking up new APIs that have all these throws clauses, and then you see how convoluted their code gets, and you realize the checked exceptions aren't helping them any. It is sort of these dictatorial API designers telling you how to do your exception handling. They should not be doing that.<br /><br /><h1>Versioning with Checked Exceptions</h1><p><strong>Bill Venners</strong>: You mentioned scalability and versioning concerns with respect to checked exceptions. Could you clarify what you mean by those two issues?</p><p><strong>Anders Hejlsberg</strong>: Let's start with versioning, because the issues are pretty easy to see there. Let's say I create a method&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">foo</code>&nbsp;that declares it throws exceptions&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">A</code>,&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">B</code>, and&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">C</code>. In version two of&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">foo</code>, I want to add a bunch of features, and now&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">foo</code>&nbsp;might throw exception&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">D</code>. It is a breaking change for me to add&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">D</code>&nbsp;to the throws clause of that method, because existing caller of that method will almost certainly not handle that exception.</p><p>Adding a new exception to a throws clause in a new version breaks client code. It's like adding a method to an interface. After you publish an interface, it is for all practical purposes immutable, because any implementation of it might have the methods that you want to add in the next version. So you've got to create a new interface instead. Similarly with exceptions, you would either have to create a whole new method called&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">foo2</code>&nbsp;that throws more exceptions, or you would have to catch exception&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">D</code>&nbsp;in the new&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">foo</code>, and transform the&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">D</code>&nbsp;into an&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">A</code>,<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">B</code>, or&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">C</code>.</p><p><strong>Bill Venners</strong>: But aren't you breaking their code in that case anyway, even in a language without checked exceptions? If the new version of&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">foo</code>&nbsp;is going to throw a new exception that clients should think about handling, isn't their code broken just by the fact that they didn't expect that exception when they wrote the code?</p><p><strong>Anders Hejlsberg</strong>: No, because in a lot of cases, people don't care. They're not going to handle any of these exceptions. There's a bottom level exception handler around their message loop. That handler is just going to bring up a dialog that says what went wrong and continue. The programmers protect their code by writing try finally's everywhere, so they'll back out correctly if an exception occurs, but they're not actually interested in handling the exceptions.</p><p>The throws clause, at least the way it's implemented in Java, doesn't necessarily force you to handle the exceptions, but if you don't handle them, it forces you to acknowledge precisely which exceptions might pass through. It requires you to either catch declared exceptions or put them in your own throws clause. To work around this requirement, people do ridiculous things. For example, they decorate every method with, "<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">throws Exception</code>." That just completely defeats the feature, and you just made the programmer write more gobbledy gunk. That doesn't help anybody.</p><p><strong>Bill Venners</strong>: So you think the more common case is that callers don't explicitly handle exceptions in deference to a general catch clause further up the call stack?</p><p><strong>Anders Hejlsberg</strong>: It is funny how people think that the important thing about exceptions is handling them. That is not the important thing about exceptions. In a well-written application there's a ratio of ten to one, in my opinion, of try finally to try catch. Or in C#,&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">using</code>&nbsp;statements, which are like try finally.</p><p><strong>Bill Venners</strong>: What's in the finally?</p><p><strong>Anders Hejlsberg</strong>: In the finally, you protect yourself against the exceptions, but you don't actually handle them. Error handling you put somewhere else. Surely in any kind of event-driven application like any kind of modern UI, you typically put an exception handler around your main message pump, and you just handle exceptions as they fall out that way. But you make sure you protect yourself all the way out by deallocating any resources you've grabbed, and so forth. You clean up after yourself, so you're always in a consistent state. You don't want a program where in 100 different places you handle exceptions and pop up error dialogs. What if you want to change the way you put up that dialog box? That's just terrible. The exception handling should be centralized, and you should just protect yourself as the exceptions propagate out to the handler.<br /><br /><h1>The Scalability of Checked Exceptions</h1><strong>Bill Venners</strong>: What is the scalability issue with checked exceptions?<p><strong>Anders Hejlsberg</strong>: The scalability issue is somewhat related to the versionability issue. In the small, checked exceptions are very enticing. With a little example, you can show that you've actually checked that you caught the&nbsp;<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">FileNotFoundException</code>, and isn't that great? Well, that's fine when you're just calling one API. The trouble begins when you start building big systems where you're talking to four or five different subsystems. Each subsystem throws four to ten exceptions. Now, each time you walk up the ladder of aggregation, you have this exponential hierarchy below you of exceptions you have to deal with. You end up having to declare 40 exceptions that you might throw. And once you aggregate that with another subsystem you've got 80 exceptions in your throws clause. It just balloons out of control.</p><p>In the large, checked exceptions become such an irritation that people completely circumvent the feature. They either say, "<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">throws Exception</code>," everywhere; or&#8212;and I can't tell you how many times I've seen this&#8212;they say, "<code style="font-family: 'Lucida Console', 'American Typewriter', 'Courier New', Courier, monospace; font-size: 0.95em; ">try, da da da da da, catch curly curly</code>." They think, "Oh I'll come back and deal with these empty catch clauses later," and then of course they never do. In those situations, checked exceptions have actually degraded the quality of the system in the large.</p><p>And so, when you take all of these issues, to me it just seems more thinking is needed before we put some kind of checked exceptions mechanism in place for C#. But that said, there's certainly tremendous value in knowing what exceptions can get thrown, and having some sort of tool that checks. I don't think we can construct hard and fast rules down to, it is either a compiler error or not. But I think we can certainly do a lot with analysis tools that detect suspicious code, including uncaught exceptions, and points out those potential holes to you.<br /><br />from: &nbsp;http://www.artima.com/intv/handcuffs.html<br /><br /></p></p></p></li></ul><img src ="http://www.blogjava.net/gembin/aggbug/393523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2012-12-26 23:35 <a href="http://www.blogjava.net/gembin/archive/2012/12/26/393523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Comparing the syntax of Java 5 and ActionScript 3</title><link>http://www.blogjava.net/gembin/archive/2012/07/07/382482.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Sat, 07 Jul 2012 14:44:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2012/07/07/382482.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/382482.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2012/07/07/382482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/382482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/382482.html</trackback:ping><description><![CDATA[<div style="font-family: Verdana, Helvetica, sans-serif; font-size: 12px; line-height: normal; text-align: left; background-color: #ffffff; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">This list is not complete, and your input is appreciated.</p><table cellspacing="0" cellpadding="0" border="1" style="border: medium none; border-collapse: collapse; "><tbody><tr><td valign="top" style="border: 1pt solid windowtext; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><strong>Concept/Language Construct</strong></p></td><td valign="top" style="border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><strong>Java 5.0</strong></p></td><td valign="top" style="border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><strong>ActionScript 3.0</strong></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Class library packaging</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">.jar</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">.swc</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Inheritance</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">class Employee extends Person{&#8230;}</span></p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">class Employee extends Person{&#8230;}</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Variable declaration and initialization</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">String firstName=&#8221;John&#8221;;</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">Date shipDate=new Date();</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">int i;</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">int a, b=10;</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">double salary;</span></p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">var firstName:String=&#8221;John&#8221;;</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">var shipDate:Date=new Date();</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">var i:int;</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">var a:int, b:int=10;</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">var salary:Number;</span></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Undeclared variables</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">n/a</span></p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 9pt; font-family: Utopia; ">It&#8217;s an equivalent to the wild card type notation *. If you declare a variable but do not specify its type, the * type will apply.</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 9pt; font-family: Utopia; ">A default value:</span><span style="font-size: 10pt; ">&nbsp;undefined</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var myVar:*;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Variable scopes</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">block: declared within curly braces,<br />local: declared within a method or a block</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">member: declared on the class level</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">no global variables</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">No block scope: the minimal scope is a function</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">local: declared within a function</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">member: declared on the class level</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">If a variable is declared outside of any function or class definition, it has global scope.</span></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Strings</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Immutable, store sequences of two-byte Unicode characters</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Immutable, store sequences of two-byte Unicode characters</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Terminating statements with semicolons</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">A must</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">If you write one statement per line you can omit it.</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Strict equality operator</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">n/a</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">===</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">for strict non-equality use</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">!==</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Constant qualifier</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">The keyword final</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">final int STATE=&#8221;NY&#8221;;</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">The keyword const</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">const STATE:int =&#8221;NY&#8221;;</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Type checking</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Static (checked at compile time)</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">Dynamic (checked at run-time) and static (it&#8217;s so called &#8216;strict mode&#8217;, which is default in Flex Builder)</span></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Type check operator</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">instanceof</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">is<span style="font-size: 10pt; ">&nbsp;&#8211; checks data type, i.e. if (myVar is String){&#8230;}</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">The is operator is a replacement of older instanceof</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">The as operator</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">n/a</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Similar to is operator, but returns not Boolean, but the result of expression:</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var orderId:String=&#8221;123&#8221;;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var orderIdN:Number=orderId as Number;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">trace(orderIdN);//prints 123</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Primitives</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">byte, int, long, float, double,short, boolean, char</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">all primitives in ActionScript are<span style="font-size: 10pt; ">objects.<br />Boolean, int, uint, Number, String</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">The following lines are equivalent;</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var age:int = 25;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var age:int = new int(25);</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Complex types</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">n/a</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Array, Date, Error, Function, RegExp, XML, and XMLList</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Array declaration and instantiation</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">int quarterResults[];</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">quarterResults =<br />new int[4];</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">int quarterResults[]={25,33,56,84};</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var quarterResults:Array<br />=new Array();</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">or</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var quarterResults:Array=[];</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var quarterResults:Array=<br />[25, 33, 56, 84];</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">AS3 also has associative arrays that uses named elements instead of numeric indexes (similar to Hashtable).</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">The top class in the inheritance tree</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">Object</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">Object</span></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Casting syntax: cast the class Object to Person:</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Person p=(Person) myObject;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var p:Person= Person(myObject);</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">or</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px 0.4em 0in; ">var p:Person= myObject as Person;</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">upcasting</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">class Xyz extends Abc{}</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Abc myObj = new Xyz();</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">class Xyz extends Abc{}</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var myObj:Abc=new Xyz();</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Un-typed variable</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">n/a</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">var myObject:*</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">var myObject:</span></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">packages</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">package com.xyz;</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">class myClass {&#8230;}</span></p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">package com.xyz{</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">class myClass{&#8230;}</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">}</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">ActionScript packages can include not only classes, but separate functions as well</span></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Class access levels</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">public, private, protected</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">if none is specified, classes have package access level</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">public, private, protected</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">if none is specified, classes have<span style="font-size: 8pt; ">internal</span>&nbsp;access level (similar to package access level in Java)</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Custom access levels: namespaces</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">n/a</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">Similar to XML namespaces.</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">namespace abc;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">abc function myCalc(){}</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">or</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">abc::myCalc(){}</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">use namespace abc ;</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Console output</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">System.out.println();</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">// in debug mode only</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">trace();</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">imports</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">import com.abc.*;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">import com.abc.MyClass;</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">import com.abc.*;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">import com.abc.MyClass;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">packages must be imported even if the class names are fully qualified in the code.</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Unordered key-value pairs</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Hashtable, Map</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Hashtable friends = new Hashtable();</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">friends.put(&#8220;good&#8221;,<br />&#8220;Mary&#8221;);</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">friends.put(&#8220;best&#8221;,<br />&#8220;Bill&#8221;);</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">friends.put(&#8220;bad&#8221;,<br />&#8220;Masha&#8221;);</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">String bestFriend= friends.get(&#8220;best&#8221;);</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">// bestFriend is Bill</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Associative Arrays</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Allows referencing its elements by names instead of indexes.</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var friends:Array=new Array();<br />friends["good"]=&#8221;Mary&#8221;;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">friends["best"]=&#8221;Bill&#8221;;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">friends["bad"]=&#8221;Masha&#8221;;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">var&nbsp;</span>bestFriend:String= friends[&#8220;best&#8221;]</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">friends.best=&#8221;Alex&#8221;;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Another syntax:</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var car:Object = {make:&#8221;Toyota&#8221;, model:&#8221;Camry&#8221;};</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">trace (car["make"], car.model);</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">// Output: Toyota Camry</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Hoisting</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">n/a</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">Compiler moves all variable declarations to the top of the function, so you can use a variable name even before it&#8217;s been explicitly declared in the code.</span></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Instantiation objects from classes</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">Customer cmr = new Customer();</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">Class cls = Class.forName(&#8220;Customer&#8221;);</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">Object myObj= cls.newInstance();</span></p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">var cmr:Customer = new Customer();</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var cls:Class = flash.util.getClassByName(&#8220;Customer&#8221;);<br />var myObj:Object = new cls();</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Private classes</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">private class myClass{&#8230;}</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">There is no private classes in AS3.</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Private constructors</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Supported. Typical use: singleton classes.</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Not available. Implementation of private constructors is postponed as they are not the part of the ECMAScript standard yet.</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">To create a Singleton, use public static getInstance(), which sets a private flag instanceExists after the first instantiation. Check this flag in the public constructor, and if instanceExists==true, throw an error.</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Class and file names</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">A file can have multiple class declarations, but only one of them can be public, and the file must have the same name as this class.</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">A file can have multiple class declarations, but only one of them can be placed inside the package declaration, and the file must have the same name as this class.</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">What can be placed in a package</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Classes and interfaces</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Classes, interfaces, variables, functions, namespaces, and executable statements.</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Dynamic classes (define an object that can be altered at runtime by adding or changing properties and methods).</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">n/a</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">dynamic class Person {</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var name:String;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">}</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">//Dynamically add a variable // and a function</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">var p:Person = new Person();</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">p.name=&#8221;Joe&#8221;;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">p.age=25;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">p.printMe = function () {</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">trace (p.name, p.age);</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">}</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">p.printMe(); // Joe 25</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">function closures</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">n/a. Closure is a proposed addition to Java 7.</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 8pt; ">myButton.addEventListener(&#8220;click&#8221;, myMethod);</span></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 10pt; ">A closure is an object that represents a snapshot of a function with its lexical context (variable&#8217;s values, objects in the scope). A function closure can be passed as an argument and executed without being a part of any object</span></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Abstract classes</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">supported</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">n/a</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Function overriding</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">supported</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Supported. You must use the override qualifier</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Function overloading</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">supported</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Not supported.</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Interfaces</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">class A implements B{&#8230;}</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">interfaces can contain method declarations and final variables.</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">class A implements B{&#8230;}</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">interfaces can contain only function declarations.</p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Exception handling</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 9pt; font-family: Utopia; ">Keywords:</span>&nbsp;try, catch, throw, finally, throws</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Uncaught exceptions are propagated to the calling method.</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><span style="font-size: 9pt; font-family: Utopia; ">Keywords:&nbsp;</span>try, catch, throw, finally</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">A method does not have to declare exceptions.</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Can throw not only Error objects, but also numbers:</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">throw 25.3;</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Flash Player terminates the script in case of uncaught exception.</p><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "></p></td></tr><tr><td valign="top" style="border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 145px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Regular expressions</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 168px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Supported</p></td><td valign="top" style="border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 229px; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; ">Supported</p></td></tr></tbody></table></div><div style="font-family: Verdana, Helvetica, sans-serif; font-size: 12px; line-height: normal; text-align: left; background-color: #ffffff; "><p style="font-size: 1em; line-height: 1.5em; margin: 0.4em 0px; "><br /></p></div><img src ="http://www.blogjava.net/gembin/aggbug/382482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2012-07-07 22:44 <a href="http://www.blogjava.net/gembin/archive/2012/07/07/382482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Deep Copy And Shallow Copy</title><link>http://www.blogjava.net/gembin/archive/2012/04/07/373545.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Sat, 07 Apr 2012 10:41:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2012/04/07/373545.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/373545.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2012/04/07/373545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/373545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/373545.html</trackback:ping><description><![CDATA[<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-family: Verdana, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; ">Lets first separate it out and see what each one means.</p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-family: Verdana, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "></p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-family: Verdana, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "><u style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><em style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">What is Shallow Copy?</em></u></p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-family: Verdana, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; ">Shallow copy is a bit-wise copy of an object. A new object is created that has an exact copy of the values in the original object. If any of the fields of the object are references to other objects, just the reference addresses are copied i.e., only the memory address is copied.</p>
<img src="http://www.jusfortechies.com/images/core-java/shallow_copy.png" alt="Shallow Copy" align="middle" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; outline-width: 0px; outline-style: initial; outline-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #fafafa; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dcdcdc; border-right-color: #dcdcdc; border-bottom-color: #dcdcdc; border-left-color: #dcdcdc; border-image: initial; font-family: Verdana, sans-serif; font-size: 12px; line-height: 19px; " />
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-family: Verdana, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; ">In this figure, the MainObject1 have fields "field1" of int type, and "ContainObject1" of ContainObject type. When you do a shallow copy of MainObject1, MainObject2 is created with "field3" containing the copied value of "field1" and still pointing to ContainObject1 itself. Observe here and you will find that since field1 is of primitive type, the values of it are copied to field3 but ContainedObject1 is an object, so MainObject2 is still pointing to ContainObject1. So any changes made to ContainObject1 in MainObject1 will reflect in MainObject2.</p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-family: Verdana, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; ">Now if this is shallow copy, lets see what's deep copy?</p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-family: Verdana, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "><u style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><em style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">What is Deep Copy?</em></u></p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-family: Verdana, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; ">A deep copy copies all fields, and makes copies of dynamically allocated memory pointed to by the fields. A deep copy occurs when an object is copied along with the objects to which it refers.</p>
<img src="http://www.jusfortechies.com/images/core-java/deep_copy.png" alt="Deep Copy" align="middle" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; outline-width: 0px; outline-style: initial; outline-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #fafafa; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #dcdcdc; border-right-color: #dcdcdc; border-bottom-color: #dcdcdc; border-left-color: #dcdcdc; border-image: initial; font-family: Verdana, sans-serif; font-size: 12px; line-height: 19px; " />
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; font-family: Verdana, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; ">In this figure, the MainObject1 have fields "field1" of int type, and "ContainObject1" of ContainObject type. When you do a deep copy of MainObject1, MainObject2 is created with "field3" containing the copied value of "field1" and "ContainObject2" containing the copied value of ContainObject1.So any changes made to ContainObject1 in MainObject1 will not reflect in MainObject2.<br />
</p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">Well, here we are with what shallow copy and deep copy are and obviously the difference between them. Now lets see how to implement them in java.</p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><u style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><em style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">How to implement shallow copy in java?</em></u></p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">Here is an example of Shallow Copy implementation<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Subject&nbsp;{<br />
<span style="color: #008080; ">&nbsp;2</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;name;<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getName()&nbsp;{<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;name;<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setName(String&nbsp;s)&nbsp;{<br />
<span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;s;<br />
<span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">12</span>&nbsp;<br />
<span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Subject(String&nbsp;s)&nbsp;{<br />
<span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;s;<br />
<span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">16</span>&nbsp;}<br />
<span style="color: #008080; ">17</span>&nbsp;<br />
<span style="color: #008080; ">18</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Student&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Cloneable&nbsp;{<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Contained&nbsp;object</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Subject&nbsp;subj;<br />
<span style="color: #008080; ">21</span>&nbsp;<br />
<span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;name;<br />
<span style="color: #008080; ">23</span>&nbsp;<br />
<span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Subject&nbsp;getSubj()&nbsp;{<br />
<span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;subj;<br />
<span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">27</span>&nbsp;<br />
<span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getName()&nbsp;{<br />
<span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;name;<br />
<span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">31</span>&nbsp;<br />
<span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setName(String&nbsp;s)&nbsp;{<br />
<span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;s;<br />
<span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">35</span>&nbsp;<br />
<span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Person(String&nbsp;s,&nbsp;String&nbsp;sub)&nbsp;{<br />
<span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;s;<br />
<span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subj&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Subject(sub);<br />
<span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">40</span>&nbsp;<br />
<span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object&nbsp;clone()&nbsp;{<br />
<span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">shallow&nbsp;copy</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
<span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">super</span>.clone();<br />
<span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(CloneNotSupportedException&nbsp;e)&nbsp;{<br />
<span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />
<span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">49</span>&nbsp;}<br />
<span style="color: #008080; ">50</span>&nbsp;<br />
<span style="color: #008080; ">51</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;CopyTest&nbsp;{<br />
<span style="color: #008080; ">52</span>&nbsp;<br />
<span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
<span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Original&nbsp;Object</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;Student&nbsp;stud&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Student("John",&nbsp;"Algebra");<br />
<span style="color: #008080; ">56</span>&nbsp;<br />
<span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Original&nbsp;Object:&nbsp;"&nbsp;+&nbsp;stud.getName()&nbsp;+&nbsp;"&nbsp;-&nbsp;"<br />
<span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;stud.getSubject().getName());<br />
<span style="color: #008080; ">59</span>&nbsp;<br />
<span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Clone&nbsp;Object</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;Student&nbsp;clonedStud&nbsp;=&nbsp;(Student)&nbsp;stud.clone();<br />
<span style="color: #008080; ">62</span>&nbsp;<br />
<span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Cloned&nbsp;Object:&nbsp;"&nbsp;+&nbsp;clonedStud.getName()&nbsp;+&nbsp;"&nbsp;-&nbsp;"<br />
<span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;clonedStud.getSubject().getName());<br />
<span style="color: #008080; ">65</span>&nbsp;<br />
<span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stud.setStudentName("Dan");<br />
<span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stud.getSubject().setSubjectName("Physics");<br />
<span style="color: #008080; ">68</span>&nbsp;<br />
<span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Original&nbsp;Object&nbsp;after&nbsp;it&nbsp;is&nbsp;updated:&nbsp;"&nbsp;<br />
<span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;stud.getName()&nbsp;+&nbsp;"&nbsp;-&nbsp;"&nbsp;+&nbsp;stud.getStudent().getName());<br />
<span style="color: #008080; ">71</span>&nbsp;<br />
<span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Cloned&nbsp;Object&nbsp;after&nbsp;updating&nbsp;original&nbsp;object:&nbsp;"<br />
<span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;clonedStud.getName()&nbsp;+&nbsp;"&nbsp;-&nbsp;"&nbsp;+&nbsp;clonedStud.getSubject().getName());<br />
<span style="color: #008080; ">74</span>&nbsp;<br />
<span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">76</span>&nbsp;}<br />
<font color="#008080"><br />
</font>Output&nbsp;is:<br />
Original&nbsp;Object:&nbsp;John&nbsp;-&nbsp;Algebra<br />
Cloned&nbsp;Object:&nbsp;John&nbsp;-&nbsp;Algebra<br />
Original&nbsp;Object&nbsp;after&nbsp;it&nbsp;is&nbsp;updated:&nbsp;Dan&nbsp;-&nbsp;Physics<br />
Cloned&nbsp;Object&nbsp;after&nbsp;updating&nbsp;original&nbsp;object:&nbsp;John&nbsp;-&nbsp;Physics</div>
<br />
In this example, all I did is, implement the class that you want to copy with Clonable interface and override clone() method of Object class and call super.clone() in it. If you observe, the changes made to "name" field of original object (Student class) is not reflected in cloned object but the changes made to "name" field of contained object (Subject class) is reflected in cloned object. This is because the cloned object carries the memory address of the Subject object but not the actual values. Hence any updates on the Subject object in Original object will reflect in Cloned object.
<p>&nbsp;</p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><u style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><em style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">How to implement deep copy in java?</em></u></p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">Here is an example of Deep Copy implementation. This is the same example of Shallow Copy implementation and hence I didnt write the Subject and CopyTest classes as there is no change in them.<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Student&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Cloneable&nbsp;{<br />
<span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Contained&nbsp;object</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Subject&nbsp;subj;<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;name;<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Subject&nbsp;getSubj()&nbsp;{<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;subj;<br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">10</span>&nbsp;<br />
<span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getName()&nbsp;{<br />
<span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;name;<br />
<span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">14</span>&nbsp;<br />
<span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setName(String&nbsp;s)&nbsp;{<br />
<span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;s;<br />
<span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">18</span>&nbsp;<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Person(String&nbsp;s,&nbsp;String&nbsp;sub)&nbsp;{<br />
<span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;s;<br />
<span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subj&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Subject(sub);<br />
<span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">23</span>&nbsp;<br />
<span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object&nbsp;clone()&nbsp;{<br />
<span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">deep&nbsp;copy</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
<span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Deep&nbsp;copy</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Student&nbsp;s&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Student(name,&nbsp;subj.getName());<br />
<span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;s;<br />
<span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(CloneNotSupportedException&nbsp;e)&nbsp;{<br />
<span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />
<span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">34</span>&nbsp;}<br />
&nbsp;<br />
&nbsp;Output&nbsp;is:<br />
&nbsp;Original&nbsp;Object:&nbsp;John&nbsp;-&nbsp;Algebra<br />
&nbsp;Cloned&nbsp;Object:&nbsp;John&nbsp;-&nbsp;Algebra<br />
&nbsp;Original&nbsp;Object&nbsp;after&nbsp;it&nbsp;is&nbsp;updated:&nbsp;Dan&nbsp;-&nbsp;Physics<br />
&nbsp;Cloned&nbsp;Object&nbsp;after&nbsp;updating&nbsp;original&nbsp;object:&nbsp;Dan&nbsp;-&nbsp;Physics</div>
<p>&nbsp;</p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">Well, if you observe here in the "Student" class, you will see only the change in the "clone()" method. Since its a deep copy, you need to create an object of the cloned class. Well if you have have references in the Subject class, then you need to implement Cloneable interface in Subject class and override clone method in it and this goes on and on.</p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><u style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><em style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">There is an alternative way for deep copy.</em></u></p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">Yes, there is. You can do deep copy through&nbsp;serialization. What does serialization do? It writes out the whole object graph into a persistant store and read it back when needed, which means you will get a copy of the whole object graph whne you read it back. This is exactly what you want when you deep copy an object. Note, when you deep copy through serialization, you should make sure that all classes in the object's graph are serializable. Let me explain you this alternative way with an example.<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ColoredCircle&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Serializable<br />
<span style="color: #008080; ">&nbsp;2</span>&nbsp;{<br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x;<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;y;<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ColoredCircle(<span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;y){<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.x&nbsp;=&nbsp;x;<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.y&nbsp;=&nbsp;y;<br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">10</span>&nbsp;<br />
<span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;getX(){<br />
<span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;x;<br />
<span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">14</span>&nbsp;<br />
<span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setX(<span style="color: #0000FF; ">int</span>&nbsp;x){<br />
<span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.x&nbsp;=&nbsp;x;<br />
<span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">18</span>&nbsp;<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;getY(){<br />
<span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;y;<br />
<span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">22</span>&nbsp;<br />
<span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setX(<span style="color: #0000FF; ">int</span>&nbsp;x){<br />
<span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.x&nbsp;=&nbsp;x;<br />
<span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">26</span>&nbsp;}<br />
<span style="color: #008080; ">27</span>&nbsp;<br />
<span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DeepCopy<br />
<span style="color: #008080; ">29</span>&nbsp;{<br />
<span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)<br />
<span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;oos&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
<span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;ois&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
<span style="color: #008080; ">34</span>&nbsp;<br />
<span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span><br />
<span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;create&nbsp;original&nbsp;serializable&nbsp;object</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColoredCircle&nbsp;c1&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ColoredCircle(100,100);<br />
<span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;print&nbsp;it</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Original&nbsp;=&nbsp;"&nbsp;+&nbsp;c1);<br />
<span style="color: #008080; ">41</span>&nbsp;<br />
<span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColoredCircle&nbsp;c2&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
<span style="color: #008080; ">43</span>&nbsp;<br />
<span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;deep&nbsp;copy</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayOutputStream&nbsp;bos&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ByteArrayOutputStream();&nbsp;<br />
<span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oos&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ObjectOutputStream(bos);&nbsp;<br />
<span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;serialize&nbsp;and&nbsp;pass&nbsp;the&nbsp;object</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oos.writeObject(c1);&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oos.flush();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayInputStream&nbsp;bin&nbsp;=&nbsp;<br />
<span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ByteArrayInputStream(bos.toByteArray());&nbsp;<br />
<span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ois&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ObjectInputStream(bin);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;return&nbsp;the&nbsp;new&nbsp;object</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c2&nbsp;=&nbsp;ois.readObject();&nbsp;<br />
<span style="color: #008080; ">55</span>&nbsp;<br />
<span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;verify&nbsp;it&nbsp;is&nbsp;the&nbsp;same</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Copied&nbsp;&nbsp;&nbsp;=&nbsp;"&nbsp;+&nbsp;c2);<br />
<span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;change&nbsp;the&nbsp;original&nbsp;object's&nbsp;contents</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c1.setX(200);<br />
<span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c1.setY(200);<br />
<span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;see&nbsp;what&nbsp;is&nbsp;in&nbsp;each&nbsp;one&nbsp;now</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Original&nbsp;=&nbsp;"&nbsp;+&nbsp;c1);<br />
<span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Copied&nbsp;&nbsp;&nbsp;=&nbsp;"&nbsp;+&nbsp;c2);<br />
<span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>(Exception&nbsp;e)<br />
<span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Exception&nbsp;in&nbsp;main&nbsp;=&nbsp;"&nbsp;+&nbsp;&nbsp;e);<br />
<span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">finally</span><br />
<span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oos.close();<br />
<span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ois.close();<br />
<span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">75</span>&nbsp;}<br />
<font color="#008080"><br />
</font>&nbsp;The&nbsp;output&nbsp;is:<br />
&nbsp;Original&nbsp;=&nbsp;x=100,y=100<br />
&nbsp;Copied&nbsp;&nbsp;&nbsp;=&nbsp;x=100,y=100<br />
&nbsp;Original&nbsp;=&nbsp;x=200,y=200<br />
&nbsp;Copied&nbsp;&nbsp;&nbsp;=&nbsp;x=100,y=100</div>
<br />
All you need to do here is:<br />
<ul>
     <li><span style="text-align: left; ">Ensure that all classes in the object's graph are serializable.</span></li>
     <li><span style="text-align: left; ">Create input and output streams.</span></li>
     <li><span style="text-align: left; ">Use the input and output streams to create object input and object output streams.</span></li>
     <li><span style="text-align: left; ">Pass the object that you want to copy to the object output stream.</span></li>
     <li><span style="text-align: left; ">Read the new object from the object input stream and cast it back to the class of the object you sent.</span></li>
</ul>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">In this example, I have created a ColoredCircle object, c1 and then serialized it (write it out to ByteArrayOutputStream). Then I deserialed the serialized object and saved it in c2. Later I modified the original object, c1. Then if you see the result, c1 is different from c2. c2 is deep copy of first version of c1. So its just a copy and not a reference. Now any modifications to c1 wont affect c2, the deep copy of first version of c1.</p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><u style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><em style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">Well this approach has got its own limitations and issues:</em></u></p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">As you cannot serialize a transient variable, using this approach you cannot copy the transient variables.&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; " />
Another issue is dealing with the case of a class whose object's instances within a virtual machine must be controlled. This is a special case of the Singleton pattern, in which a class has only one object within a VM. As discussed above, when you serialize an object, you create a totally new object that will not be unique. To get around this default behavior you can use the readResolve() method to force the stream to return an appropriate object rather than the one that was serialized. In this particular case, the appropriate object is the same one that was serialized.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; " />
Next one is the performance issue. Creating a socket, serializing an object, passing it through the socket, and then deserializing it is slow compared to calling methods in existing objects. I say, there will be vast difference in the performance. If your code is performance critical, I suggest dont go for this approach. It takes almost 100 times more time to deep copy the object than the way you do by implementing Clonable interface.</p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><u style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><em style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">When to do shallow copy and deep copy?</em></u></p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">Its very simple that if the object has only primitive fields, then obviously you will go for shallow copy but if the object has references to other objects, then based on the requiement, shallow copy or deep copy should be chosen. What I mean here is, if the references are not modified anytime, then there is no point in going for deep copy. You can just opt shallow copy. But if the references are modified often, then you need to go for deep copy. Again there is no hard and fast rule, it all depends on the requirement.</p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><u style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><em style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">Finally lets have a word about rarely used option - Lazy copy</em></u></p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; ">A lazy copy is a combination of both shallow copy and deep copy. When initially copying an object, a (fast) shallow copy is used. A counter is also used to track how many objects share the data. When the program wants to modify the original object, it can determine if the data is shared (by examining the counter) and can do a deep copy at that time if necessary.</p>
<p style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; "><iframe allowtransparency="true" frameborder="0" height="90" hspace="0" marginwidth="0" marginheight="0" scrolling="no" vspace="0" width="728" id="aswift_3" name="aswift_3" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; left: 0px; position: absolute; top: 0px; "></iframe>Lazy copy looks to the outside just as a deep copy but takes advantage of the speed of a shallow copy whenever possible. It can be used when the references in the original object are not modified often. The downside are rather high but constant base costs because of the counter. Also, in certain situations, circular references can also cause problems.</p><img src ="http://www.blogjava.net/gembin/aggbug/373545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2012-04-07 18:41 <a href="http://www.blogjava.net/gembin/archive/2012/04/07/373545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TreeSet vs HashSet vs LinkedHashSet</title><link>http://www.blogjava.net/gembin/archive/2012/03/31/373111.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Sat, 31 Mar 2012 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2012/03/31/373111.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/373111.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2012/03/31/373111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/373111.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/373111.html</trackback:ping><description><![CDATA[<h2><table id="tmwm" border="1" cellspacing="0" cellpadding="3" width="100%" style="color: #2a2a2a; font-family: Verdana, Tahoma, Arial, sans-serif; font-size: 11px; font-weight: normal; line-height: normal; text-align: left; background-color: #fafcff; height: 49px; "><tbody><tr><td width="33%" style="text-align: center; "><strong>TreeSet</strong></td><td width="33%" style="text-align: center; "><strong>HashSet</strong></td><td width="33%" style="text-align: center; "><strong>LinkedHashSet</strong></td></tr><tr><td width="33%"><dl><dt>public class&nbsp;<strong>TreeSet</strong></dt><dt>extends&nbsp;<a title="class in java.util" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractSet.html" style="font-weight: bold; color: #0a8fbc; ">AbstractSet</a></dt><dt>implements&nbsp;<a title="interface in java.util" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/SortedSet.html" style="font-weight: bold; color: #0a8fbc; ">SortedSet</a>,&nbsp;<a title="interface in java.lang" href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Cloneable.html" style="font-weight: bold; color: #0a8fbc; ">Cloneable</a>,&nbsp;<a title="interface in java.io" href="http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html" style="font-weight: bold; color: #0a8fbc; ">Serializable</a></dt></dl></td><td width="33%"><dl><dt>public class&nbsp;<strong>HashSet</strong></dt><dt>extends&nbsp;<a title="class in java.util" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractSet.html" style="font-weight: bold; color: #0a8fbc; ">AbstractSet</a></dt><dt>implements&nbsp;<a title="interface in java.util" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Set.html" style="font-weight: bold; color: #0a8fbc; ">Set</a>,&nbsp;<a title="interface in java.lang" href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Cloneable.html" style="font-weight: bold; color: #0a8fbc; ">Cloneable</a>,&nbsp;<a title="interface in java.io" href="http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html" style="font-weight: bold; color: #0a8fbc; ">Serializable</a></dt></dl></td><td width="33%"><dl><dt>public class&nbsp;<strong>LinkedHashSet</strong></dt><dt>extends&nbsp;<a title="class in java.util" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashSet.html" style="font-weight: bold; color: #0a8fbc; ">HashSet</a></dt><dt>implements&nbsp;<a title="interface in java.util" href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Set.html" style="font-weight: bold; color: #0a8fbc; ">Set</a>,&nbsp;<a title="interface in java.lang" href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Cloneable.html" style="font-weight: bold; color: #0a8fbc; ">Cloneable</a>,&nbsp;<a title="interface in java.io" href="http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html" style="font-weight: bold; color: #0a8fbc; ">Serializable</a></dt></dl></td></tr><tr><td width="33%">unique values</td><td width="33%">unique values</td><td width="33%">Unique values</td></tr><tr><td width="33%">It stores its elements in a red-black tree</td><td width="33%">It stores its elements in a hash table</td><td width="33%">is implemented as a hash table with a linked list running through it</td></tr><tr><td width="33%">Order : ascending order</td><td width="33%"><em>undefined</em></td><td width="33%">insertion order</td></tr><tr><td width="33%">Performance : Slow</td><td width="33%"><tt>better than LinkedHashSet</tt></td><td width="33%">has fast adding to the start of the list, and fast deletion from the interior via iteration</td></tr><tr><td width="33%">operations (<code style="font-size: 1.1em; ">add</code>,&nbsp;<code style="font-size: 1.1em; ">remove</code>&nbsp;and&nbsp;<code style="font-size: 1.1em; ">contains</code>)</td><td width="33%">operations (<tt>add</tt>,&nbsp;<tt>remove</tt>,&nbsp;<tt>contains</tt>&nbsp;and&nbsp;<tt>size</tt>)</td><td width="33%">operations (<tt>add</tt>,&nbsp;<tt>contains</tt>&nbsp;and&nbsp;<tt>remove</tt>)</td></tr><tr><td width="33%">add, addAll,ceiling,clear,clone,comparator,contains,<br />descendingIterator,descendingSet,first,floor,<br />hashSet,higher,isEmpty,iterator,last,lower,pollFirst,<br />remove,size,subSet,tailSet</td><td width="33%"><code style="font-size: 1.1em; "><a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#add%28E%29" style="font-weight: bold; color: #0a8fbc; ">add</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#clear%28%29" style="font-weight: bold; color: #0a8fbc; ">clear</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#clone%28%29" style="font-weight: bold; color: #0a8fbc; ">clone</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#contains%28java.lang.Object%29" style="font-weight: bold; color: #0a8fbc; ">contains</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#isEmpty%28%29" style="font-weight: bold; color: #0a8fbc; ">isEmpty</a>,<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#iterator%28%29" style="font-weight: bold; color: #0a8fbc; ">iterator</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#remove%28java.lang.Object%29" style="font-weight: bold; color: #0a8fbc; ">remove</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#size%28%29" style="font-weight: bold; color: #0a8fbc; ">size</a></code></td><td width="33%"><code style="font-size: 1.1em; "><a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#add%28E%29" style="font-weight: bold; color: #0a8fbc; ">add</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#clear%28%29" style="font-weight: bold; color: #0a8fbc; ">clear</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#clone%28%29" style="font-weight: bold; color: #0a8fbc; ">clone</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#contains%28java.lang.Object%29" style="font-weight: bold; color: #0a8fbc; ">contains</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#isEmpty%28%29" style="font-weight: bold; color: #0a8fbc; ">isEmpty</a>,<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#iterator%28%29" style="font-weight: bold; color: #0a8fbc; ">iterator</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#remove%28java.lang.Object%29" style="font-weight: bold; color: #0a8fbc; ">remove</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html#size%28%29" style="font-weight: bold; color: #0a8fbc; ">size</a></code></td></tr><tr><td width="33%">From AbstractSet:<br /><code style="font-size: 1.1em; "><a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractSet.html#equals%28java.lang.Object%29" style="font-weight: bold; color: #0a8fbc; ">equals</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractSet.html#hashCode%28%29" style="font-weight: bold; color: #0a8fbc; ">hashCode</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractSet.html#removeAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">removeAll</a></code></td><td width="33%"><code style="font-size: 1.1em; "><a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractSet.html#equals%28java.lang.Object%29" style="font-weight: bold; color: #0a8fbc; ">equals</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractSet.html#hashCode%28%29" style="font-weight: bold; color: #0a8fbc; ">hashCode</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractSet.html#removeAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">removeAll</a></code></td><td width="33%"><code style="font-size: 1.1em; "><a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractSet.html#equals%28java.lang.Object%29" style="font-weight: bold; color: #0a8fbc; ">equals</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractSet.html#hashCode%28%29" style="font-weight: bold; color: #0a8fbc; ">hashCode</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractSet.html#removeAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">removeAll</a></code></td></tr><tr><td width="33%"><code style="font-size: 1.1em; "><a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#containsAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">containsAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#retainAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">retainAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#toArray%28%29" style="font-weight: bold; color: #0a8fbc; ">toArray</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#toArray%28T%5B%5D%29" style="font-weight: bold; color: #0a8fbc; ">toArray</a>,<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#toString%28%29" style="font-weight: bold; color: #0a8fbc; ">toString</a></code></td><td width="33%">AbstractCollection:<br /><code style="font-size: 1.1em; "><a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#addAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">addAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#containsAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">containsAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#retainAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">retainAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#toArray%28%29" style="font-weight: bold; color: #0a8fbc; ">toArray</a>,<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#toArray%28T%5B%5D%29" style="font-weight: bold; color: #0a8fbc; ">toArray</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#toString%28%29" style="font-weight: bold; color: #0a8fbc; ">toString</a></code></td><td width="33%"><code style="font-size: 1.1em; "><a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#addAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">addAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#containsAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">containsAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#retainAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">retainAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#toArray%28%29" style="font-weight: bold; color: #0a8fbc; ">toArray</a>,<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#toArray%28T%5B%5D%29" style="font-weight: bold; color: #0a8fbc; ">toArray</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/AbstractCollection.html#toString%28%29" style="font-weight: bold; color: #0a8fbc; ">toString</a></code></td></tr><tr><td width="33%">Set:<br /><code style="font-size: 1.1em; "><a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#containsAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">containsAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#equals%28java.lang.Object%29" style="font-weight: bold; color: #0a8fbc; ">equals</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#hashCode%28%29" style="font-weight: bold; color: #0a8fbc; ">hashCode</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#removeAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">removeAll</a>,<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#retainAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">retainAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#toArray%28%29" style="font-weight: bold; color: #0a8fbc; ">toArray</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#toArray%28T%5B%5D%29" style="font-weight: bold; color: #0a8fbc; ">toArray</a></code></td><td width="33%"><code style="font-size: 1.1em; "><a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#addAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">addAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#containsAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">containsAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#equals%28java.lang.Object%29" style="font-weight: bold; color: #0a8fbc; ">equals</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#hashCode%28%29" style="font-weight: bold; color: #0a8fbc; ">hashCode</a>,<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#removeAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">removeAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#retainAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">retainAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#toArray%28%29" style="font-weight: bold; color: #0a8fbc; ">toArray</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#toArray%28T%5B%5D%29" style="font-weight: bold; color: #0a8fbc; ">toArray</a></code></td><td width="33%"><code style="font-size: 1.1em; "><a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#add%28E%29" style="font-weight: bold; color: #0a8fbc; ">add</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#addAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">addAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#clear%28%29" style="font-weight: bold; color: #0a8fbc; ">clear</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#contains%28java.lang.Object%29" style="font-weight: bold; color: #0a8fbc; ">contains</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#containsAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">containsAll</a>,<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#equals%28java.lang.Object%29" style="font-weight: bold; color: #0a8fbc; ">equals</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#hashCode%28%29" style="font-weight: bold; color: #0a8fbc; ">hashCode</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#isEmpty%28%29" style="font-weight: bold; color: #0a8fbc; ">isEmpty</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#iterator%28%29" style="font-weight: bold; color: #0a8fbc; ">iterator</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#remove%28java.lang.Object%29" style="font-weight: bold; color: #0a8fbc; ">remove</a>,<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#removeAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">removeAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#retainAll%28java.util.Collection%29" style="font-weight: bold; color: #0a8fbc; ">retainAll</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#size%28%29" style="font-weight: bold; color: #0a8fbc; ">size</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#toArray%28%29" style="font-weight: bold; color: #0a8fbc; ">toArray</a>,&nbsp;<a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html#toArray%28T%5B%5D%29" style="font-weight: bold; color: #0a8fbc; ">toArray</a></code></td></tr></tbody></table><br /></h2><img src ="http://www.blogjava.net/gembin/aggbug/373111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2012-03-31 11:30 <a href="http://www.blogjava.net/gembin/archive/2012/03/31/373111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Why int can't be passed to wrapper type Byte constructor?</title><link>http://www.blogjava.net/gembin/archive/2010/07/08/325558.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Thu, 08 Jul 2010 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2010/07/08/325558.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/325558.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2010/07/08/325558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/325558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/325558.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2010/07/08/325558.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/325558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2010-07-08 15:11 <a href="http://www.blogjava.net/gembin/archive/2010/07/08/325558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Why not throwing an ArrayIndexOutOfBoundsException?</title><link>http://www.blogjava.net/gembin/archive/2010/07/08/325554.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Thu, 08 Jul 2010 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2010/07/08/325554.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/325554.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2010/07/08/325554.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/325554.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/325554.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2010/07/08/325554.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/325554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2010-07-08 14:25 <a href="http://www.blogjava.net/gembin/archive/2010/07/08/325554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>What is String literal pool?</title><link>http://www.blogjava.net/gembin/archive/2010/07/08/325553.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Thu, 08 Jul 2010 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2010/07/08/325553.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/325553.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2010/07/08/325553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/325553.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/325553.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  How to create a String&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2010/07/08/325553.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/325553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2010-07-08 14:21 <a href="http://www.blogjava.net/gembin/archive/2010/07/08/325553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Are parameters passed by reference or passed by value in method invocation?</title><link>http://www.blogjava.net/gembin/archive/2010/07/08/325552.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Thu, 08 Jul 2010 06:09:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2010/07/08/325552.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/325552.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2010/07/08/325552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/325552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/325552.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Are parameters passed by reference or passed by value in method invocation?&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2010/07/08/325552.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/325552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2010-07-08 14:09 <a href="http://www.blogjava.net/gembin/archive/2010/07/08/325552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>A Collection of JVM Options </title><link>http://www.blogjava.net/gembin/archive/2010/06/29/324788.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Tue, 29 Jun 2010 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2010/06/29/324788.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/324788.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2010/06/29/324788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/324788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/324788.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2010/06/29/324788.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/324788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2010-06-29 16:20 <a href="http://www.blogjava.net/gembin/archive/2010/06/29/324788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java: wait(), notify(), notifyAll() </title><link>http://www.blogjava.net/gembin/archive/2010/06/29/324744.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Tue, 29 Jun 2010 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2010/06/29/324744.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/324744.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2010/06/29/324744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/324744.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/324744.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Why wait(), notify(), notifyAll() must be called inside a synchronized method/block?&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2010/06/29/324744.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/324744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2010-06-29 10:28 <a href="http://www.blogjava.net/gembin/archive/2010/06/29/324744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LinkedHashMap</title><link>http://www.blogjava.net/gembin/archive/2008/11/14/240572.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Fri, 14 Nov 2008 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/11/14/240572.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/240572.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/11/14/240572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/240572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/240572.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/11/14/240572.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/240572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-11-14 17:13 <a href="http://www.blogjava.net/gembin/archive/2008/11/14/240572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.library.path属性在代码中设置不生效问题</title><link>http://www.blogjava.net/gembin/archive/2008/10/29/237377.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Wed, 29 Oct 2008 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/10/29/237377.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/237377.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/10/29/237377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/237377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/237377.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: java.library.path属性在代码中设置不生效问题&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/10/29/237377.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/237377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-10-29 14:49 <a href="http://www.blogjava.net/gembin/archive/2008/10/29/237377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Annotation Processing Tool</title><link>http://www.blogjava.net/gembin/archive/2008/09/18/229740.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Thu, 18 Sep 2008 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/09/18/229740.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/229740.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/09/18/229740.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/229740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/229740.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Annotation Processing Tool&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/09/18/229740.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/229740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-09-18 17:12 <a href="http://www.blogjava.net/gembin/archive/2008/09/18/229740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Java1.5中创建可变参数[Varargs] </title><link>http://www.blogjava.net/gembin/archive/2008/08/07/220743.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Thu, 07 Aug 2008 10:12:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/08/07/220743.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/220743.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/08/07/220743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/220743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/220743.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在Java1.5中创建可变参数[Varargs] &nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/08/07/220743.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/220743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-08-07 18:12 <a href="http://www.blogjava.net/gembin/archive/2008/08/07/220743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Content Repository API 简介</title><link>http://www.blogjava.net/gembin/archive/2008/07/21/216338.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Mon, 21 Jul 2008 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/07/21/216338.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/216338.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/07/21/216338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/216338.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/216338.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文提供了对 JSR-170 规范所提供特性的广泛介绍。在 2005 年 6 月 17 日通过的规范的最终发行版中，已有两个商业实现：Day Software 的 CRX 和 Obinary 的 Magnolia Power Pack。JSR-170 的引入也导致了企业开源门户和内容管理系统（如 Magnolia 和 eXo 平台）的增多。最重要的是，JSR-170 拥有来自行业领导者（包括 SAP AG、Macromedia 和 IBM）的强大支持，从而在企业阵营建立起了它自己的应用和重要性。就像对象关系映射框架改变了数据库编程一样，JCR API 也有可能极大地改变我们思考和开发内容应用程序的方式。&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/07/21/216338.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/216338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-07-21 13:36 <a href="http://www.blogjava.net/gembin/archive/2008/07/21/216338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>System.getProperty()参数大全  </title><link>http://www.blogjava.net/gembin/archive/2008/05/15/200740.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Thu, 15 May 2008 14:45:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/05/15/200740.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/200740.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/05/15/200740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/200740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/200740.html</trackback:ping><description><![CDATA[<ol start="1" class="dp-j">
    <li class="alt"><span><span>&nbsp;&nbsp;System.getProperty()参数大全&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>java.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Runtime&nbsp;Environment&nbsp;version&nbsp;&nbsp;</span></li>
    <li class=""><span>java.vendor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Runtime&nbsp;Environment&nbsp;vendor&nbsp;&nbsp;</span></li>
    <li class="alt"><span>java.vendor.url&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;vendor&nbsp;URL&nbsp;&nbsp;</span></li>
    <li class=""><span>java.home&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;installation&nbsp;directory&nbsp;&nbsp;</span></li>
    <li class="alt"><span>java.vm.specification.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;specification&nbsp;version&nbsp;&nbsp;</span></li>
    <li class=""><span>java.vm.specification.vendor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;specification&nbsp;vendor&nbsp;&nbsp;</span></li>
    <li class="alt"><span>java.vm.specification.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;specification&nbsp;name&nbsp;&nbsp;</span></li>
    <li class=""><span>java.vm.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;implementation&nbsp;version&nbsp;&nbsp;</span></li>
    <li class="alt"><span>java.vm.vendor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;implementation&nbsp;vendor&nbsp;&nbsp;</span></li>
    <li class=""><span>java.vm.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;implementation&nbsp;name&nbsp;&nbsp;</span></li>
    <li class="alt"><span>java.specification.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Runtime&nbsp;Environment&nbsp;specification&nbsp;version&nbsp;&nbsp;</span></li>
    <li class=""><span>java.specification.vendor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Runtime&nbsp;Environment&nbsp;specification&nbsp;vendor&nbsp;&nbsp;</span></li>
    <li class="alt"><span>java.specification.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Runtime&nbsp;Environment&nbsp;specification&nbsp;name&nbsp;&nbsp;</span></li>
    <li class=""><span>java.<span class="keyword">class</span><span>.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;</span><span class="keyword">class</span><span>&nbsp;format&nbsp;version&nbsp;number&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>java.<span class="keyword">class</span><span>.path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;</span><span class="keyword">class</span><span>&nbsp;path&nbsp;&nbsp;</span></span></li>
    <li class=""><span>java.library.path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;of&nbsp;paths&nbsp;to&nbsp;search&nbsp;when&nbsp;loading&nbsp;libraries&nbsp;&nbsp;</span></li>
    <li class="alt"><span>java.io.tmpdir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Default&nbsp;temp&nbsp;file&nbsp;path&nbsp;&nbsp;</span></li>
    <li class=""><span>java.compiler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name&nbsp;of&nbsp;JIT&nbsp;compiler&nbsp;to&nbsp;use&nbsp;&nbsp;</span></li>
    <li class="alt"><span>java.ext.dirs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;of&nbsp;extension&nbsp;directory&nbsp;or&nbsp;directories&nbsp;&nbsp;</span></li>
    <li class=""><span>os.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Operating&nbsp;system&nbsp;name&nbsp;&nbsp;</span></li>
    <li class="alt"><span>os.arch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Operating&nbsp;system&nbsp;architecture&nbsp;&nbsp;</span></li>
    <li class=""><span>os.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Operating&nbsp;system&nbsp;version&nbsp;&nbsp;</span></li>
    <li class="alt"><span>file.separator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;separator&nbsp;(<span class="string">"/"</span><span>&nbsp;on&nbsp;UNIX)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>path.separator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;separator&nbsp;(<span class="string">":"</span><span>&nbsp;on&nbsp;UNIX)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>line.separator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Line&nbsp;separator&nbsp;(<span class="string">"\n"</span><span>&nbsp;on&nbsp;UNIX)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>user.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User's&nbsp;account&nbsp;name&nbsp;&nbsp;</span></li>
    <li class="alt"><span>user.home&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User's&nbsp;home&nbsp;directory&nbsp;&nbsp;</span></li>
    <li class=""><span>user.dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User's&nbsp;current&nbsp;working&nbsp;directory&nbsp;&nbsp; <br />
    </span></li>
</ol>
<img src ="http://www.blogjava.net/gembin/aggbug/200740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-05-15 22:45 <a href="http://www.blogjava.net/gembin/archive/2008/05/15/200740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>接口和工厂</title><link>http://www.blogjava.net/gembin/archive/2008/05/05/198331.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Mon, 05 May 2008 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/05/05/198331.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/198331.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/05/05/198331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/198331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/198331.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文说明在Java API设计中，面向接口编程的思想，以及接口和工厂的关系。&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/05/05/198331.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/198331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-05-05 10:16 <a href="http://www.blogjava.net/gembin/archive/2008/05/05/198331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP协议介绍  </title><link>http://www.blogjava.net/gembin/archive/2008/05/05/198328.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Mon, 05 May 2008 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/05/05/198328.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/198328.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/05/05/198328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/198328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/198328.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HTTP（HyperTextTransferProtocol）是超文本传输协议的缩写，它用于传送 WWW方式的数据，关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求，请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应，相应的内容包括消息协议的版本，成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/05/05/198328.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/198328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-05-05 10:14 <a href="http://www.blogjava.net/gembin/archive/2008/05/05/198328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入研究线程池    </title><link>http://www.blogjava.net/gembin/archive/2008/05/05/198327.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Mon, 05 May 2008 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/05/05/198327.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/198327.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/05/05/198327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/198327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/198327.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一.什么是线程池?<br>线程池就是以一个或多个线程[循环执行]多个应用逻辑的线程集合.<br>注意这里用了线程集合的概念是我生造的,目的是为了区分执行一批应用逻辑的多个线程和<br>线程组的区别.关于线程组的概念请参阅基础部分.<br><br>一般而言,线程池有以下几个部分:<br>1.完成主要任务的一个或多个线程.<br>2.用于调度管理的管理线程.<br>3.要求执行的任务队列.&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/05/05/198327.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/198327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-05-05 10:11 <a href="http://www.blogjava.net/gembin/archive/2008/05/05/198327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JAVA实现MSN Messenger的功能[zhuan]</title><link>http://www.blogjava.net/gembin/archive/2008/04/22/194853.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Tue, 22 Apr 2008 10:25:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/04/22/194853.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/194853.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/04/22/194853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/194853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/194853.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文介绍了一个用Java编写的可以访问MSN服务的开发包－JMsn，利用这个开发包你可以编写自己的具有MSN Messenger功能的客户端程序。&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/04/22/194853.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/194853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-04-22 18:25 <a href="http://www.blogjava.net/gembin/archive/2008/04/22/194853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 共享内存</title><link>http://www.blogjava.net/gembin/archive/2008/04/11/192115.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Fri, 11 Apr 2008 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/04/11/192115.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/192115.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/04/11/192115.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/192115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/192115.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 共享内存可以说是最有用的进程间通信方式，也是最快的IPC(Inter-Process Communication)形式。两个不同进程A、B共享内存的意思是，同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新，反之亦然。由于多个进程共享同一块内存区域，必然需要某种同步机制，互斥锁和信号量都可以。&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/04/11/192115.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/192115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-04-11 11:22 <a href="http://www.blogjava.net/gembin/archive/2008/04/11/192115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java I/O API之性能分析</title><link>http://www.blogjava.net/gembin/archive/2008/04/11/192085.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Fri, 11 Apr 2008 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/04/11/192085.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/192085.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/04/11/192085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/192085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/192085.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: IO API的可伸缩性对Web应用有着极其重要的意义。Java 1.4版以前的API中，阻塞I/O令许多人失望。从J2SE 1.4版本开始，Java终于有了可伸缩的I/O API。本文分析并计算了新旧I/O API在可伸缩性方面的差异。 &nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/04/11/192085.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/192085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-04-11 10:28 <a href="http://www.blogjava.net/gembin/archive/2008/04/11/192085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java1.5泛型指南中文版(Java1.5 Generic Tutorial) </title><link>http://www.blogjava.net/gembin/archive/2008/04/03/190673.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Thu, 03 Apr 2008 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/04/03/190673.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/190673.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/04/03/190673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/190673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/190673.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JDK1.5中引入了对java语言的多种扩展，泛型(generics)即其中之一。<br><br>这个教程的目标是向您介绍java的泛型(generic)。你可能熟悉其他语言的泛型，最著名的是C++的模板(templates)。如果这样，你很快就会看到两者的相似之处和重要差异。如果你不熟悉相似的语法结构，那么更好，你可以从头开始而不需要忘记误解。<br><br>Generics允许对类型进行抽象(abstract over types)。最常见的例子是集合类型(Container types)，Collection的类树中任意一个即是。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/04/03/190673.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/190673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-04-03 17:53 <a href="http://www.blogjava.net/gembin/archive/2008/04/03/190673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpClient简介</title><link>http://www.blogjava.net/gembin/archive/2008/03/26/188824.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Wed, 26 Mar 2008 10:31:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/03/26/188824.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/188824.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/03/26/188824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/188824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/188824.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HttpClient 是 Apache Jakarta Common 下的子项目，可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包，并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 HTTPClient，然后根据作者实际工作经验给出了一些常见问题的解决方法。&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/03/26/188824.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/188824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-03-26 18:31 <a href="http://www.blogjava.net/gembin/archive/2008/03/26/188824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>abstract interface和interface的区别吗？</title><link>http://www.blogjava.net/gembin/archive/2008/03/21/187746.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Fri, 21 Mar 2008 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/03/21/187746.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/187746.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/03/21/187746.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/187746.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/187746.html</trackback:ping><description><![CDATA[interface&nbsp;本身就是abstract的，只不过没有明确的规定出来，说一定要把abstract这个关键字写上。<br />
所以abstract&nbsp;interface&nbsp;就是interface，两者根本没有区别。<br />
在《java&nbsp;in&nbsp;a&nbsp;nutshell》里，<br />
<strong><span style="color: red;">&#8220;All&nbsp;methods&nbsp;of&nbsp;an&nbsp;interface&nbsp;are&nbsp;implicitly&nbsp;abstract,&nbsp;even&nbsp;if&nbsp;the&nbsp;abstract&nbsp;modifier&nbsp;is&nbsp;omitted.&nbsp;&#8221;</span></strong><br />
在《thinking&nbsp;in&nbsp;java》里，<br />
<span style="color: #006c06;"><span style="color: #006c06;">&#8220;<span style="color: #006c06;"><span style="color: #006c06;"><span style="color: #006c06;"><span style="color: #006c06;"><strong><span style="color: red;">&nbsp;<span style="color: #104cff;">the&nbsp;abstract&nbsp;keyword,&nbsp;which&nbsp;allows&nbsp;you&nbsp;to&nbsp;create&nbsp;one&nbsp;or&nbsp;more&nbsp;methods&nbsp;in&nbsp;a&nbsp;class&nbsp;that&nbsp;have&nbsp;no&nbsp;definitions<br />
—you&nbsp;provide&nbsp;part&nbsp;of&nbsp;the&nbsp;interface&nbsp;without&nbsp;providing&nbsp;a&nbsp;corresponding&nbsp;implementation,&nbsp;which&nbsp;is&nbsp;created&nbsp;by&nbsp;inheritors.&nbsp;<br />
The&nbsp;interface&nbsp;keyword&nbsp;produces&nbsp;a&nbsp;completely&nbsp;abstract&nbsp;class,&nbsp;one&nbsp;that&nbsp;provides&nbsp;no&nbsp;implementation&nbsp;at&nbsp;all.</span></span></strong></span></span></span></span>&#8221;</span></span><br />
所以结论就是&nbsp;abstract&nbsp;interface&nbsp;就是interface，两者根本没有区别。
<img src ="http://www.blogjava.net/gembin/aggbug/187746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-03-21 17:29 <a href="http://www.blogjava.net/gembin/archive/2008/03/21/187746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.security AccessController</title><link>http://www.blogjava.net/gembin/archive/2008/03/12/185785.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Wed, 12 Mar 2008 10:47:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/03/12/185785.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/185785.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/03/12/185785.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/185785.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/185785.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: AccessController.doPrivileged是一个在AccessController类中的静态方法，允许在一个类实例中的代码通知这个AccessController：它的代码主体是享受"privileged(特权的)"，它单独负责对它的可得的资源的访问请求，而不管这个请求是由什么代码所引发的。&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/03/12/185785.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/185785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-03-12 18:47 <a href="http://www.blogjava.net/gembin/archive/2008/03/12/185785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA定时执行任务的三种方法</title><link>http://www.blogjava.net/gembin/archive/2008/03/11/185334.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Tue, 11 Mar 2008 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/03/11/185334.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/185334.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/03/11/185334.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/185334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/185334.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文介绍如何用JAVA定时执行任务。&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/03/11/185334.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/185334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-03-11 13:14 <a href="http://www.blogjava.net/gembin/archive/2008/03/11/185334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出Java设计模式之迭代器模式</title><link>http://www.blogjava.net/gembin/archive/2008/03/11/185324.html</link><dc:creator>gembin</dc:creator><author>gembin</author><pubDate>Tue, 11 Mar 2008 04:51:00 GMT</pubDate><guid>http://www.blogjava.net/gembin/archive/2008/03/11/185324.html</guid><wfw:comment>http://www.blogjava.net/gembin/comments/185324.html</wfw:comment><comments>http://www.blogjava.net/gembin/archive/2008/03/11/185324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gembin/comments/commentRss/185324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gembin/services/trackbacks/185324.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 深入浅出Java设计模式之迭代器模式，迭代这个名词对于熟悉Java的人来说绝对不陌生。我们常常使用JDK提供的迭代接口进行java collection的遍历&nbsp;&nbsp;<a href='http://www.blogjava.net/gembin/archive/2008/03/11/185324.html'>阅读全文</a><img src ="http://www.blogjava.net/gembin/aggbug/185324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gembin/" target="_blank">gembin</a> 2008-03-11 12:51 <a href="http://www.blogjava.net/gembin/archive/2008/03/11/185324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>