<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>子叶：子乌的叶子 &#187; java</title>
	<atom:link href="http://sheneyan.com/blog/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://sheneyan.com/blog</link>
	<description>指穷于为薪，火传也，不知其尽也。---《养生主》</description>
	<lastBuildDate>Mon, 30 Apr 2012 09:00:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>JAVA编程基础：事件处理</title>
		<link>http://sheneyan.com/blog/2010/09/java-basics-event-handling/</link>
		<comments>http://sheneyan.com/blog/2010/09/java-basics-event-handling/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 18:25:36 +0000</pubDate>
		<dc:creator>子乌</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[翻译]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[事件处理]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://sheneyan.com/blog/?p=1142</guid>
		<description><![CDATA[<p>在这个名为《JAVA编程基础》的系列文章中，我会针对每个概念，分别通过简明的解释与实际的例子，来给初学者（也包括那些希望能让自己掌握更多技能的有经验的软件工程师）打下一个坚实的java基本知识的基础。 这个系列的最后一篇文章介绍<strong>事件处理</strong>。</p>[......]<p class='read-more'><a href='http://sheneyan.com/blog/2010/09/java-basics-event-handling/'></a></p>]]></description>
			<content:encoded><![CDATA[<ul>
<li>作者： <a href="http://it.toolbox.com/people/gurunathk108/" title="Gurunath Kalamadi">Gurunath Kalamadi</a></li>
<li>译者：<a href="http://sheneyan.com/blog">Sheneyan(子乌)</a></li>
<li>时间：2010.9.20</li>
<li>英文原文：<a href="	http://javaboutique.internet.com/tutorials/event-handling/">Java Programming Basics: Event Handling</a></li>
</ul>
<p>当你开始学习java的时候，你需要很好地理解基本概念。特别是我下面列出的这五个任何java砖家都必须掌握的概念：</p>
<ol>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-object-orientation/">面向对象</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-runtime-polymorphism/">运行时多态</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-interfaces/">接口</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-io-streams/">I/O流</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-event-handling/">事件处理</a></li>
</ol>
<p>在这个名为《JAVA编程基础》的系列文章中，我会针对每个概念，分别通过简明的解释与实际的例子，来给初学者（也包括那些希望能让自己掌握更多技能的有经验的软件工程师）打下一个坚实的java基本知识的基础。 这个系列的第五篇文章介绍<strong>事件处理</strong>。</p>
<p>子乌注：很喜欢第一个关于结婚的例子，说实话，我觉得是这系列文章中最通俗易懂的例子了-__-。</p>
<h4>事件处理的组件</h4>
<p>对每个java专家来说很好地理解事件处理的机制是非常必要的。现在事件处理编程出现在许多场景中——而不仅仅是GUI程序。你也可以在使用servlet、MDB等技术的应用程序中发现它的身影。</p>
<p>在java中，事件处理机制的组件有以下几个组成：</p>
<ul>
<li>一个<strong>事件类（event class）</strong>，描述了事件的类型（它会有一个数据成员，该成员存放着一个指向引发该事件的源对象的引用。它也重写了方法 <code>toString()</code> 。）</li>
<li>一个 <strong>监听器接口（listener interface）</strong>, 指定了处理方法的原型（该处理方法有一个事件类对象作为参数。）</li>
<li>一个实现了监听器接口的<strong>监听器类（Listener classes）</strong>（也许会有多个监听器类，每个都用自己独立的方式处理相同的事件。）</li>
<li>一个<strong>事件源类（Event source class）</strong>， 它生成了这个事件。（它有一个数据成员用于维持已订阅的监听器列表。也许会有其他数据成员来描述它的状态变亮。它有一个事件生成器方法用于应对引发的事件。当一个事件被引发时，一个事件类的对象会被创建，而所有已订阅的监听器都会被调用各自的回调方法——刚创建的事件类对象引用将作为参数传递进去——来被提醒发生了什么。）<br />
<strong>注意</strong>: 为简单起见，上面的描述假设一个事件源类只生成唯一一个事件。而事实上，一个事件源类可能生成更多的事件。比如，类<var>List</var>会在一个项目被选中或被取消选中时生成一个<var>ItemEvent</var>事件，而当它的某个项目被双击时则会产生一个<var>ActionEvent</var>事件。</li>
<li>一个 <strong>客户端类</strong>，保存创建的源和监听器对象，以及订阅了源类事件的监听器（也会有引发源类事件生成方法的代理语句存在。）</li>
</ul>
<h4>实践事件处理</h4>
<p>一个真实的示例能够帮助澄清事件处理机制中几个组件的相互关系。设想一下有4个朋友，甲、乙、丙、丁。假设现在要发生的事件是甲要结婚了。甲的朋友，乙、丙、丁，需要响应这个红色炸弹。响应的做法（协议）就是出席婚礼并送个礼物给甲。他们都必须遵循这个响应协议，但他们可以自由选择他们要带的礼物。乙打算带一个价值$15的艺术品。而丙和甲的关系会更亲密些，他决定送一条价值$200的金项链。丁并不是甲关系那么铁的哥们，他也许就只会带一张写着“最真诚祝愿”的贺卡，只值$2。不过无论如何，他们都遵循了同样的协议。</p>
<p>下面是这个模拟中提到的事件处理组件：</p>
<ul>
<li>事件类：结婚啦</li>
<li>监听器接口方法原型：出席婚礼并送一个礼物</li>
<li>监听器类：乙、丙、丁（他们通过选择自己想带的礼物来实现监听器接口）</li>
<li>事件源：甲</li>
</ul>
<h4>Java事件处理组件（续）</h4>
<p>下面的列表 1-7 进一步澄清这些概念。它们涉及到监控一个化工厂反应堆内部的压力。反应堆可以承受一定范围内的压力，如5（即5倍房间压力）。如果压力达到临界值或即将超过临界值，应该要打开阀门、关闭加热器并且警铃应该开始报警。</p>
<p>在这个例子中，事件处理组件是：</p>
<ul>
<li>事件类：<var>HiPrEvent</var></li>
<li>监听器接口原型方法：<code>void respond(HiPrEvent evObj)</code></li>
<li>监听器类：阀门（<var>Valve</var>），加热器（<var>Heater</var>）和警铃（<var>AlarmBell</var>） (都以自己的方式实现了方法<code>respond()</code>)</li>
<li>事件源：反应堆（<var>Reactor</var>）</li>
<p><strong>列表 1: hiprpack/HiPrEvent.java</strong></p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">hiprpack</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> HiPrEvent <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Object</span> evSrc<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> HiPrEvent<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> obj<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        evSrc<span style="color: #339933;">=</span>obj<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> getEvSrc<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> evSrc<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;HiPrEvent 被触发...&quot;</span><span style="color: #339933;">+</span>evSrc<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>列表 2: hiprpack/HiPrListener.java</strong></p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">hiprpack</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> HiPrListener <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">void</span> respond<span style="color: #009900;">&#40;</span>HiPrEvent evObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>列表 3: hiprpack/Valve.java</strong></p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">hiprpack</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Valve <span style="color: #000000; font-weight: bold;">implements</span> HiPrListener<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> respond<span style="color: #009900;">&#40;</span>HiPrEvent evObj<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span>evObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;...阀门打开了...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>列表 4: hiprpack/Heater.java</strong></p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">hiprpack</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Heater <span style="color: #000000; font-weight: bold;">implements</span> HiPrListener<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> respond<span style="color: #009900;">&#40;</span>HiPrEvent evObj<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span>evObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;...加热器关闭...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>列表 5: hiprpack/AlarmBell.java</strong></p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">hiprpack</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AlarmBell <span style="color: #000000; font-weight: bold;">implements</span> HiPrListener<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> respond<span style="color: #009900;">&#40;</span>HiPrEvent evObj<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span>evObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;...警铃开始报警...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>列表 6: hiprpack/Reactor.java</strong></p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">hiprpack</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.List</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.ArrayList</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Reactor<span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> rId<span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">double</span> rPr<span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">//用于维持事件的订阅者列表</span>
      <span style="color: #000000; font-weight: bold;">private</span> List<span style="color: #339933;">&lt;</span>HiPrListener<span style="color: #339933;">&gt;</span> subList<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>HiPrListener<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #000000; font-weight: bold;">public</span> Reactor<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i, <span style="color: #000066; font-weight: bold;">double</span> d<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        rId<span style="color: #339933;">=</span>i<span style="color: #339933;">;</span>  rPr<span style="color: #339933;">=</span>d<span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> getRPr<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
         <span style="color: #000000; font-weight: bold;">return</span> rPr<span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getRId<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
         <span style="color: #000000; font-weight: bold;">return</span> rId<span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;反应堆Id: &quot;</span><span style="color: #339933;">+</span>rId<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;  反应堆压力: &quot;</span><span style="color: #339933;">+</span>rPr<span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> addHiPrListener<span style="color: #009900;">&#40;</span>HiPrListener sub<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
         subList.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>sub<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> increasePr<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> n, <span style="color: #000066; font-weight: bold;">double</span> safePr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        rPr <span style="color: #339933;">+=</span>n<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>rPr<span style="color: #339933;">&gt;=</span>safePr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
          HiPrEvent evObj<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> HiPrEvent<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//Generate event</span>
          <span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>HiPrListener sub<span style="color: #339933;">:</span>subList<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
             sub.<span style="color: #006633;">respond</span><span style="color: #009900;">&#40;</span>evObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//通过调用回调方法提醒每个订阅者</span>
           <span style="color: #009900;">&#125;</span>
         <span style="color: #009900;">&#125;</span>
       <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>列表 7: TestHiPr.java </strong>(在hiprack目录上一级）</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">hiprpack.*</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> TestHiPr<span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      Reactor rObj<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> Reactor<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1000</span>,<span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      Valve vObj<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> Valve<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      Heater hObj<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> Heater<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      AlarmBell aObj<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> AlarmBell<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      rObj.<span style="color: #006633;">addHiPrListener</span><span style="color: #009900;">&#40;</span>vObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//Valve 对事件 HiPrEvent 的订阅</span>
      rObj.<span style="color: #006633;">addHiPrListener</span><span style="color: #009900;">&#40;</span>hObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//Heater 对事件 HiPrEvent 的订阅</span>
      rObj.<span style="color: #006633;">addHiPrListener</span><span style="color: #009900;">&#40;</span>aObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//Alarm bell 对事件 HiPrEvent 的订阅</span>
&nbsp;
      <span style="color: #000066; font-weight: bold;">double</span> safePr<span style="color: #339933;">=</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//简单起见，这里硬编码</span>
                                                             <span style="color: #666666; font-style: italic;">// 可以从额外的源，如一个文件中获取该配置。</span>
&nbsp;
                                <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;初始压力: &quot;</span><span style="color: #339933;">+</span>rObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                   <span style="color: #000000; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>rObj.<span style="color: #006633;">getRPr</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;</span>safePr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
              rObj.<span style="color: #006633;">increasePr</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span>, safePr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//模拟压力监控，每次提升1点</span>
                                   <span style="color: #666666; font-style: italic;">//在真实生活中，该内部压力值来自于外部传感器。</span>
&nbsp;
              <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;当前压力: &quot;</span><span style="color: #339933;">+</span>rObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>当你能够编写并运行这个程序时，你会对java中事件处理机制的原理有个深刻的理解。</p>
<h4>Conclusion</h4>
<p>对一个java程序员来说，深刻理解事件处理是非常必要的。通过学习，处理任何事件处理场景会变得相当容易，无论是使用Swing的GUI开发，使用servlet，或者使用MDB（目的接收到消息后触发一个事件）。</p>
<h4>鸣谢</h4>
<p>见原文……</p>
<h4>关于作者</h4>
<p><strong>Gurunath Kalamadi</strong>是班加罗尔的Infosys Technologies Ltd.的教育与研究的现任分组管理者。（详细见原文……）</p>
]]></content:encoded>
			<wfw:commentRss>http://sheneyan.com/blog/2010/09/java-basics-event-handling/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JAVA编程基础：I/O流</title>
		<link>http://sheneyan.com/blog/2010/09/java-basics-io-streams/</link>
		<comments>http://sheneyan.com/blog/2010/09/java-basics-io-streams/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 16:52:37 +0000</pubDate>
		<dc:creator>子乌</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[翻译]]></category>
		<category><![CDATA[I/O]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[流]]></category>

		<guid isPermaLink="false">http://sheneyan.com/blog/?p=1135</guid>
		<description><![CDATA[<p>在这个名为《JAVA编程基础》的系列文章中，我会针对每个概念，分别通过简明的解释与实际的例子，来给初学者（也包括那些希望能让自己掌握更多技能的有经验的软件工程师）打下一个坚实的java基本知识的基础。 这个系列的第四篇文章介绍<strong>I/O流</strong>。</p>[......]<p class='read-more'><a href='http://sheneyan.com/blog/2010/09/java-basics-io-streams/'></a></p>]]></description>
			<content:encoded><![CDATA[<ul>
<li>作者： <a href="http://it.toolbox.com/people/gurunathk108/" title="Gurunath Kalamadi">Gurunath Kalamadi</a></li>
<li>译者：<a href="http://sheneyan.com/blog">Sheneyan(子乌)</a></li>
<li>时间：2010.9.20</li>
<li>英文原文：<a href="http://javaboutique.internet.com/tutorials/io-streams/">Java Programming Basics: I/O Streams</a></li>
</ul>
<p>当你开始学习java的时候，你需要很好地理解基本概念。特别是我下面列出的这五个任何java砖家都必须掌握的概念：</p>
<ol>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-object-orientation/">面向对象</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-runtime-polymorphism/">运行时多态</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-interfaces/">接口</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-io-streams/">I/O流</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-event-handling/">事件处理</a></li>
</ol>
<p>在这个名为《JAVA编程基础》的系列文章中，我会针对每个概念，分别通过简明的解释与实际的例子，来给初学者（也包括那些希望能让自己掌握更多技能的有经验的软件工程师）打下一个坚实的java基本知识的基础。 这个系列的第四篇文章介绍<strong>I/O流</strong>。</p>
<h4>在JAVA中为理解I/O流进行的分类</h4>
<p>Java中大量的I/O数据流类让新手面对不同的应用场景正确使用正确的流难以抉择。一个可以让你对I/O数据流类有概念的方法时将这些流分为两个类别：</p>
<ol>
<li><strong>“边界”流（”Boundary” streams）</strong>: 边界流通过基础底层的I/O例程实现I/O（如果必要，会通过通过底层操作系统进行I/O操作）</p>
<li><strong>“中间”流（”Intermediate” streams）</strong>: 中间流通过“链接”到边界流来实现数据的转换。</p>
</ol>
<p>（<strong>注</strong>: 这种将流划分为“边界”和“中间”的分类只是为了逻辑上的理解，你可能没法在任何文档上找到这种分类。）</p>
<p>为了写入数据，中间流会从应用程序中取得数据，将它“转换”为边界流所期望的格式，然后将其交由边界流进行写入。类似的，读取数据时，中间流从边界流那取得数据（边界流从源读取数据）并“转换”为应用程序可接收的格式。</p>
<p>下列的两个表格展示了一些边界流和中间流</p>
<p><strong>一些“边界”流</strong></p>
<table>
<tr>
<th>Sl No.</th>
<th>基于字节(byte)</th>
<th>基于字符(character)</th>
<th>边界对象(Boundary Object)</th>
</tr>
<tr>
<td>1.</td>
<td>FileInputStream / FileOutputStream</td>
<td>FileReader / FileWriter</td>
<td>文件(File)</td>
</tr>
<tr>
<td>2.</td>
<td>ByteArrayInputStream / BytearrayOutputStream</td>
<td>CharArrayReader / CharArrayWriter</td>
<td>缓冲区(buffer) (内存中)</td>
</tr>
<tr>
<td>3.</td>
<td>PipedInputStream/ PipedOutputStream</td>
<td>PipedReader/ PipedWriter</td>
<td>线程(thread)</td>
</tr>
</table>
<p><strong>一些“中间”流(“Intermediate” Streams)</strong></p>
<table>
<tr>
<th>Sl No.</th>
<th>基于字节</th>
<th>基于字符</th>
<th>用于</th>
</tr>
<tr>
<td>1.</td>
<td>BufferedInputStream / BufferedOutputStream</td>
<td>BufferedReader / BufferedWriter</td>
<td>缓冲区I/O (已经和一个“边界”流链接)</td>
</tr>
<tr>
<td>2.</td>
<td>ObjectInputStream / ObjectOutputStream</td>
<td>
<div align="center">&#8212;</div>
</td>
<td>对象序列化/反序列化 (已经和一个“边界”流链接)</td>
</tr>
<tr>
<td>3.</td>
<td>DataInputStream / DataOutputStream</td>
<td>
<div align="center">&#8212;</div>
</td>
<td>java内部数据类型I/O (已经和一个“边界”流链接)</td>
</tr>
</table>
<p>请注意，中间流必须链接到合适类型的边界流以使I/O操作顺利进行。中间流不能自行处理到设备——如文件或内存——的I/O操作因为它们并不拥有底层I/O函数</p>
<h4>自定义流的链接</h4>
<p>边界流和中间流之间关联的分割导致在任意给定的应用场景中自定义流的链接很容易。一般的做法是：</p>
<ol>
<li>定义一个合适类型的边界流，将它绑定到一个边界对象（通常在构造时搞定这个）。</li>
<li>定义一个合适类型的中间流，将其链接到刚才创建的边界流（一样在构造函数中搞定）。</li>
</ol>
<p>假设你打算将类<var>Employee</var>的对象<var>eObj</var>写入到叫<code>Object.Data</code>的磁盘文件中，就像下面这样：</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #003399;">FileOutputStream</span> fOut<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileOutputStream</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Object.Data&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">ObjectOutputStream</span> oOut<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ObjectOutputStream</span><span style="color: #009900;">&#40;</span>fOut<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 链接“中间”流到“边界”流上</span>
...
<span style="color: #006633;">oOut</span>.<span style="color: #006633;">writeObject</span><span style="color: #009900;">&#40;</span>eObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>现在，假设你需要从一个叫做<code>Data.in</code>的磁盘文件中读取一个双精度数字。</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #003399;">FileInputStream</span> fIn<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileInputStream</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Data.in&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">DataInputStream</span> dIn<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">DataInputStream</span><span style="color: #009900;">&#40;</span>fIn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 链接“中间”流到“边界”流上</span>
...
<span style="color: #000066; font-weight: bold;">double</span> n<span style="color: #339933;">=</span>dIn.<span style="color: #006633;">readDouble</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>你可以扩展链接到多余2个的流上。例如，如果你需要缓存输入上例中的双精度数字，然后创建一个<var>FileInputStream</var>，你可以这么做：</p>
<ol>
<li>创建一个<var>BufferedInputStream</var>。</li>
<li>链接<var>BufferedInputStream</var> 到 <var>FileInputStream</var>。</li>
<li>链接<var>BufferedInputStream</var> 到 <var>DataInputStream</var>。</li>
</ol>
<p>代码如下:</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #003399;">FileInputStream</span> fIn<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileInputStream</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Data.in&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">BufferedInputStream</span> bIn<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BufferedInputStream</span><span style="color: #009900;">&#40;</span>fIn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003399;">DataInputStream</span> dIn<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">DataInputStream</span><span style="color: #009900;">&#40;</span>bIn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
...
<span style="color: #000066; font-weight: bold;">double</span> n<span style="color: #339933;">=</span>dIn.<span style="color: #006633;">readDouble</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>当你掌握了边界流和中间流它们的概念与区别，利用I/O流进行开发就相对容易些了。</p>
<h4>结论</h4>
<p>你能够掌握给java中所有的I/O数据流类分类的技巧并为你特定的应用场景选择正确的那一个。</p>
<h4>鸣谢</h4>
<p>见原文……</p>
<h4>关于作者</h4>
<p><strong>Gurunath Kalamadi</strong>是班加罗尔的Infosys Technologies Ltd.的教育与研究的现任分组管理者。（详细见原文……）</p>
]]></content:encoded>
			<wfw:commentRss>http://sheneyan.com/blog/2010/09/java-basics-io-streams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAVA编程基础：接口</title>
		<link>http://sheneyan.com/blog/2010/09/java-basics-interfaces/</link>
		<comments>http://sheneyan.com/blog/2010/09/java-basics-interfaces/#comments</comments>
		<pubDate>Sat, 18 Sep 2010 18:34:25 +0000</pubDate>
		<dc:creator>子乌</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[翻译]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[接口]]></category>
		<category><![CDATA[教程]]></category>

		<guid isPermaLink="false">http://sheneyan.com/blog/?p=1131</guid>
		<description><![CDATA[<p>在这个名为《JAVA编程基础》的系列文章中，我会针对每个概念，分别通过简明的解释与实际的例子，来给初学者（也包括那些希望能让自己掌握更多技能的有经验的软件工程师）打下一个坚实的java基本知识的基础。 这个系列的第三篇文章介绍<strong>接口</strong>。</p>[......]<p class='read-more'><a href='http://sheneyan.com/blog/2010/09/java-basics-interfaces/'></a></p>]]></description>
			<content:encoded><![CDATA[<ul>
<li>作者： <a href="http://it.toolbox.com/people/gurunathk108/" title="Gurunath Kalamadi">Gurunath Kalamadi</a></li>
<li>译者：<a href="http://sheneyan.com/blog">Sheneyan(子乌)</a></li>
<li>时间：2010.9.19</li>
<li>英文原文：<a href="http://javaboutique.internet.com/tutorials/Interfaces/">Java Programming Basics: Interfaces</a></li>
</ul>
<p>当你开始学习java的时候，你需要很好地理解基本概念。特别是我下面列出的这五个任何java砖家都必须掌握的概念：</p>
<ol>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-object-orientation/">面向对象</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-runtime-polymorphism/">运行时多态</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-interfaces/">接口</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-io-streams/">I/O流</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-event-handling/">事件处理</a></li>
</ol>
<p>在这个名为《JAVA编程基础》的系列文章中，我会针对每个概念，分别通过简明的解释与实际的例子，来给初学者（也包括那些希望能让自己掌握更多技能的有经验的软件工程师）打下一个坚实的java基本知识的基础。 这个系列的第三篇文章介绍<strong>接口</strong>。</p>
<h4>接口：实施服务合同</h4>
<p>许多程序员认为在java中，接口这个有些错位的概念是用于实现多继承应用。在接口中没有什么默认行为是可以被实现类继承的！将接口当成时实现一个服务合同的机制会更加合适。也就是说，将接口中提供的方法原型当成服务提供商（实现类）所必须坚持的服务合同。每个服务提供商可以使用它自己的方式来提供这个服务合同上强制要求的服务。</p>
<p>集合相关的接口可以作为一个解释这个概念的好例子。一个集合接口定义了方法<code>add()</code> 和 <code>remove()</code> ，而非一大堆其他的方法。每个集合类（例如<var>Stack</var>，<var>Queue</var>，<var>List</var>等等）会根据接口实现被服务合同所要求的方法，但每个类可以以它自己的方式自由地提供服务。对于一个<var>Stack</var>类，方法<code>add()</code>将一个元素放置于堆的顶层，而方法<code>remove()</code>则将元素从顶层抽离，这实现了后进先出（LIFO）原则。而对于一个<var>Queue</var>类， 方法<code>add()</code>将一个元素放置于队列的最后，而方法<code>remove()</code>将元素从队列的开头移出，这实现了先进先出（FIFO）原则。</p>
<p>下面的代码(<code>Flyer.java</code> 和 <code>TestFlyer.java</code>) 定义了一个接口<var>Flyer</var>,它提供了一个方法原型 <code>fly()</code> 。每个描述飞行对象的类都必须实现这个<var>Flyer</var>接口(可以用自己的方式实现<code>fly()</code>这个在接口<var>Flyer</var>中指定的，在服务合同中强制要求的方法)。<var>Airplane</var>和<var>Bird</var>是两个实现了接口<var>Flyer</var>的类。类<var>Airplane</var>通过“使用喷气发动机”来实现了方法<code>fly()</code>，而类<var>Bird</var>则通过“使用翅膀”来实现方法 <code>fly()</code>！</p>
<p><strong>列表 1. Flyer.java</strong></p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> Flyer<span style="color: #009900;">&#123;</span>
     <span style="color: #000066; font-weight: bold;">void</span> fly<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>列表 2. TestFlyer.java</strong></p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> TestFlyer<span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> executeFly<span style="color: #009900;">&#40;</span>Flyer fRef<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      fRef.<span style="color: #006633;">fly</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	  Airplane aObj<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> Airplane<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	  Bird bObj<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> Bird<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	  executeFly<span style="color: #009900;">&#40;</span>aObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	  executeFly<span style="color: #009900;">&#40;</span>bObj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">class</span> Airplane <span style="color: #000000; font-weight: bold;">implements</span> Flyer<span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> fly<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	  <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;飞机通过喷气式发动机飞翔...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Bird <span style="color: #000000; font-weight: bold;">implements</span> Flyer<span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> fly<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	  <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;鸟通过它们的翅膀飞翔...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>方法 <code>executeFly(Flyer fRef)</code> 演示了在使用接口引用时<a href="http://sheneyan.com/blog/2010/09/java-basics-runtime-polymorphism/">运行时多态</a>如何起作用。就如同一个基类引用能够指向一个衍生类对象，一个接口引用也指向它的实现类的对象。当一个<var>Airplane</var>对象作为参数传递给<code>executeFly()</code>, 调用<code>fRef.fly()</code>会执行类<var>Airplane</var>的方法 <code>fly()</code> 。与此同时，如果一个对象<var>Bird</var>作为参数传递，相同的调用 <code>fRef.fly()</code> 会执行类<var>Bird</var>的方法 <code>fly()</code> 。</p>
<h4>结论</h4>
<p>示例说明了接口的目的就是指定一个服务合同。它也解释了运行时多态运用于接口引用时的优势。掌握了这些概念，你会更快地掌握java。</p>
<h4>鸣谢</h4>
<p>见原文……</p>
<h4>关于作者</h4>
<p><strong>Gurunath Kalamadi</strong>是班加罗尔的Infosys Technologies Ltd.的教育与研究的现任分组管理者。（详细见原文……）</p>
]]></content:encoded>
			<wfw:commentRss>http://sheneyan.com/blog/2010/09/java-basics-interfaces/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>JAVA编程基础：运行时多态</title>
		<link>http://sheneyan.com/blog/2010/09/java-basics-runtime-polymorphism/</link>
		<comments>http://sheneyan.com/blog/2010/09/java-basics-runtime-polymorphism/#comments</comments>
		<pubDate>Sat, 18 Sep 2010 15:53:54 +0000</pubDate>
		<dc:creator>子乌</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[翻译]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[多态]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[运行时]]></category>

		<guid isPermaLink="false">http://sheneyan.com/blog/?p=1114</guid>
		<description><![CDATA[<p>在这个名为《JAVA编程基础》的系列文章中，我会针对每个概念，分别通过简明的解释与实际的例子，来给初学者（也包括那些希望能让自己掌握更多技能的有经验的软件工程师）打下一个坚实的java基本知识的基础。 这个系列的第二篇文章介绍<strong>运行时多态</strong>。</p>[......]<p class='read-more'><a href='http://sheneyan.com/blog/2010/09/java-basics-runtime-polymorphism/'></a></p>]]></description>
			<content:encoded><![CDATA[<ul>
<li>作者： <a href="http://it.toolbox.com/people/gurunathk108/" title="Gurunath Kalamadi">Gurunath Kalamadi</a></li>
<li>译者：<a href="http://sheneyan.com/blog">Sheneyan(子乌)</a></li>
<li>时间：2010.9.18</li>
<li>英文原文：<a href="http://javaboutique.internet.com/tutorials/Runtime_Polymorphism/">Java Java Programming Basics: Runtime Polymorphism</a></li>
</ul>
<p>当你开始学习java的时候，你需要很好地理解基本概念。特别是我下面列出的这五个任何java砖家都必须掌握的概念：</p>
<ol>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-object-orientation/">面向对象</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-runtime-polymorphism/">运行时多态</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-interfaces/">接口</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-io-streams/">I/O流</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-event-handling/">事件处理</a></li>
</ol>
<p>在这个名为《JAVA编程基础》的系列文章中，我会针对每个概念，分别通过简明的解释与实际的例子，来给初学者（也包括那些希望能让自己掌握更多技能的有经验的软件工程师）打下一个坚实的java基本知识的基础。 这个系列的第二篇文章介绍<strong>运行时多态</strong>。</p>
<h4>运行时多态的本质</h4>
<p>运行时多态的核心就是引用的能力，基类引用可以像指向它本身的类对象一样指向衍生类对象。通常，一个java新手会把握不住运行时多态 &#8212; 为什么它被称作运行时多态以及它的工作原理。</p>
<p>作为一个例子，下面的程序(<code>TestRTPoly.java</code>)包含了一个抽象基类<var>Shape</var>，有2个数据成员和一个抽象方法 <code>calculateArea()</code> 。还有两个衍生类，<var>Rectangle</var> 和 <var>Triangle</var> ，它们都扩展了类<var>Shape</var>，并实现了 <code>calculateArea()</code> 以满足其几何形状的需求。</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> TestRTPoly<span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">double</span> getArea<span style="color: #009900;">&#40;</span><span style="color: #003399;">Shape</span> sRef<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">return</span> sRef.<span style="color: #006633;">calculateArea</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   <span style="color: #003399;">Rectangle</span> rectObj<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Rectangle</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span>,<span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   Triangle triObj<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> Triangle<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span>,<span style="color: #cc66cc;">4</span>,<span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;rObj: &quot;</span><span style="color: #339933;">+</span> getArea<span style="color: #009900;">&#40;</span>rectObj<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;tObj: &quot;</span><span style="color: #339933;">+</span>getArea<span style="color: #009900;">&#40;</span>triObj<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> <span style="color: #003399;">Shape</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">double</span> side1, side2<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Shape</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   side1<span style="color: #339933;">=</span>side2<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Shape</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> n1, <span style="color: #000066; font-weight: bold;">double</span> n2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   side1<span style="color: #339933;">=</span>n1<span style="color: #339933;">;</span>side2<span style="color: #339933;">=</span>n2<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> getSide1<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">return</span>  side1<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> getSide2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">return</span>  side2<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setSide1<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> n<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   side1<span style="color: #339933;">=</span>n<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setSide2<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> n<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   side2<span style="color: #339933;">=</span>n<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> calculateArea<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">class</span> <span style="color: #003399;">Rectangle</span> <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">Shape</span><span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Rectangle</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
         <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Rectangle</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> n1, <span style="color: #000066; font-weight: bold;">double</span> n2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
         <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span>n1,n2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> calculateArea<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
         <span style="color: #000000; font-weight: bold;">return</span> side1<span style="color: #339933;">*</span>side2<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">class</span> Triangle <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">Shape</span><span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">double</span> side3<span style="color: #339933;">;</span>
   <span style="color: #000000; font-weight: bold;">public</span> Triangle<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  side3<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">public</span> Triangle<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> n1, <span style="color: #000066; font-weight: bold;">double</span> n2,<span style="color: #000066; font-weight: bold;">double</span> n3<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span>n1,n2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  side3<span style="color: #339933;">=</span>n3<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> getSide3<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">return</span> side3<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setSide3<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> n<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       side3<span style="color: #339933;">=</span>n<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> calculateArea<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">double</span> s<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>side1<span style="color: #339933;">+</span>side2<span style="color: #339933;">+</span>side3<span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">2.0</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #003399;">Math</span>.<span style="color: #006633;">sqrt</span><span style="color: #009900;">&#40;</span>s<span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-</span>side1<span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-</span>side2<span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>s<span style="color: #339933;">-</span>side3<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>类 <var>TestRTPoly</var> 包含方法 <code>main()</code> 以及静态方法 <code>getArea()</code> ，它有一个Shape类的引用 <code>sRef</code> 作为参数。它调用 <code>sRef.caculateArea()</code> 并将返回值作为结果传出。方法 <code>sRef.caculateArea()</code> 演示了运行时多态的概念.</p>
<p>当程序编译时下列的信息将提供给编译器，这有助于解释运行时多态：</p>
<ul>
<li>抽象类Shape有一个抽象方法<code>calculateArea()</code>和两个衍生类， Rectangle 和 Triangle ，它们扩展了类Shape，这意味着它们以自己的方式实现了方法 <code>calculateArea()</code> 。</li>
<li>方法 <code>getArea(Shape sRef)</code> 调用了 <code>sRef.calculateArea()</code> 。当程序编译时，该调用无法被识别，因为方法<code>calculateArea()</code>有两个实现: 分别在类Rectangle和Triangle中，而且参数<code>sRef</code>可以传递给类 Rectangle 或类 Triangle 的任何一个实体类 (因为该参数是一个基类引用，它也可以指向衍生类). 取决于传入的对象类型，相应的 <code>calculateArea()</code> 实现会被调用。但在方法 <code>getArea()</code> 编译时，是无法知道对象 <code>sRef</code> 会指向哪个类型的引用。 只有在运行时接收到调用参数时才能知道（类型），因此，调用 <code>sRef.calculateArea()</code> 只有在运行时才会被识别。</li>
</ul>
<h4>商业应用中的运行时多态</h4>
<p>拿一个银行应用做例子。当一个客户登录时，会显示一个欢迎界面。该应用程序有一个基类<var>Customer</var>和两个衍生类，<var>HVCustomer</var> (高价值客户)和<var>UVCustomer</var> (超价值客户)。在类<var>Customer</var>中有一个显示欢迎界面的方法<code>display()</code>。衍生类<var>HVCustomer</var>和<var>UVCustomer</var>都重写了方法 <code>display()</code> ，用于展示不同的欢迎界面。</p>
<p><var>HVCustomer</var>会提供比普通<var>Customer</var>更多的特色功能和操作，而<var>UVCustomer</var>则会比<var>HVCustomer</var>提供更多的。但是这里只会有一个方法，<code>show()</code>，在这个应用类中(包含了<code>main()</code>)会拿一个<var>Customer</var>作为参数(叫做<code>cRef</code>)并调用它的方法<code>cRef.show()</code>。基于传入参数的对象的类型，方法 <code>show()</code>能够给普通<var>Customrer</var>、<var>HVCustomer</var>或<var>UVCustomer</var>展示不同的欢迎界面。</p>
<h4>结论</h4>
<p>正如这个银行应用程序例子所展示的，运行时多态的本质是一个基类引用可以指向衍生类对象以及它自己类（基类）的对象。但愿这篇文章阐明了为什么这个概念被称作运行时多态以及它的工作原理。</p>
<h4>鸣谢</h4>
<p>见原文……</p>
<h4>关于作者</h4>
<p><strong>Gurunath Kalamadi</strong>是班加罗尔的Infosys Technologies Ltd.的教育与研究的现任分组管理者。（详细见原文……）</p>
]]></content:encoded>
			<wfw:commentRss>http://sheneyan.com/blog/2010/09/java-basics-runtime-polymorphism/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>JAVA编程基础：面向对象</title>
		<link>http://sheneyan.com/blog/2010/09/java-basics-object-orientation/</link>
		<comments>http://sheneyan.com/blog/2010/09/java-basics-object-orientation/#comments</comments>
		<pubDate>Mon, 13 Sep 2010 23:52:07 +0000</pubDate>
		<dc:creator>子乌</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[翻译]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://sheneyan.com/blog/?p=1073</guid>
		<description><![CDATA[<p>在这个名为《JAVA编程基础》的系列文章中，我会针对每个概念，分别通过简明的解释与实际的例子，来给初学者（也包括那些希望能让自己掌握更多技能的有经验的软件工程师）打下一个坚实的java基本知识的基础。 这个系列的第一篇文章介绍<strong>面向对象</strong>。</p>
[......]<p class='read-more'><a href='http://sheneyan.com/blog/2010/09/java-basics-object-orientation/'></a></p>]]></description>
			<content:encoded><![CDATA[<ul>
<li>作者： <a href="http://it.toolbox.com/people/gurunathk108/" title="Gurunath Kalamadi" rel="external">Gurunath Kalamadi</a></li>
<li>译者：<a href="http://sheneyan.com/blog">Sheneyan(子乌)</a></li>
<li>时间：2010.9.14</li>
<li>英文原文：<a href="http://javaboutique.internet.com/tutorials/Object_Orientation/" rel="external">Java Programming Basics: Object Orientation</a></li>
</ul>
<blockquote>
<p>子乌注：翻译这个系列的初衷是因为看到最后一篇，觉得那个比喻非常的棒，再加上似乎没人翻译过这个系列的文章，于是，随便翻翻，也算是加深自己对java的理解吧。</p>
<p>子乌注：下面这个表是一些可能存在争议的翻译用词对照。</p>
<ul>
<li>method&#8212;>方法</li>
<li>protptype&#8212;>原型</li>
<li>implementation&#8212;>实现</li>
<li>signature&#8212;>签名</li>
<li>mangled name&#8212;>重整名字</li>
<li>call&#8212;>调用</li>
<li>override&#8212;>重写</li>
<li>layout&#8212;>布局</li>
<li>method table&#8212;>方法表</li>
<li>method body&#8212;>方法主体</li>
<li>take away&#8212;>结论（take away在英语中应该是外卖，或者打包的意思，我猜作者是取后者的引申）</li>
</ul>
</blockquote>
<p>当你开始学习java的时候，你需要很好地理解基本概念。特别是我下面列出的这五个任何java砖家都必须掌握的概念：</p>
<ol>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-object-orientation/">面向对象</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-runtime-polymorphism/">运行时多态</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-interfaces/">接口</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-io-streams/">I/O流</a></li>
<li><a href="http://sheneyan.com/blog/2010/09/java-basics-event-handling/">事件处理</a></li>
</ol>
<p>在这个名为《JAVA编程基础》的系列文章中，我会针对每个概念，分别通过简明的解释与实际的例子，来给初学者（也包括那些希望能让自己掌握更多技能的有经验的软件工程师）打下一个坚实的java基本知识的基础。 这个系列的第一篇文章介绍<strong>面向对象</strong>。</p>
<h4>面向对象的基础</h4>
<p>对于一个java初学者来说，首重就是彻底理解面向对象的概念。面向对象的特征是：封装、多态和继承。<strong>封装</strong>将类的数据与类的方法进行绑定，使得“私有”的数据只能通过“公共”的方法来获取。</p>
<p>而<strong>多态</strong>是一个能让一个通用方法作用于不同类型的数据之上的机制。多态让程序员能够对同一个方法名定义并使用多个实现（前提是这些实现采用了不同的签名）。比如，方法的重写就是编译时（静态）多态。</p>
<p>对多态的理解的核心是<cite title="method signature">方法签名</cite>的概念（也称为<cite title="mangled names">重整名字</cite>）。一个方法签名包括了方法名和它的参数类型（返回值类型不是这个签名的一部分）。下面这个表格将方法签名的概念进行了分类。</p>
<table>
<tr>
<th>Sl No</th>
<th>方法原型（由开发者指定）</th>
<th>方法签名（由编译器推断）</th>
</tr>
<tr>
<td>1.</td>
<td>int max(int num1, int num2)</td>
<td>max_int_int</td>
</tr>
<tr>
<td>2.</td>
<td>int max(int num1, int num2, int num3)</td>
<td>max_int_int_int</td>
</tr>
<tr>
<td>3.</td>
<td>int max(int[] iArr, int n)</td>
<td>max_int[]_int</td>
</tr>
</table>
<p>程序员指定原型及其实现，而编译器从一个方法调用中推断出方法签名，然后在实现中搜索匹配的签名以完成调用。</p>
<h4>java对象布局</h4>
<p>同一个类的数个对象会存放在不同的内存空间以保持他们自己的状态（实例变量值），但是一个类的所有对象会共享相同的方法实现。为了让这一点比较容易理解，我会解释一下执行时内存中的对象布局——运行时堆、栈、方法表和方法主体。</p>
<p>下面的代码是一个示例文件TestPoint3D.java，在其中定义了一个基类<code>Point2D</code>给一个几何平面中的点建模）和一个扩展自<code>Point2D</code>的派生类<code>Point3D</code>（给一个空间的点建模）。<code>Point3D</code>重写了父类的方法<code>getDistance()</code> 和 <code>show()</code>。 <code>TestPoint3D</code> 是个外部类，它包含的<code>main()</code>里面创建了<code>Point2D</code> 和 <code>Point3D</code> 的对象并调用了它们的方法。</p>
<p><strong>Code Listing: TestPoint3D.java</strong></p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> TestPoint3D<span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     <span style="color: #003399;">Point2D</span> p21<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Point2D</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span>,<span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #003399;">Point2D</span> p22<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Point2D</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">7</span>,<span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     Point3D p31<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> Point3D<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">5</span>,<span style="color: #cc66cc;">9</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
     <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Coords of p21: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>p21.<span style="color: #006633;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Coords of p22: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>p22.<span style="color: #006633;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Coords of p31: &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>p31.<span style="color: #006633;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
     <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;The distance of p31 from
                                          origin is &quot;</span><span style="color: #339933;">+</span>p31.<span style="color: #006633;">getDistance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">class</span> <span style="color: #003399;">Point2D</span><span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">double</span> x,y<span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Point2D</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       x<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>y<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Point2D</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> n1, <span style="color: #000066; font-weight: bold;">double</span> n2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      x<span style="color: #339933;">=</span>n1<span style="color: #339933;">;</span>y<span style="color: #339933;">=</span>n2<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> getX<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">return</span> x<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setX<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> n<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       x<span style="color: #339933;">=</span>n<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
 <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> getY<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">return</span> y<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setY<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> n<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       y<span style="color: #339933;">=</span>n<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> show<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;x=&quot;</span><span style="color: #339933;">+</span>x<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;  y=&quot;</span><span style="color: #339933;">+</span>y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> getDistance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #003399;">Math</span>.<span style="color: #006633;">sqrt</span><span style="color: #009900;">&#40;</span>x<span style="color: #339933;">*</span>x<span style="color: #339933;">+</span>y<span style="color: #339933;">*</span>y<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">class</span> Point3D <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">Point2D</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">double</span> z<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> Point3D<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        z<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   Point3D<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> n1, <span style="color: #000066; font-weight: bold;">double</span> n2, <span style="color: #000066; font-weight: bold;">double</span> n3<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span>n1,n2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        z<span style="color: #339933;">=</span>n3<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> getZ<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">return</span> z<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setZ<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> n<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        z<span style="color: #339933;">=</span>n<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> show<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;z=&quot;</span><span style="color: #339933;">+</span>z<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">double</span> getDistance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">double</span> tmp<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getDistance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #003399;">Math</span>.<span style="color: #006633;">sqrt</span><span style="color: #009900;">&#40;</span>tmp<span style="color: #339933;">*</span>tmp<span style="color: #339933;">+</span>z<span style="color: #339933;">*</span>z<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>一张图表可概念性地说明面向对象的基本特征是如何实现地。图1展示了上述实例代码在运行时的对象内存布局。</p>
<p><a href="http://sheneyan.com/blog/wp-content/uploads/2010/09/Java_OO_Figure1.png" rel="lightbox[1073]" rel="shadowbox[sbpost-1073];player=img;" title="Java_OO_Figure1"><img src="http://sheneyan.com/blog/wp-content/uploads/2010/09/Java_OO_Figure1-300x253.png" alt="" title="Java_OO_Figure1" width="300" height="253" class="alignnone size-medium wp-image-1103" /></a></p>
<p><strong>图 1. 运行时的对象内存布局</strong></p>
<p>所有的面向对象的概念，可以使用上面的图表阐述。（即便是更进一步的概念，如更多层的继承如何影响性能负载也可以用上图解释。）</p>
<h4>结论</h4>
<p>下面是总结面向对象概念的要点：</p>
<ul>
<li>当类加载的时候，每个类都会备好一个方法表。这个方法表会逐个包含加载的方法签名及相应地址。</li>
<li>当开始处理一个对象方法调用时，这个对象类的方法表会被关联并得到匹配方法签名的方法地址，然后执行该方法。</li>
<li>因此，一个类的所有对象共享相同的方法实现。</li>
<li>一个类的每个对象拥有独立的内存空间以保持实例变量x和y（在栈中）。只有引用保留在运行时堆中。</li>
<li>当一个类中找不到某方法时，将搜索它父类方法表（每个方法表储存了指向它上一级的指针）中的匹配签名。如果找到，该匹配签名将被执行。（这能够解释当子类未重写父类方法时父类的实现是如何和子类共享的）。</li>
</ul>
<h4>鸣谢</h4>
<p>见原文……</p>
<h4>关于作者</h4>
<p><strong>Gurunath Kalamadi</strong>是班加罗尔的Infosys Technologies Ltd.的教育与研究的现任分组管理者。（详细见原文……）</p>
]]></content:encoded>
			<wfw:commentRss>http://sheneyan.com/blog/2010/09/java-basics-object-orientation/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>用静态变量还是ServletContext？</title>
		<link>http://sheneyan.com/blog/2006/08/use-static-params-or-servletcontext/</link>
		<comments>http://sheneyan.com/blog/2006/08/use-static-params-or-servletcontext/#comments</comments>
		<pubDate>Tue, 29 Aug 2006 21:17:57 +0000</pubDate>
		<dc:creator>子乌</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[日记]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[工作]]></category>

		<guid isPermaLink="false">http://sheneyan.com/blog/?p=75</guid>
		<description><![CDATA[<p>今天在写代码的时候突然冒出这个奇怪的想法＝。＝……</p>
<p>先说明一下现在的状况：</p>
<p>我们的b/s系统是jsp的，里面有一种“表码表”，里面存放的是一些需要经常使用而且比较少发生改变的内容，表码表是一些Map对象，而这些表码表会存放在jsp的ServletContext中。</p>
<p>初始化的大致代码如下：</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&#160;&#160;Java</div><span style="color: #000000; font-weight: bold;">class</span> SysInit  <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #000000; font-weight: bold;">implements</span> ServletContextListener<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> contextInitialized<span style="color: #009900;">&#40;</span>ServletContextEve[......]</div></div><p class='read-more'><a href='http://sheneyan.com/blog/2006/08/use-static-params-or-servletcontext/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>今天在写代码的时候突然冒出这个奇怪的想法＝。＝……</p>
<p>先说明一下现在的状况：</p>
<p>我们的b/s系统是jsp的，里面有一种“表码表”，里面存放的是一些需要经常使用而且比较少发生改变的内容，表码表是一些Map对象，而这些表码表会存放在jsp的<var>ServletContext</var>中。</p>
<p>初始化的大致代码如下：</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> SysInit  <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #000000; font-weight: bold;">implements</span> ServletContextListener<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> contextInitialized<span style="color: #009900;">&#40;</span>ServletContextEvent sce<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">Map</span> myTablePool<span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">HashMap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    servletContext <span style="color: #339933;">=</span> sce.<span style="color: #006633;">getServletContext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//往myTablePool里面塞数据</span>
    ...
    <span style="color: #006633;">servletContext</span>.<span style="color: #006633;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;m1&quot;</span>,myTablePool<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ...
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>然后在需要调用这些表码表的那些BO类中从request的serveletContext中获取，再进行操作：</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> MyBO <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> MyBO<span style="color: #009900;">&#40;</span>HttpServletRequest req<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">Map</span> myTablePoo l<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Map</span><span style="color: #009900;">&#41;</span> req.<span style="color: #006633;">getSession</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getServletContext</span>.<span style="color: #006633;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;m1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//然后就开始使用myTablePool里面的操作</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>可是，今天在写BO类的时候突然想起来，这样子的做法和我在BO类里设置一个静态的私有变量有什么区别？？<br />
下面是我假想的代码，首先还是我的SysInit类：</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> SysInit  <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #000000; font-weight: bold;">implements</span> ServletContextListener<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> contextInitialized<span style="color: #009900;">&#40;</span>ServletContextEvent sce<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    servletContext <span style="color: #339933;">=</span> sce.<span style="color: #006633;">getServletContext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    MyBO.<span style="color: #006633;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//调用BO类的静态方法，初始化BO里的静态私有变量</span>
    ...
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>这是我的BO类：</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> MyBO <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">Map</span> myTablePool <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//我的静态表码表池</span>
  <span style="color: #000000; font-weight: bold;">public</span> MyBO<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//先判断一下myTablePool是否为空……</span>
    <span style="color: #666666; font-style: italic;">//测试过，除非initPool抛错，没对myTablePool初始化，否则不会为空</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>myTablePool <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      initPool<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">//直接操作myTablePool里面的数据</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> initPool<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    myTablePool <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">HashMap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//往myTablePool里面塞数据</span>
    ...
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>最早设计这套系统，使用ServletContext的家伙早就跳槽另谋高就，另外找了几个人问，都没有比较令人满意的答复，最多就是说静态变量放在内存里，如果web容器里跑的另外一个应用程序中也有一个同名的静态变量，会发生冲突……</p>
<p>谁能给我一个比较好的解释：类里的静态变量比较好，还是在全局的ServletContext里放着比较好？</p>
]]></content:encoded>
			<wfw:commentRss>http://sheneyan.com/blog/2006/08/use-static-params-or-servletcontext/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>java abstract类构造函数继承</title>
		<link>http://sheneyan.com/blog/2006/06/java-abstract-class-init-function-inherit/</link>
		<comments>http://sheneyan.com/blog/2006/06/java-abstract-class-init-function-inherit/#comments</comments>
		<pubDate>Sun, 25 Jun 2006 00:44:00 +0000</pubDate>
		<dc:creator>子乌</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[日记]]></category>
		<category><![CDATA[abstract]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[构造函数]]></category>

		<guid isPermaLink="false">http://sheneyan.com/blog/2006/06/java-abstract-class-init-function-inherit/</guid>
		<description><![CDATA[<p>写java这么久了，居然到现在才发现这个问题：</p>
<p>java的abstract类的构造函数如果没有默认的构造函数，它的子类也就必须实现一个构造函数（是不是默认的无所谓）,下面是一个典型的错误示例：</p>
<p>Base.class</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&#160;&#160;Java</div><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> Base<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> Base<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> t<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&#34;here:&#34;</span><span style="color: #339933;">+</span>t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></div></div>

<p>Child.class</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&#038;nb[......]</div></div></div><p class='read-more'><a href='http://sheneyan.com/blog/2006/06/java-abstract-class-init-function-inherit/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>写java这么久了，居然到现在才发现这个问题：</p>
<p>java的abstract类的构造函数如果没有默认的构造函数，它的子类也就必须实现一个构造函数（是不是默认的无所谓）,下面是一个典型的错误示例：</p>
<p>Base.class</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> Base<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> Base<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> t<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;here:&quot;</span><span style="color: #339933;">+</span>t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Child.class</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Child <span style="color: #000000; font-weight: bold;">extends</span> Base<span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A.class</p>

<div class="wp_syntax"><div class="code"><div class='code_header'>Language:&nbsp;&nbsp;Java</div><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> A<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    Base b<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> Child<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;t&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>结果会抛两个错误出来：</p>
<ul>
<li>cannot resolve symbol constructor Child (java.lang.String)</li>
<li>cannot resolve symbol constructor Base ()</li>
</ul>
<p>搞不懂是什么原因哦。。。莫名其妙的。谁给个解释的？</p>
<p>注：现在的解决方式就是在子函数里写上构造函数，不过。。。这个构造函数所有的子函数都一样啊。。为啥子不能继承？</p>
]]></content:encoded>
			<wfw:commentRss>http://sheneyan.com/blog/2006/06/java-abstract-class-init-function-inherit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

