﻿<?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>IT博客-Every Day's Gain</title><link>http://www.cnitblog.com/Larry.Zhao/</link><description>Larry.Zhao's Coding Diary</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 05:57:36 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 05:57:36 GMT</pubDate><ttl>60</ttl><item><title>Linux笔记--Process Control</title><link>http://www.cnitblog.com/Larry.Zhao/archive/2006/03/01/7064.html</link><dc:creator>Larry.Zhao's Coding Diary</dc:creator><author>Larry.Zhao's Coding Diary</author><pubDate>Wed, 01 Mar 2006 15:26:00 GMT</pubDate><guid>http://www.cnitblog.com/Larry.Zhao/archive/2006/03/01/7064.html</guid><wfw:comment>http://www.cnitblog.com/Larry.Zhao/comments/7064.html</wfw:comment><comments>http://www.cnitblog.com/Larry.Zhao/archive/2006/03/01/7064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Larry.Zhao/comments/commentRss/7064.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Larry.Zhao/services/trackbacks/7064.html</trackback:ping><description><![CDATA[<UL>
<LI>fork()函数完全复制本身进程的状态，并且给父进程返回pid，给子进程返回0，所以在代码中应该保存pid = fork(); 并在if(pid == 0){}中控制子进程。由于是完全复制本身进程，所以在父进程调用fork()前对父进程变量的改动都会影响子进程中变量的值，而子进程中的操作则不会影响父进程中变量的值。</LI></UL><img src ="http://www.cnitblog.com/Larry.Zhao/aggbug/7064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Larry.Zhao/" target="_blank">Larry.Zhao's Coding Diary</a> 2006-03-01 23:26 <a href="http://www.cnitblog.com/Larry.Zhao/archive/2006/03/01/7064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux笔记--File IO</title><link>http://www.cnitblog.com/Larry.Zhao/archive/2006/03/01/7063.html</link><dc:creator>Larry.Zhao's Coding Diary</dc:creator><author>Larry.Zhao's Coding Diary</author><pubDate>Wed, 01 Mar 2006 15:17:00 GMT</pubDate><guid>http://www.cnitblog.com/Larry.Zhao/archive/2006/03/01/7063.html</guid><wfw:comment>http://www.cnitblog.com/Larry.Zhao/comments/7063.html</wfw:comment><comments>http://www.cnitblog.com/Larry.Zhao/archive/2006/03/01/7063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Larry.Zhao/comments/commentRss/7063.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Larry.Zhao/services/trackbacks/7063.html</trackback:ping><description><![CDATA[<UL>
<LI>lseek大于文件现有长度，不过不进行写操作的话，不会增加文件长度。</LI>
<LI>用O_APPEND打开文件，可以再用lseek来调整文件指针。</LI></UL><img src ="http://www.cnitblog.com/Larry.Zhao/aggbug/7063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Larry.Zhao/" target="_blank">Larry.Zhao's Coding Diary</a> 2006-03-01 23:17 <a href="http://www.cnitblog.com/Larry.Zhao/archive/2006/03/01/7063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】创建带图标和缩进的JComboBox</title><link>http://www.cnitblog.com/Larry.Zhao/archive/2006/02/02/6414.html</link><dc:creator>Larry.Zhao's Coding Diary</dc:creator><author>Larry.Zhao's Coding Diary</author><pubDate>Wed, 01 Feb 2006 16:13:00 GMT</pubDate><guid>http://www.cnitblog.com/Larry.Zhao/archive/2006/02/02/6414.html</guid><wfw:comment>http://www.cnitblog.com/Larry.Zhao/comments/6414.html</wfw:comment><comments>http://www.cnitblog.com/Larry.Zhao/archive/2006/02/02/6414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Larry.Zhao/comments/commentRss/6414.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Larry.Zhao/services/trackbacks/6414.html</trackback:ping><description><![CDATA[<P dir=ltr style="MARGIN-RIGHT: 0px">默认的JComboBox无法在每个条目上显示图标、缩进等样式。但是Swing的MVC设计结构为各种组件提供了无与伦比的可扩展性。为了实现这一点，我们可以创建一个新的Renderer来负责每个条目的绘制。</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">首先我们新写一个类ImagedComboBoxItem，它封装了一个下拉条目的信息，包括图标、文字、缩进等：</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">class ImagedComboBoxItem {<BR>&nbsp;&nbsp;&nbsp; private Icon icon = null;<BR>&nbsp;&nbsp;&nbsp; private String text = null;<BR>&nbsp;&nbsp;&nbsp; private int indent = 0;</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">&nbsp;&nbsp;&nbsp; ImagedComboBoxItem(String text, Icon icon, int indent) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.text = text;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.icon = icon;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.indent = indent;<BR>&nbsp;&nbsp;&nbsp; }</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">&nbsp;&nbsp;&nbsp; public String getText() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return text;<BR>&nbsp;&nbsp;&nbsp; }</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">&nbsp;&nbsp;&nbsp; public Icon getIcon() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return icon;<BR>&nbsp;&nbsp;&nbsp; }</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">&nbsp;&nbsp;&nbsp; public int getIndent() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return indent;<BR>&nbsp;&nbsp;&nbsp; }<BR>}</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">然后新建JImagedComboBox类并从JComboBox继承。在构造函数中，新建一个DefaultListCellRenderer作为新的Renderer，并覆盖其getListCellRendererComponent方法。在新的getListCellRendererComponent方法中，首先依旧调用父对象的该方法，以便完成普通条目的绘制；然后判断条目是否是ImagedComboBoxItem实例。如果是，则显示ImagedComboBoxItem的文字、图标，并显示缩进。为了更方便的显示左侧缩进，我们直接创建一个EmptyBorder并设置左侧缩进数量，并设置到DefaultListCellRenderer中。DefaultListCellRenderer从JLabel继承而来，所以可直接接受各种Border。这里我们以每个缩进10象素为例。</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">好了，以下是完整代码：</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">import java.util.*;</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">import java.awt.*;<BR>import javax.swing.*;</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">public class JImagedComboBox extends JComboBox {<BR>&nbsp;&nbsp;&nbsp; public JImagedComboBox(Vector values) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(values);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ListCellRenderer renderer = new DefaultListCellRenderer() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Component getListCellRendererComponent(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JList list,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object value,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int index,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean isSelected,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean cellHasFocus) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (value instanceof ImagedComboBoxItem) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImagedComboBoxItem item = (ImagedComboBoxItem) value;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setText(item.getText());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setIcon(item.getIcon());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (isPopupVisible()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int offset = 10 * item.getIndent();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setBorder(BorderFactory.createEmptyBorder(0, offset, 0, 0));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setRenderer(renderer);<BR>&nbsp;&nbsp;&nbsp; }</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFrame frame = new JFrame();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.setSize(400, 400);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Vector values = new Vector();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Icon openIcon = new ImageIcon(JImagedComboBox.class.getResource("Open16.gif"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Icon newIcon = new ImageIcon(JImagedComboBox.class.getResource("New16.gif"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 5; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; values.addElement(new ImagedComboBoxItem("Directory " + i, openIcon, i));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 5; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; values.addElement(new ImagedComboBoxItem("Image Item " + i, newIcon, 5));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JImagedComboBox comboBox = new JImagedComboBox(values);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.getContentPane().add(comboBox, BorderLayout.NORTH);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.show();<BR>&nbsp;&nbsp;&nbsp; }<BR>}</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">class ImagedComboBoxItem {<BR>&nbsp;&nbsp;&nbsp; private Icon icon = null;<BR>&nbsp;&nbsp;&nbsp; private String text = null;<BR>&nbsp;&nbsp;&nbsp; private int indent = 0;</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">&nbsp;&nbsp;&nbsp; ImagedComboBoxItem(String text, Icon icon, int indent) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.text = text;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.icon = icon;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.indent = indent;<BR>&nbsp;&nbsp;&nbsp; }</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">&nbsp;&nbsp;&nbsp; public String getText() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return text;<BR>&nbsp;&nbsp;&nbsp; }</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">&nbsp;&nbsp;&nbsp; public Icon getIcon() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return icon;<BR>&nbsp;&nbsp;&nbsp; }</P>
<P dir=ltr style="MARGIN-RIGHT: 0px">&nbsp;&nbsp;&nbsp; public int getIndent() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return indent;<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR><BR><FONT size=2>作者: solo,&nbsp;原文地址：</FONT><A href="http://blog.csdn.net/solo/archive/2004/09/10/100380.aspx"><FONT size=2>http://blog.csdn.net/solo/archive/2004/09/10/100380.aspx</FONT></A></P><img src ="http://www.cnitblog.com/Larry.Zhao/aggbug/6414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Larry.Zhao/" target="_blank">Larry.Zhao's Coding Diary</a> 2006-02-02 00:13 <a href="http://www.cnitblog.com/Larry.Zhao/archive/2006/02/02/6414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】Java中日期时间的格式化</title><link>http://www.cnitblog.com/Larry.Zhao/archive/2006/01/30/6401.html</link><dc:creator>Larry.Zhao's Coding Diary</dc:creator><author>Larry.Zhao's Coding Diary</author><pubDate>Mon, 30 Jan 2006 08:28:00 GMT</pubDate><guid>http://www.cnitblog.com/Larry.Zhao/archive/2006/01/30/6401.html</guid><wfw:comment>http://www.cnitblog.com/Larry.Zhao/comments/6401.html</wfw:comment><comments>http://www.cnitblog.com/Larry.Zhao/archive/2006/01/30/6401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Larry.Zhao/comments/commentRss/6401.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Larry.Zhao/services/trackbacks/6401.html</trackback:ping><description><![CDATA[Java&nbsp;语言的Calendar，GregorianCalendar&nbsp;(日历),Date(日期),&nbsp;和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分.&nbsp;日期是商业逻辑计算一个关键的部分.&nbsp;所有的开发者都应该能够计算未来的日期,&nbsp;定制日期的显示格式,&nbsp;并将文本数据解析成日期对象。学习日期,&nbsp;日期格式,&nbsp;日期的解析和日期的计算。&nbsp;<BR><BR>我们将讨论下面的类:&nbsp;<BR><BR>1、&nbsp;&nbsp;具体类(和抽象类相对)java.util.Date&nbsp;<BR><BR>2、&nbsp;&nbsp;抽象类java.text.DateFormat&nbsp;和它的一个具体子类,java.text.SimpleDateFormat&nbsp;<BR><BR>3、&nbsp;&nbsp;抽象类java.util.Calendar&nbsp;和它的一个具体子类,java.util.GregorianCalendar&nbsp;<BR><BR>具体类可以被实例化,&nbsp;但是抽象类却不能.&nbsp;你首先必须实现抽象类的一个具体子类.<BR><BR>1.&nbsp;&nbsp;&nbsp;java.util.Date及其格式化<BR>Date&nbsp;类从Java&nbsp;开发包(JDK)&nbsp;1.0&nbsp;就开始进化,&nbsp;当时它只包含了几个取得或者设置一个日期数据的各个部分的方法,&nbsp;比如说月,&nbsp;日,&nbsp;和年.&nbsp;这些方法现在遭到了批评并且已经被转移到了Calendar类里去了,&nbsp;我们将在本文中进一步讨论它.&nbsp;这种改进旨在更好的处理日期数据的国际化格式.&nbsp;就象在JDK&nbsp;1.1中一样,&nbsp;Date&nbsp;类实际上只是一个包裹类,&nbsp;它包含的是一个长整型数据,&nbsp;表示的是从GMT(格林尼治标准时间)1970年,&nbsp;1&nbsp;月&nbsp;1日00:00:00这一刻之前或者是之后经历的毫秒数.&nbsp;<BR><BR>1.1.&nbsp;创建java.util.Date<BR>Java统计从1970年1月1日起的毫秒的数量表示日期。也就是说，例如，1970年1月2日，是在1月1日后的86，400，000毫秒。同样的，1969年12月31日是在1970年1月1日前86，400，000毫秒。Java的Date类使用long类型纪录这些毫秒值.因为long是有符号整数，所以日期可以在1970年1月1日之前，也可以在这之后。Long类型表示的最大正值和最大负值可以轻松的表示290，000，000年的时间，这适合大多数人的时间要求。<BR><BR>让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子.&nbsp;这个时间通常被称为Java&nbsp;虚拟机(JVM)主机环境的系统时间.&nbsp;<BR>import&nbsp;java.util.Date;&nbsp;<BR><BR>public&nbsp;class&nbsp;DateExample1&nbsp;{&nbsp;<BR><BR>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;<BR><BR>//&nbsp;Get&nbsp;the&nbsp;system&nbsp;date/time&nbsp;<BR><BR>Date&nbsp;date&nbsp;=&nbsp;new&nbsp;Date();&nbsp;<BR><BR>//&nbsp;打印出具体的年，月，日，小时，分钟，秒钟以及时区<BR><BR>System.out.println(date.getTime());&nbsp;<BR><BR>}&nbsp;&nbsp;&nbsp;<BR><BR>}&nbsp;<BR><BR>在星期六,&nbsp;2001年9月29日,&nbsp;下午大约是6:50的样子,&nbsp;上面的例子在系统输出设备上显示的结果是&nbsp;1001803809710.&nbsp;在这个例子中,值得注意的是我们使用了Date&nbsp;构造函数创建一个日期对象,&nbsp;这个构造函数没有接受任何参数.&nbsp;而这个构造函数在内部使用了System.currentTimeMillis()&nbsp;方法来从系统获取日期.&nbsp;<BR><BR>//1年前日期<BR><BR>&nbsp;&nbsp;&nbsp;java.util.Date&nbsp;myDate=new&nbsp;java.util.Date();&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;long&nbsp;myTime=(myDate.getTime()/1000)-60*60*24*365;<BR><BR>&nbsp;&nbsp;&nbsp;myDate.setTime(myTime*1000);<BR><BR>&nbsp;&nbsp;&nbsp;String&nbsp;mDate=formatter.format(myDate);<BR><BR>//明天日期<BR><BR>&nbsp;&nbsp;&nbsp;myDate=new&nbsp;java.util.Date();&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;myTime=(myDate.getTime()/1000)+60*60*24;<BR><BR>&nbsp;&nbsp;&nbsp;myDate.setTime(myTime*1000);<BR><BR>&nbsp;&nbsp;&nbsp;mDate=formatter.format(myDate);<BR><BR>//两个时间之间的天数<BR><BR>&nbsp;&nbsp;&nbsp;SimpleDateFormat&nbsp;myFormatter&nbsp;=&nbsp;new&nbsp;SimpleDateFormat("yyyy-MM-dd");<BR><BR>&nbsp;&nbsp;&nbsp;java.util.Date&nbsp;date=&nbsp;myFormatter.parse("2003-05-1");&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;java.util.Date&nbsp;mydate=&nbsp;myFormatter.parse("1899-12-30");<BR><BR>&nbsp;&nbsp;&nbsp;long&nbsp;&nbsp;day=(date.getTime()-mydate.getTime())/(24*60*60*1000);<BR><BR>//加半小时<BR><BR>SimpleDateFormat&nbsp;format&nbsp;=&nbsp;new&nbsp;SimpleDateFormat("yyyy-MM-dd&nbsp;hh:mm:ss");<BR><BR>java.util.Date&nbsp;date1&nbsp;=&nbsp;format.parse("2002-02-28&nbsp;23:16:00");<BR><BR>long&nbsp;Time=(date1.getTime()/1000)+60*30;<BR><BR>date1.setTime(Time*1000);<BR><BR>String&nbsp;mydate1=formatter.format(date1);<BR><BR>//年月周求日期<BR><BR>SimpleDateFormat&nbsp;formatter2&nbsp;=&nbsp;new&nbsp;SimpleDateFormat("yyyy-MM&nbsp;F&nbsp;E");<BR><BR>java.util.Date&nbsp;date2=&nbsp;formatter2.parse("2003-05&nbsp;5&nbsp;星期五");&nbsp;<BR><BR>SimpleDateFormat&nbsp;formatter3&nbsp;=&nbsp;new&nbsp;SimpleDateFormat("yyyy-MM-dd");<BR><BR>String&nbsp;mydate2=formatter3.format(date2);<BR><BR>//求是星期几<BR><BR>mydate=&nbsp;myFormatter.parse("2001-1-1");<BR><BR>SimpleDateFormat&nbsp;formatter4&nbsp;=&nbsp;new&nbsp;SimpleDateFormat("E");<BR><BR>String&nbsp;mydate3=formatter4.format(mydate);<BR><BR>&nbsp;<BR>&nbsp;<BR><BR>&nbsp;<BR><BR>1.2.&nbsp;Date格式化<BR>能以一种用户明白的格式来显示这个日期呢?&nbsp;在这里类java.text.SimpleDateFormat&nbsp;和它的抽象基类&nbsp;java.text.DateFormat。那么,&nbsp;现在我们已经知道了如何获取从1970年1月1日开始经历的毫秒数了.&nbsp;我们如何才format&nbsp;就派得上用场了.&nbsp;<BR><BR>//&nbsp;我们能不能用下面的代码构件出&nbsp;2001/8/8&nbsp;8:8<BR>&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;java.io.*;<BR>&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;java.util.*;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;WhatIsDate<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;=&nbsp;new&nbsp;Date(2001,&nbsp;8,&nbsp;8,&nbsp;8,&nbsp;8,&nbsp;8);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(date);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;<BR><BR>Java&nbsp;的编译器竟然报如下信息&nbsp;(Sun&nbsp;JDK1.3,&nbsp;Windows&nbsp;2000&nbsp;中文下)<BR><BR>注意：<BR>WhatIsDate.java&nbsp;使用或覆盖一个不鼓励使用的API。<BR>注意：<BR>使用-deprecation重新编译，以得到详细信息。！<BR>&nbsp;<BR><BR>那么&nbsp;Date&nbsp;对象究竟是为了满足哪个需求呢？看来它不是用来实现基于年/月/日小时:分钟&nbsp;的时间表述。我们查看&nbsp;Java&nbsp;的文档，我们看到有&nbsp;getTime()&nbsp;方法，它返回的竟然是一个&nbsp;long&nbsp;值。<BR><BR>文档进一步又告诉我们这个值代表了当前系统的时间离1970/1/1&nbsp;0:0&nbsp;的毫秒差，而且是在&nbsp;GMT&nbsp;时区下(也被称为&nbsp;EPOC)。如果我们指定的时间是在此之前的，那它将返回一个负数值。<BR><BR>这个发现让我们对&nbsp;Date&nbsp;对象有了一个全新的认识-Date&nbsp;存放的是与&nbsp;EPOC&nbsp;的偏差值。换而言之我们也可通过&nbsp;long&nbsp;类型来表示时间？对了，这个猜想是得到了&nbsp;Java&nbsp;的支持：<BR><BR>&nbsp;&nbsp;&nbsp;//&nbsp;第二种获得当前时间的方法<BR>&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;dateInMilliSeconds&nbsp;=&nbsp;System.currentTimeMillis();<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;这时候打印出的只是一串数字而已<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(dateInMilliSeconds);<BR>&nbsp;<BR><BR>对程序执行效率敏感的程序员可以发现这个方法只是生成一个&nbsp;Java&nbsp;的原始类型&nbsp;(primitive&nbsp;type)&nbsp;long,&nbsp;不需要实例化一个对象。因此如果我们对时间的处理只是在内部进行时，可以用&nbsp;long&nbsp;来代替&nbsp;Date&nbsp;对象。<BR><BR>最典型的应用就是在一段代码开始和结束时,分别获得系统当前的时间,然后计算出代码执行所需的时间(微秒级)。<BR><BR>&nbsp;&nbsp;&nbsp;long&nbsp;start&nbsp;=&nbsp;System.currentTimeMillis();<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;代码段<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("需要&nbsp;"+(System.currentTimeMillis()-start)+"&nbsp;微秒");<BR>&nbsp;<BR><BR>那么当我们要把这个&nbsp;long&nbsp;值已更为友好的表现形式显示处理的时候，我们可以用它来构造&nbsp;Date&nbsp;对象：<BR><BR>Date&nbsp;date&nbsp;=&nbsp;new&nbsp;Date(dateInMilliSeconds);<BR><BR>System.out.println(date);<BR>&nbsp;<BR><BR>我们看到了在&nbsp;Java&nbsp;中对时间最为基本的表示，有通过对EPOC&nbsp;的偏差值进行处理。Date&nbsp;对象是对它的一个对象的封装。我们同时也看到了，在现时世界中我们对时间的描述通常是通过"某年某月某日某时某分"来定义的。Date&nbsp;的显示(实际上是&nbsp;toString()&nbsp;方法)描述了这些信息，但&nbsp;Java&nbsp;并不建议我们用这种方式直接来构件&nbsp;Date&nbsp;对象。因此我们需要找出哪个对象可以实现这个需求。这就是我们下面就要讲述的&nbsp;Calendar&nbsp;对象的功能。<BR><BR>在我们进一步研究&nbsp;Calendar&nbsp;之前，请记住&nbsp;Date&nbsp;只是一个对&nbsp;long&nbsp;值(基于&nbsp;GMT&nbsp;时区)的对象封装。它所表现出来的年/月/日小时:分钟时区的时间表述，只是它的&nbsp;toString()&nbsp;方法所提供的。千万不要为这个假象所迷惑。<BR><BR>假如我们希望定制日期数据的格式,&nbsp;比方星期六-9月-29日-2001年.&nbsp;下面的例子展示了如何完成这个工作:&nbsp;<BR><BR>import&nbsp;java.text.SimpleDateFormat;&nbsp;<BR><BR>import&nbsp;java.util.Date;&nbsp;<BR><BR>public&nbsp;class&nbsp;DateExample2&nbsp;{&nbsp;<BR><BR>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;<BR><BR>SimpleDateFormat&nbsp;bartDateFormat&nbsp;=&nbsp;new&nbsp;SimpleDateFormat("EEEE-MMMM-dd-yyyy");&nbsp;Date&nbsp;date&nbsp;=&nbsp;new&nbsp;Date();&nbsp;<BR><BR>System.out.println(bartDateFormat.format(date));&nbsp;<BR><BR>}<BR><BR>}<BR>&nbsp;<BR><BR>只要通过向SimpleDateFormat&nbsp;的构造函数传递格式字符串"EEE-MMMM-dd-yyyy",&nbsp;我们就能够指明自己想要的格式.&nbsp;你应该可以看见,&nbsp;格式字符串中的ASCII&nbsp;字符告诉格式化函数下面显示日期数据的哪一个部分.&nbsp;EEEE是星期,&nbsp;MMMM是月,&nbsp;dd是日,&nbsp;yyyy是年.&nbsp;字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yy"会显示&nbsp;Sat-09-29-01.&nbsp;请察看Sun&nbsp;公司的Web&nbsp;站点获取日期格式化选项的完整的指示.&nbsp;<BR><BR>1.3.&nbsp;文本数据解析成日期对象&nbsp;<BR>假设我们有一个文本字符串包含了一个格式化了的日期对象,&nbsp;而我们希望解析这个字符串并从文本日期数据创建一个日期对象.&nbsp;我们将再次以格式化字符串"MM-dd-yyyy"&nbsp;调用SimpleDateFormat类,&nbsp;但是这一次,&nbsp;我们使用格式化解析而不是生成一个文本日期数据.&nbsp;我们的例子,&nbsp;显示在下面,&nbsp;将解析文本字符串"9-29-2001"并创建一个值为001736000000&nbsp;的日期对象.&nbsp;<BR><BR>通过parse()方法，DateFormat能够以一个字符串创立一个Date对象。这个方法能抛出ParseException异常，所以你必须使用适当的异常处理技术。<BR><BR>例子程序:&nbsp;<BR><BR>import&nbsp;java.text.SimpleDateFormat;&nbsp;<BR><BR>import&nbsp;java.util.Date;&nbsp;<BR><BR>public&nbsp;class&nbsp;DateExample3&nbsp;{&nbsp;<BR><BR>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;<BR><BR>//&nbsp;Create&nbsp;a&nbsp;date&nbsp;formatter&nbsp;that&nbsp;can&nbsp;parse&nbsp;dates&nbsp;of&nbsp;<BR><BR>//&nbsp;the&nbsp;form&nbsp;MM-dd-yyyy.&nbsp;<BR><BR>SimpleDateFormat&nbsp;bartDateFormat&nbsp;=&nbsp;new&nbsp;SimpleDateFormat("MM-dd-yyyy");&nbsp;<BR><BR>//&nbsp;Create&nbsp;a&nbsp;string&nbsp;containing&nbsp;a&nbsp;text&nbsp;date&nbsp;to&nbsp;be&nbsp;parsed.&nbsp;<BR><BR>String&nbsp;dateStringToParse&nbsp;=&nbsp;"9-29-2001";&nbsp;<BR><BR>try&nbsp;{&nbsp;<BR><BR>//&nbsp;Parse&nbsp;the&nbsp;text&nbsp;version&nbsp;of&nbsp;the&nbsp;date.&nbsp;<BR><BR>//&nbsp;We&nbsp;have&nbsp;to&nbsp;perform&nbsp;the&nbsp;parse&nbsp;method&nbsp;in&nbsp;a&nbsp;<BR><BR>//&nbsp;try-catch&nbsp;construct&nbsp;in&nbsp;case&nbsp;dateStringToParse&nbsp;<BR><BR>//&nbsp;does&nbsp;not&nbsp;contain&nbsp;a&nbsp;date&nbsp;in&nbsp;the&nbsp;format&nbsp;we&nbsp;are&nbsp;expecting.&nbsp;<BR><BR>Date&nbsp;date&nbsp;=&nbsp;bartDateFormat.parse(dateStringToParse);&nbsp;<BR><BR>//&nbsp;Now&nbsp;send&nbsp;the&nbsp;parsed&nbsp;date&nbsp;as&nbsp;a&nbsp;long&nbsp;value&nbsp;<BR><BR>//&nbsp;to&nbsp;the&nbsp;system&nbsp;output.&nbsp;<BR><BR>System.out.println(date.getTime());&nbsp;<BR><BR>}catch&nbsp;(Exception&nbsp;ex)&nbsp;{&nbsp;<BR><BR>System.out.println(ex.getMessage());&nbsp;<BR><BR>}<BR><BR>}&nbsp;<BR><BR>}&nbsp;<BR>&nbsp;<BR><BR>1.4.&nbsp;使用标准的日期格式化过程&nbsp;<BR>既然我们已经可以生成和解析定制的日期格式了,&nbsp;让我们来看一看如何使用内建的格式化过程.&nbsp;方法&nbsp;DateFormat.getDateTimeInstance()&nbsp;让我们得以用几种不同的方法获得标准的日期格式化过程.&nbsp;在下面的例子中,&nbsp;我们获取了四个内建的日期格式化过程.&nbsp;它们包括一个短的,&nbsp;中等的,&nbsp;长的,&nbsp;和完整的日期格式.&nbsp;<BR><BR>import&nbsp;java.text.DateFormat;&nbsp;<BR><BR>import&nbsp;java.util.Date;&nbsp;<BR><BR>public&nbsp;class&nbsp;DateExample4&nbsp;{&nbsp;<BR><BR>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;<BR><BR>Date&nbsp;date&nbsp;=&nbsp;new&nbsp;Date();&nbsp;<BR><BR>DateFormat&nbsp;shortDateFormat&nbsp;=&nbsp;DateFormat.getDateTimeInstance(&nbsp;<BR><BR>DateFormat.SHORT,&nbsp;DateFormat.SHORT);&nbsp;<BR><BR>DateFormat&nbsp;mediumDateFormat&nbsp;=&nbsp;DateFormat.getDateTimeInstance(&nbsp;<BR><BR>DateFormat.MEDIUM,&nbsp;DateFormat.MEDIUM);&nbsp;<BR><BR>DateFormat&nbsp;longDateFormat&nbsp;=&nbsp;DateFormat.getDateTimeInstance(&nbsp;<BR><BR>DateFormat.LONG,&nbsp;DateFormat.LONG);&nbsp;<BR><BR>DateFormat&nbsp;fullDateFormat&nbsp;=&nbsp;DateFormat.getDateTimeInstance(&nbsp;<BR><BR>DateFormat.FULL,&nbsp;DateFormat.FULL);&nbsp;<BR><BR>System.out.println(shortDateFormat.format(date));&nbsp;System.out.println(mediumDateFormat.format(date));&nbsp;System.out.println(longDateFormat.format(date));&nbsp;System.out.println(fullDateFormat.format(date));&nbsp;<BR><BR>}&nbsp;<BR><BR>}&nbsp;<BR><BR>注意我们在对&nbsp;getDateTimeInstance的每次调用中都传递了两个值.&nbsp;第一个参数是日期风格,&nbsp;而第二个参数是时间风格.&nbsp;它们都是基本数据类型int(整型).&nbsp;考虑到可读性,&nbsp;我们使用了DateFormat&nbsp;类提供的常量:&nbsp;SHORT,&nbsp;MEDIUM,&nbsp;LONG,&nbsp;和&nbsp;FULL.&nbsp;要知道获取时间和日期格式化过程的更多的方法和选项,&nbsp;请看Sun&nbsp;公司Web&nbsp;站点上的解释.&nbsp;<BR><BR>运行我们的例子程序的时候,&nbsp;它将向标准输出设备输出下面的内容:&nbsp;<BR>9/29/01&nbsp;8:44&nbsp;PM&nbsp;<BR>Sep&nbsp;29,&nbsp;2001&nbsp;8:44:45&nbsp;PM&nbsp;<BR>September&nbsp;29,&nbsp;2001&nbsp;8:44:45&nbsp;PM&nbsp;EDT&nbsp;<BR>Saturday,&nbsp;September&nbsp;29,&nbsp;2001&nbsp;8:44:45&nbsp;PM&nbsp;EDT&nbsp;<BR><BR>2.&nbsp;&nbsp;&nbsp;Calendar&nbsp;日历类&nbsp;<BR>首先请记住&nbsp;Calendar&nbsp;只是一个抽象类,&nbsp;也就是说你无法直接获得它的一个实例，换而言之你可以提供一个自己开发的&nbsp;Calendar&nbsp;对象。<BR><BR>那究竟什么是一个&nbsp;Calendar&nbsp;呢？中文的翻译就是日历，那我们立刻可以想到我们生活中有阳(公)历、阴(农)历之分。它们的区别在哪呢？<BR><BR>比如有：<BR><BR>月份的定义&nbsp;-&nbsp;阳`(公)历&nbsp;一年12&nbsp;个月，每个月的天数各不同；阴(农)历，每个月固定28天,每周的第一天&nbsp;-&nbsp;阳(公)历星期日是第一天；阴(农)历，星期一是第一天<BR><BR>实际上，在历史上有着许多种纪元的方法。它们的差异实在太大了，比如说一个人的生日是"八月八日"&nbsp;那么一种可能是阳(公)历的八月八日，但也可以是阴(农)历的日期。所以为了计时的统一，必需指定一个日历的选择。那现在最为普及和通用的日历就是&nbsp;"Gregorian&nbsp;Calendar"。也就是我们在讲述年份时常用&nbsp;"公元几几年"。Calendar&nbsp;抽象类定义了足够的方法，让我们能够表述日历的规则。Java&nbsp;本身提供了对&nbsp;"Gregorian&nbsp;Calendar"&nbsp;规则的实现。我们从&nbsp;Calendar.getInstance()&nbsp;中所获得的实例就是一个&nbsp;"GreogrianCalendar"&nbsp;对象(与您通过&nbsp;new&nbsp;GregorianCalendar()&nbsp;获得的结果一致)。<BR><BR>下面的代码可以证明这一点：<BR><BR>&nbsp;&nbsp;&nbsp;import&nbsp;java.io.*;<BR>&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;java.util.*;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;WhatIsCalendar<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;calendar&nbsp;=&nbsp;Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(calendar&nbsp;instanceof&nbsp;GregorianCalendar)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("It&nbsp;is&nbsp;an&nbsp;instance&nbsp;of&nbsp;GregorianCalendar");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;<BR><BR>&nbsp;<BR><BR>Calendar&nbsp;在&nbsp;Java&nbsp;中是一个抽象类(Abstract&nbsp;Class)，GregorianCalendar&nbsp;是它的一个具体实现。<BR><BR>Calendar&nbsp;与&nbsp;Date&nbsp;的转换非常简单：<BR><BR>&nbsp;&nbsp;&nbsp;Calendar&nbsp;calendar&nbsp;=&nbsp;Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;从一个&nbsp;Calendar&nbsp;对象中获取&nbsp;Date&nbsp;对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;=&nbsp;calendar.getTime();<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;将&nbsp;Date&nbsp;对象反应到一个&nbsp;Calendar&nbsp;对象中，<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Calendar/GregorianCalendar&nbsp;没有构造函数可以接受&nbsp;Date&nbsp;对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;所以我们必需先获得一个实例，然后设置&nbsp;Date&nbsp;对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;calendar.setTime(date);<BR>&nbsp;<BR>&nbsp;<BR><BR>&nbsp;<BR><BR>Calendar&nbsp;对象在使用时，有一些值得注意的事项：<BR><BR>1.&nbsp;Calendar&nbsp;的&nbsp;set()&nbsp;方法<BR><BR>set(int&nbsp;field,&nbsp;int&nbsp;value)&nbsp;-&nbsp;是用来设置"年/月/日/小时/分钟/秒/微秒"等值<BR><BR>field&nbsp;的定义在&nbsp;Calendar&nbsp;中<BR><BR>set(int&nbsp;year,&nbsp;int&nbsp;month,&nbsp;int&nbsp;day,&nbsp;int&nbsp;hour,&nbsp;int&nbsp;minute,&nbsp;int&nbsp;second)&nbsp;但没有set(int&nbsp;year,&nbsp;int&nbsp;month,&nbsp;int&nbsp;day,&nbsp;int&nbsp;hour,&nbsp;int&nbsp;minute,&nbsp;int&nbsp;second,&nbsp;int&nbsp;millisecond)&nbsp;前面&nbsp;set(int,int,int,int,int,int)&nbsp;方法不会自动将&nbsp;MilliSecond&nbsp;清为&nbsp;0。<BR><BR>另外，月份的起始值为０而不是１，所以要设置八月时，我们用７而不是8。<BR><BR>calendar.set(Calendar.MONTH,&nbsp;7);<BR><BR>我们通常需要在程序逻辑中将它清为&nbsp;0，否则可能会出现下面的情况：<BR><BR>&nbsp;&nbsp;&nbsp;import&nbsp;java.io.*;<BR>&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;java.util.*;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;WhatIsCalendarWrite<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;out&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;ObjectOutputStream(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;FileOutputStream("calendar.out"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cal1&nbsp;=&nbsp;Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal1.set(2000,&nbsp;7,&nbsp;1,&nbsp;0,&nbsp;0,&nbsp;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.writeObject(cal1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cal2&nbsp;=&nbsp;Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal2.set(2000,&nbsp;7,&nbsp;1,&nbsp;0,&nbsp;0,&nbsp;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal2.set(Calendar.MILLISECOND,&nbsp;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.writeObject(cal2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;<BR><BR>我们将&nbsp;Calendar&nbsp;保存到文件中<BR><BR>&nbsp;&nbsp;&nbsp;import&nbsp;java.io.*;<BR>&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;java.util.*;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;WhatIsCalendarRead<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;in&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;ObjectInputStream(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;FileInputStream("calendar.out"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cal2&nbsp;=&nbsp;(Calendar)in.readObject();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cal1&nbsp;=&nbsp;Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal1.set(2000,&nbsp;7,&nbsp;1,&nbsp;0,&nbsp;0,&nbsp;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cal1.equals(cal2))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Equals");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("NotEqual");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Old&nbsp;calendar&nbsp;"+cal2.getTime().getTime());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("New&nbsp;calendar&nbsp;"+cal1.getTime().getTime());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal1.set(Calendar.MILLISECOND,&nbsp;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal2&nbsp;=&nbsp;(Calendar)in.readObject();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cal1.equals(cal2))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Equals");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("NotEqual");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Processed&nbsp;Old&nbsp;calendar&nbsp;"+cal2.getTime().getTime());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Processed&nbsp;New&nbsp;calendar&nbsp;"+cal1.getTime().getTime());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;<BR><BR>然后再另外一个程序中取回来（模拟对数据库的存储），但是执行的结果是：<BR><BR>NotEqual<BR>Old&nbsp;calendar&nbsp;965113200422&nbsp;&lt;------------&nbsp;最后三位的MilliSecond与当前时间有关<BR>New&nbsp;calendar&nbsp;965113200059&nbsp;&lt;-----------/<BR>Equals<BR>Processed&nbsp;Old&nbsp;calendar&nbsp;965113200000<BR>Processed&nbsp;New&nbsp;calendar&nbsp;965113200000<BR>&nbsp;<BR>&nbsp;<BR><BR>另外我们要注意的一点是，Calendar&nbsp;为了性能原因对&nbsp;set()&nbsp;方法采取延缓计算的方法。在&nbsp;JavaDoc&nbsp;中有下面的例子来说明这个问题：<BR><BR>Calendar&nbsp;cal1&nbsp;=&nbsp;Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;cal1.set(2000,&nbsp;7,&nbsp;31,&nbsp;0,&nbsp;0&nbsp;,&nbsp;0);&nbsp;//2000-8-31<BR>&nbsp;&nbsp;&nbsp;&nbsp;cal1.set(Calendar.MONTH,&nbsp;Calendar.SEPTEMBER);&nbsp;//应该是&nbsp;2000-9-31，也就是&nbsp;2000-10-1<BR>&nbsp;&nbsp;&nbsp;&nbsp;cal1.set(Calendar.DAY_OF_MONTH,&nbsp;30);&nbsp;//如果&nbsp;Calendar&nbsp;转化到&nbsp;2000-10-1，那么现在的结果就该是&nbsp;2000-10-30<BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(cal1.getTime());&nbsp;//输出的是2000-9-30，说明&nbsp;Calendar&nbsp;不是马上就刷新其内部的记录<BR>&nbsp;<BR><BR>在&nbsp;Calendar&nbsp;的方法中，get()&nbsp;和&nbsp;add()&nbsp;会让&nbsp;Calendar&nbsp;立刻刷新。Set()&nbsp;的这个特性会给我们的开发带来一些意想不到的结果。我们后面会看到这个问题。<BR><BR>2.&nbsp;Calendar&nbsp;对象的容错性，Lenient&nbsp;设置<BR><BR>我们知道特定的月份有不同的日期，当一个用户给出错误的日期时，Calendar&nbsp;如何处理的呢？<BR><BR>&nbsp;&nbsp;&nbsp;import&nbsp;java.io.*;<BR>&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;java.util.*;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;WhatIsCalendar<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cal1&nbsp;=&nbsp;Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal1.set(2000,&nbsp;1,&nbsp;32,&nbsp;0,&nbsp;0,&nbsp;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(cal1.getTime());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal1.setLenient(false);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal1.set(2000,&nbsp;1,&nbsp;32,&nbsp;0,&nbsp;0,&nbsp;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(cal1.getTime());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;<BR><BR>它的执行结果是：<BR><BR>&nbsp;&nbsp;&nbsp;Tue&nbsp;Feb&nbsp;01&nbsp;00:00:00&nbsp;PST&nbsp;2000<BR>&nbsp;&nbsp;&nbsp;&nbsp;Exception&nbsp;in&nbsp;thread&nbsp;"main"&nbsp;java.lang.IllegalArgumentException<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.util.GregorianCalendar.computeTime(GregorianCalendar.java:1368)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.util.Calendar.updateTime(Calendar.java:1508)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.util.Calendar.getTimeInMillis(Calendar.java:890)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.util.Calendar.getTime(Calendar.java:871)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;WhatIsCalendar.main(WhatIsCalendar.java:12)<BR>&nbsp;<BR><BR>当我们设置该&nbsp;Calendar&nbsp;为&nbsp;Lenient&nbsp;false&nbsp;时，它会依据特定的月份检查出错误的赋值。<BR><BR>3.&nbsp;不稳定的&nbsp;Calendar<BR><BR>我们知道&nbsp;Calendar&nbsp;是可以被&nbsp;serialize&nbsp;的，但是我们要注意下面的问题<BR><BR>&nbsp;&nbsp;&nbsp;import&nbsp;java.io.*;<BR>&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;java.util.*;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;UnstableCalendar&nbsp;implements&nbsp;Serializable<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cal1&nbsp;=&nbsp;Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal1.set(2000,&nbsp;7,&nbsp;1,&nbsp;0,&nbsp;0&nbsp;,&nbsp;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal1.set(Calendar.MILLISECOND,&nbsp;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;out&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;ObjectOutputStream(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;FileOutputStream("newCalendar.out"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.writeObject(cal1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;in&nbsp;=<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;ObjectInputStream(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;FileInputStream("newCalendar.out"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cal2&nbsp;=&nbsp;(Calendar)in.readObject();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal2.set(Calendar.MILLISECOND,&nbsp;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(cal2.getTime());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;<BR><BR>&nbsp;<BR><BR>运行的结果竟然是:&nbsp;Thu&nbsp;Jan&nbsp;01&nbsp;00:00:00&nbsp;PST&nbsp;1970<BR><BR>它被复原到&nbsp;EPOC&nbsp;的起始点，我们称该&nbsp;Calendar&nbsp;是处于不稳定状态。这个问题的根本原因是&nbsp;Java&nbsp;在&nbsp;serialize&nbsp;GregorianCalendar&nbsp;时没有保存所有的信息，所以当它被恢复到内存中，又缺少足够的信息时，Calendar&nbsp;会被恢复到&nbsp;EPOCH&nbsp;的起始值。Calendar&nbsp;对象由两部分构成：字段和相对于&nbsp;EPOC&nbsp;的微秒时间差。字段信息是由微秒时间差计算出的，而&nbsp;set()&nbsp;方法不会强制&nbsp;Calendar&nbsp;重新计算字段。这样字段值就不对了。<BR><BR>下面的代码可以解决这个问题：<BR><BR>&nbsp;&nbsp;&nbsp;import&nbsp;java.io.*;<BR>&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;java.util.*;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;StableCalendar&nbsp;implements&nbsp;Serializable<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cal1&nbsp;=&nbsp;Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal1.set(2000,&nbsp;7,&nbsp;1,&nbsp;0,&nbsp;0&nbsp;,&nbsp;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal1.set(Calendar.MILLISECOND,&nbsp;0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputSt<BR><img src ="http://www.cnitblog.com/Larry.Zhao/aggbug/6401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Larry.Zhao/" target="_blank">Larry.Zhao's Coding Diary</a> 2006-01-30 16:28 <a href="http://www.cnitblog.com/Larry.Zhao/archive/2006/01/30/6401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】java抽取word,pdf的四种武器 </title><link>http://www.cnitblog.com/Larry.Zhao/archive/2006/01/28/6390.html</link><dc:creator>Larry.Zhao's Coding Diary</dc:creator><author>Larry.Zhao's Coding Diary</author><pubDate>Sat, 28 Jan 2006 14:41:00 GMT</pubDate><guid>http://www.cnitblog.com/Larry.Zhao/archive/2006/01/28/6390.html</guid><wfw:comment>http://www.cnitblog.com/Larry.Zhao/comments/6390.html</wfw:comment><comments>http://www.cnitblog.com/Larry.Zhao/archive/2006/01/28/6390.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/Larry.Zhao/comments/commentRss/6390.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Larry.Zhao/services/trackbacks/6390.html</trackback:ping><description><![CDATA[chris<BR>2003-07-01 19:04:00<BR>542 次浏览<BR><BR>chris (chris@matrix.org.cn)<BR>毕业于中国人民大学信息学院<BR>2003 年 6 月<BR><BR>很多人用java进行文档操作时经常会遇到一个问题，就是如何获得word，excel，pdf等文档的内容？我研究了一下，在这里总结一下抽取word,pdf的几种方法。<BR>1 .用jacob<BR>其实jacob是一个bridage，连接java和com或者win32函数的一个中间件，jacob并不能直接抽取word,excel等文件，需要自己写dll哦，不过已经有为你写好的了，就是jacob的作者一并提供了。 <BR><BR>jacob jar与dll文件下载： <A class=ilink href="http://www.matrix.org.cn/down_view.asp?id=13" target=_blank>http://www.matrix.org.cn/down_view.asp?id=13</A> <BR><BR>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath)，就可以写你自己的抽取程序了，下面是一个简单的例子： <BR><BR>import java.io.File;<BR>import com.jacob.com.*;<BR>import com.jacob.activeX.*;<BR>/**<BR>* Title: pdf extraction<BR>* Description: email:chris@matrix.org.cn<BR>* Copyright: Matrix Copyright <IMG alt=Coffee src="http://www.cjsdn.net/images/smiles/coffee_smile.gif" width=19> 2003<BR>* Company: Matrix.org.cn<BR>* @author chris<BR>* @version 1.0,who use this example pls remain the declare<BR>*/<BR>public class FileExtracter{<BR>public static void main(String[] args) {<BR>ActiveXComponent component = new ActiveXComponent("Word.Application");<BR>String inFile = "c:\\test.doc";<BR>String tpFile = "c:\\temp.htm";<BR>String otFile = "c:\\temp.xml";<BR>boolean flag = false;<BR>try {<BR>component.setProperty("Visible", new Variant(false));<BR>Object wordacc = component.getProperty("document．").toDispatch();<BR>Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, <BR>new Object[]{inFile,new Variant(false), new Variant(true)},<BR>new int[1] ).toDispatch();<BR>Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant<IMG alt="Musical Note" src="http://www.cjsdn.net/images/smiles/musical_note_smile.gif" width=19>}, new int[1]);<BR>Variant f = new Variant(false);<BR>Dispatch.call(wordfile, "Close", f);<BR>flag = true;<BR>} catch (Exception e) {<BR>e.printStackTrace();<BR>} finally {<BR>component.invoke("Quit", new Variant[] {});<BR>}<BR>}<BR>}<BR><BR><BR><BR>2. 用apache的poi来抽取word，excel。<BR>poi是apache的一个项目，不过就算用poi你可能都觉得很烦，不过不要紧，这里提供了更加简单的一个接口给你： <BR><BR>下载经过封装后的poi包： <A class=ilink href="http://www.matrix.org.cn/down_view.asp?id=14" target=_blank>http://www.matrix.org.cn/down_view.asp?id=14</A> <BR><BR>下载之后，放到你的classpath就可以了，下面是如何使用它的一个例子： <BR><BR>import java.io.*;<BR>import org.textmining.text.extraction.WordExtractor;<BR>/**<BR>* &lt;p&gt;Title: word extraction&lt;/p&gt;<BR>* &lt;p&gt;Description: email:chris@matrix.org.cn&lt;/p&gt;<BR>* &lt;p&gt;Copyright: Matrix Copyright <IMG alt=Coffee src="http://www.cjsdn.net/images/smiles/coffee_smile.gif" width=19> 2003&lt;/p&gt;<BR>* &lt;p&gt;Company: Matrix.org.cn&lt;/p&gt;<BR>* @author chris<BR>* @version 1.0,who use this example pls remain the declare<BR>*/<BR><BR>public class PdfExtractor {<BR>public PdfExtractor() {<BR>}<BR>public static void main(String args[]) throws Exception<BR>{<BR>FileInputStream in = new FileInputStream ("c:\\a.doc");<BR>WordExtractor extractor = new WordExtractor();<BR>String str = extractor.extractText(in);<BR>System.out.println("the result length is"+str.length());<BR>System.out.println("the result is"+str);<BR>}<BR>}<BR><BR><BR><BR>3. pdfbox-用来抽取pdf文件<BR>但是pdfbox对中文支持还不好，先下载pdfbox： <A class=ilink href="http://www.matrix.org.cn/down_view.asp?id=12" target=_blank>http://www.matrix.org.cn/down_view.asp?id=12</A> <BR><BR>下面是一个如何使用pdfbox抽取pdf文件的例子： <BR><BR>import org.pdfbox.pdmodel.PDdocument．<BR>import org.pdfbox.pdfparser.PDFParser;<BR>import java.io.*;<BR>import org.pdfbox.util.PDFTextStripper;<BR>import java.util.Date;<BR>/**<BR>* &lt;p&gt;Title: pdf extraction&lt;/p&gt;<BR>* &lt;p&gt;Description: email:chris@matrix.org.cn&lt;/p&gt;<BR>* &lt;p&gt;Copyright: Matrix Copyright <IMG alt=Coffee src="http://www.cjsdn.net/images/smiles/coffee_smile.gif" width=19> 2003&lt;/p&gt;<BR>* &lt;p&gt;Company: Matrix.org.cn&lt;/p&gt;<BR>* @author chris<BR>* @version 1.0,who use this example pls remain the declare<BR>*/<BR><BR>public class PdfExtracter{<BR><BR>public PdfExtracter(){<BR>}<BR>public String GetTextFromPdf(String filename) throws Exception<BR>{<BR>String temp=null;<BR>PDdocument．nbsppdfdocument．null;<BR>FileInputStream is=new FileInputStream(filename);<BR>PDFParser parser = new PDFParser( is );<BR>parser.parse();<BR>pdfdocument．nbsp= parser.getPDdocument．);<BR>ByteArrayOutputStream out = new ByteArrayOutputStream();<BR>OutputStreamWriter writer = new OutputStreamWriter( out );<BR>PDFTextStripper stripper = new PDFTextStripper();<BR>stripper.writeText(pdfdocument．getdocument．), writer );<BR>writer.close();<BR>byte[] contents = out.toByteArray();<BR><BR>String ts=new String(contents);<BR>System.out.println("the string length is"+contents.length+"\n");<BR>return ts;<BR>}<BR>public static void main(String args[])<BR>{<BR>PdfExtracter pf=new PdfExtracter();<BR>PDdocument．nbsppdfdocument．nbsp= null;<BR><BR>try{<BR>String ts=pf.GetTextFromPdf("c:\\a.pdf");<BR>System.out.println(ts);<BR>}<BR>catch(Exception e)<BR>{<BR>e.printStackTrace();<BR>}<BR>}<BR><BR>}<BR><BR><BR><BR>4. 抽取支持中文的pdf文件－xpdf<BR>xpdf是一个开源项目，我们可以调用他的本地方法来实现抽取中文pdf文件。 <BR><BR>下载xpdf函数包： <A class=ilink href="http://www.matrix.org.cn/down_view.asp?id=15" target=_blank>http://www.matrix.org.cn/down_view.asp?id=15</A> <BR><BR>同时需要下载支持中文的补丁包： <A class=ilink href="http://www.matrix.org.cn/down_view.asp?id=16" target=_blank>http://www.matrix.org.cn/down_view.asp?id=16</A> <BR><BR>按照readme放好中文的patch，就可以开始写调用本地方法的java程序了 <BR><BR>下面是一个如何调用的例子： <BR><BR>import java.io.*;<BR>/**<BR>* &lt;p&gt;Title: pdf extraction&lt;/p&gt;<BR>* &lt;p&gt;Description: email:chris@matrix.org.cn&lt;/p&gt;<BR>* &lt;p&gt;Copyright: Matrix Copyright <IMG alt=Coffee src="http://www.cjsdn.net/images/smiles/coffee_smile.gif" width=19> 2003&lt;/p&gt;<BR>* &lt;p&gt;Company: Matrix.org.cn&lt;/p&gt;<BR>* @author chris<BR>* @version 1.0,who use this example pls remain the declare<BR>*/<BR><BR>public class PdfWin {<BR>public PdfWin() {<BR>}<BR>public static void main(String args[]) throws Exception<BR>{<BR>String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";<BR>String filename="c:\\a.pdf";<BR>String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};<BR>Process p = Runtime.getRuntime().exec(cmd);<BR>BufferedInputStream bis = new BufferedInputStream(p.getInputStream());<BR>InputStreamReader reader = new InputStreamReader(bis, "UTF-8");<BR>StringWriter out = new StringWriter();<BR>char [] buf = new char[10000];<BR>int len;<BR>while((len = reader.read(buf))&gt;= 0) {<BR>//out.write(buf, 0, len);<BR>System.out.println("the length is"+len);<BR>}<BR>reader.close();<BR>String ts=new String(buf);<BR>System.out.println("the str is"+ts);<BR>}<BR>}<BR><BR><BR><BR>关于作者 <BR>作者简介：chris，毕业于中国人民大学信息学院。现于香港进行金融分析软件研发，作者亦活跃于 jxta p2p开源软件的开发社区，并热衷于网络安全，AI搜索引擎技术与基于java的游戏引擎技术。<BR>如果大家谁有更好的办法，请告诉作者 : chris@matrix.org.cn <BR><img src ="http://www.cnitblog.com/Larry.Zhao/aggbug/6390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Larry.Zhao/" target="_blank">Larry.Zhao's Coding Diary</a> 2006-01-28 22:41 <a href="http://www.cnitblog.com/Larry.Zhao/archive/2006/01/28/6390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>匈牙利命名规范</title><link>http://www.cnitblog.com/Larry.Zhao/archive/2005/09/23/2843.html</link><dc:creator>Larry.Zhao's Coding Diary</dc:creator><author>Larry.Zhao's Coding Diary</author><pubDate>Fri, 23 Sep 2005 01:07:00 GMT</pubDate><guid>http://www.cnitblog.com/Larry.Zhao/archive/2005/09/23/2843.html</guid><wfw:comment>http://www.cnitblog.com/Larry.Zhao/comments/2843.html</wfw:comment><comments>http://www.cnitblog.com/Larry.Zhao/archive/2005/09/23/2843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Larry.Zhao/comments/commentRss/2843.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Larry.Zhao/services/trackbacks/2843.html</trackback:ping><description><![CDATA[<DIV class=postbody>
<P>几年以前,Charles Simonyi(他后来成为微软的著名程序员)设计了一种以前缀为基础的命名方法,这种方法后来称为"匈牙利表示法"以记念他.他的思想是根据每个标识符所代表的含义给它一个前缀.微软后来采用了这个思想,给每个标识符一个前缀以说明它的数据类型.因此,整型变量的前缀是n,长整型变量是nl,字符型数组变量是ca,以及字符串(以空类型结尾的字符数组)以sz为前缀.这些名字可能会非常古怪.比如说:lpszFoo表示"Foo"是一个指向以空字符为结尾的字符串的长整型指针.</P>
<P>&nbsp;</P>
<P>这种方法的优点是使人能够通过变量的名字来辨别变量的类型,而不比去查找它的定义.遗憾的是,这种方法不仅使变量名字非常绕口,而且使改变变量类型的工作变得十分艰巨.在Windows3.1中,整型变量为16为宽.如果我们在开始时采用了一个整型变量,但是在通过30---40个函数的计算之后,发现采用整型变量宽度不够,这时我们不仅要改变这个变量的类型,而且要改变这个变量在这30--40个函数中的名字.</P>
<P>&nbsp;</P>
<P>因为不切实际,除了一些顽固的Windows程序员外已经没有人再使用"匈牙利表示法"了.毫无疑问,在某种场合它依然存在,但大部分人现在已经抛弃它了.一般而言,输入前缀是一种糟糕的想法,因为它把变量于其类型紧紧地绑在了一起.</P>
<P>对于30行以下的函数，匈牙利方法一般有优势。</P>
<P>尤其是对界面编程，有优势。</P>
<P>但对于有强烈的算法要求、尤其是有很多抽象类型的C++程序，匈牙利方法简直是一个灾难。</P>
<P>看你用在什么地方。</P>
<P>现在有了很好的IDE工具,如:VC,SourceInsight等.</P>
<P>选中变量,会自动提示告诉你它的声明和定义,这样</P>
<P>匈牙利命名法就没有很大的必要了.</P>
<P>无非就是为了程序可读性较好.</P>
<P>实际上良好的代码书写习惯比强制使用匈牙利命名法更重要.</P>
<P>系统性。整体性。可读性。分类要清楚。要有注释！</P>
<P>&nbsp;</P>
<P>匈牙利命名法是微软推广的一种关于变量、函数、对象、前缀、宏定义等各种类型的符号的命名规范。匈牙利命名法的主要思想是：在变量和函数名中加入前缀以增进人们对程序的理解。它是由微软内部的一个匈牙利人发起使用的，结果它在微软内部逐渐流行起来，并且推广给了全世界的Windows开发人员。下面将介绍匈牙利命名法，后面的例子里也会尽量遵守它和上面的代码风格。还是那句话，并不是要求所有的读者都要去遵守，但是希望读者作为一个现代的软件开发人员都去遵守它。</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数组</P>
<P>b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL (int)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 布尔(整数)</P>
<P>by&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Unsigned Char (Byte)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无符号字符(字节)</P>
<P>c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符(字节)</P>
<P>cb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Count of bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字节数</P>
<P>cr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Color reference value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 颜色(参考)值</P>
<P>cx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Count of x (Short)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x的集合(短整数)</P>
<P>dw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp;&nbsp; (unsigned long)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 双字(无符号长整数)</P>
<P>f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Flags&nbsp;&nbsp; (usually multiple bit values)&nbsp;&nbsp; 标志(一般是有多位的数值)</P>
<P>fn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数</P>
<P>g_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 全局的</P>
<P>h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Handle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 句柄</P>
<P>i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 整数</P>
<P>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 长整数</P>
<P>lp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Long pointer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 长指针</P>
<P>m_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data member of a class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个类的数据成员</P>
<P>n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Short int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 短整数</P>
<P>p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pointer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指针</P>
<P>s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符串</P>
<P>sz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Zero terminated String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以0结尾的字符串</P>
<P>tm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Text metric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文本规则</P>
<P>u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Unsigned int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无符号整数</P>
<P>ul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Unsigned long (ULONG)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无符号长整数</P>
<P>w&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WORD (unsigned short)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无符号短整数</P>
<P>x,y&nbsp;&nbsp;&nbsp;&nbsp; x, y coordinates (short)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 坐标值/短整数</P>
<P>v&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 空</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>有关项目的全局变量用g_开始，类成员变量用m_，局部变量若函数较大则可考虑用l_用以显示说明其是局部变量。</P>
<P>&nbsp;</P>
<P>前缀&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子</P>
<P>g_&nbsp;&nbsp;&nbsp; 全局变量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_Servers</P>
<P>C&nbsp;&nbsp;&nbsp;&nbsp; 类或者结构体&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CDocument，CPrintInfo</P>
<P>m_&nbsp;&nbsp; 成员变量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_pDoc，m_nCustomers</P>
<P>&nbsp;</P>
<P>VC常用前缀列表：</P>
<P>&nbsp;</P>
<P>前缀&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子</P>
<P>ch&nbsp;&nbsp;&nbsp; char 8位字符&nbsp;&nbsp;&nbsp; chGrade</P>
<P>ch&nbsp;&nbsp;&nbsp; TCHAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16位UNICODE类型字符&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chName</P>
<P>b&nbsp;&nbsp;&nbsp;&nbsp; BOOL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 布尔变量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bEnabled</P>
<P>n&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; 整型（其大小由操作系统决定）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nLength</P>
<P>n&nbsp;&nbsp;&nbsp;&nbsp; UINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无符号整型（其大小由操作系统决定）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nLength</P>
<P>w&nbsp;&nbsp;&nbsp; WORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16位无符号整型&nbsp;&nbsp;&nbsp; wPos</P>
<P>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 32位有符号整型&nbsp;&nbsp;&nbsp; lOffset</P>
<P>dw&nbsp;&nbsp; DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 32位无符号整型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwRange</P>
<P>p&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ambient memory model pointer 内存模块指针，指针变量&nbsp;&nbsp;&nbsp; pDoc</P>
<P>lp&nbsp;&nbsp;&nbsp;&nbsp; FAR*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 长指针&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDoc</P>
<P>lpsz&nbsp; LPSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 32位字符串指针&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpszName</P>
<P>lpsz&nbsp; LPCSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 32位常量字符串指针&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpszName</P>
<P>lpsz&nbsp; LPCTSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 32位UNICODE类型常量指针&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpszName</P>
<P>h&nbsp;&nbsp;&nbsp;&nbsp; handle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows对象句柄&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hWnd</P>
<P>lpfn&nbsp; (*fn)()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 回调函数指针 Callback Far pointer to CALLBACK function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpfnAbort</P>
<P>&nbsp;</P>
<P>Windows对象名称缩写：</P>
<P>&nbsp;</P>
<P>Windows对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子变量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MFC类&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子对象</P>
<P>HWND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hWnd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CWnd*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pWnd;</P>
<P>HDLG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hDlg;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDialog*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDlg;</P>
<P>HDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hDC;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CDC*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC;</P>
<P>HGDIOBJ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hGdiObj;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGdiObject*&nbsp;&nbsp;&nbsp;&nbsp; pGdiObj;</P>
<P>HPEN&nbsp;&nbsp;&nbsp;&nbsp; hPen;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPen*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pPen; </P>
<P>HBRUSH hBrush;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CBrush*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pBrush; </P>
<P>HFONT&nbsp;&nbsp; hFont;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CFont*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pFont; </P>
<P>HBITMAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hBitmap;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CBitmap*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pBitmap; </P>
<P>HPALETTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hPalette;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPalette*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pPalette; </P>
<P>HRGN&nbsp;&nbsp;&nbsp;&nbsp; hRgn;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRgn*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pRgn; </P>
<P>HMENU hMenu;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMenu*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pMenu; </P>
<P>HWND&nbsp;&nbsp;&nbsp; hCtl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CStatic*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pStatic; </P>
<P>HWND&nbsp;&nbsp;&nbsp; hCtl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CButton*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pBtn;</P>
<P>HWND&nbsp;&nbsp;&nbsp; hCtl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CEdit*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pEdit; </P>
<P>HWND&nbsp;&nbsp;&nbsp; hCtl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CListBox*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pListBox;</P>
<P>HWND&nbsp;&nbsp;&nbsp; hCtl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CComboBox*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pComboBox;</P></DIV><img src ="http://www.cnitblog.com/Larry.Zhao/aggbug/2843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Larry.Zhao/" target="_blank">Larry.Zhao's Coding Diary</a> 2005-09-23 09:07 <a href="http://www.cnitblog.com/Larry.Zhao/archive/2005/09/23/2843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有關3D方面的關鍵詞摘要</title><link>http://www.cnitblog.com/Larry.Zhao/archive/2005/09/20/2760.html</link><dc:creator>Larry.Zhao's Coding Diary</dc:creator><author>Larry.Zhao's Coding Diary</author><pubDate>Tue, 20 Sep 2005 00:09:00 GMT</pubDate><guid>http://www.cnitblog.com/Larry.Zhao/archive/2005/09/20/2760.html</guid><wfw:comment>http://www.cnitblog.com/Larry.Zhao/comments/2760.html</wfw:comment><comments>http://www.cnitblog.com/Larry.Zhao/archive/2005/09/20/2760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Larry.Zhao/comments/commentRss/2760.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Larry.Zhao/services/trackbacks/2760.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">深度缓冲</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">(</FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">又称</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">Z-buffer)</FONT></SPAN></B><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">的作用是确保多边形能够正确地显示在它们本来的深度（相对于摄像机）上。深度缓冲能确定哪个对象在另一个对象的前面，正确的将被渲染。</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun"> 
<P></P></SPAN></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">COM</FONT></SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-language: ZH-CN"> </SPAN><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">就是</SPAN><SPAN lang=ZH-CN style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun"><FONT face="Times New Roman"> </FONT></SPAN></FONT><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">Component Object Model, </FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">组件对象模型</SPAN></B><SPAN lang=ZH-CN style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-fareast-language: ZH-CN">。</SPAN><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">COM</FONT></SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-language: ZH-CN"> </SPAN><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">接口和</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman">C++</FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">的抽象类相似（但不一样），就像抽象类没有与之相关的实际代码一样，</SPAN></FONT><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">COM</FONT></SPAN></B><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">描述了一套符号和语法而非实现过程。</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun"> 
<P></P></SPAN></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">Page Flipping </FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">（页翻动）</SPAN></B><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">我们把要显示的物体通通绘制到一个不可见的页上，我们称这个页为“后缓冲区”。绘制完后，快速的把它翻动到可见的“前缓冲区”上，并重复这个过程。当用户正在观看新绘制的可见页（前缓冲区）时，程序要降下一幅要显示的东西绘制到“后缓冲区”上。快速而连续的重复次过程，用户就会看到像电影一样连续的图像了。</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun"> 
<P></P></SPAN></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">Devices </FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">（设备）</SPAN></B><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">就是你的</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman">3D</FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">卡。</SPAN><SPAN lang=ZH-CN style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman"> </FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">你得创建一个接口来代表设备，然后使用那个接口来绘制东西。</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun"> 
<P></P></SPAN></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">Game Loop </FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">（游戏循环）</SPAN></B><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">游戏循环是一段代码，在游戏退出之前循环执行的代码。这段代码在每次循环中都要：在屏幕上绘制物体（或场景人物随便什么）、处理游戏的逻辑过程（如：物体的移动、人工智能等等）、处理</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman">Windows</FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">的消息等等。</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"> 
<P></P></SPAN></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">Vertices (</FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">顶点</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">)</FONT></SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-language: ZH-CN"> </SPAN><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">顶点就是</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman">3D</FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">空间中的一个点。</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun"> 
<P></P></SPAN></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">3D Primitives</FONT></SPAN></B><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">就是设备所支持的原始的类型。它包括：<SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman">Point Lists(</FONT></SPAN>点列)、<FONT size=2><FONT face=Verdana><SPAN lang=EN-GB>Line Lists(</SPAN></FONT></FONT>线列)、<FONT size=2><FONT face=Verdana><SPAN lang=EN-GB>Line Strips</SPAN><SPAN lang=EN-GB style="mso-fareast-language: ZH-CN"> </SPAN></FONT></FONT>(线带)、<FONT size=2><FONT face=Verdana><SPAN lang=EN-GB>Triangle Lists(</SPAN></FONT></FONT>三角形列)、<FONT size=2><FONT face=Verdana><SPAN lang=EN-GB>Triangle Strips(</SPAN></FONT></FONT>三角形带)</SPAN><SPAN lang=ZH-CN style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman"> </FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">和</SPAN><SPAN lang=ZH-CN style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman"> </FONT><FONT face=Verdana><FONT size=2><SPAN lang=EN-GB>Triangle Fans(</SPAN></FONT></FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">三角扇形)。使用</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman">3D primitive </FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">完成上述的图形是很方便的。以后我们会用</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman">3D primitive </FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">来绘制图形。</SPAN></FONT><FONT size=2><FONT face=Verdana><SPAN lang=EN-GB style="mso-fareast-language: ZH-CN"> 
<P></P></SPAN></FONT></FONT>
<P></P><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
<P></P></SPAN>
<P></P>
<H1 style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><FONT size=2><FONT face=Verdana><SPAN lang=EN-GB style="mso-fareast-language: ZH-CN">
<P></P></SPAN></FONT></FONT></H1>
<H1 style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><FONT size=2><SPAN lang=EN-GB style="FONT-FAMILY: SimSun; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"></SPAN></FONT></H1>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><FONT size=2><SHAPE id=_x0000_i1027 style="WIDTH: 255pt; HEIGHT: 45.75pt" o:borderrightcolor="this" o:borderbottomcolor="this" o:borderleftcolor="this" o:bordertopcolor="this" type="#_x0000_t75"><IMAGEDATA o:title="002_7" src="file:///C:\DOCUME~1\andy\LOCALS~1\Temp\msohtml1\01\clip_image005.png"></IMAGEDATA><BORDERTOP type="single" width="4"></BORDERTOP><BORDERLEFT type="single" width="4"></BORDERLEFT><BORDERBOTTOM type="single" width="4"></BORDERBOTTOM><BORDERRIGHT type="single" width="4"></BORDERRIGHT></SHAPE>
<P></P></FONT></SPAN>
<P></P><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
<P></P></SPAN>
<P></P>
<H1 style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-language: ZH-CN">
<P></P></SPAN>
<P></P><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">Flexible Vertex Format (FVF) <SPAN style="mso-spacerun: yes">&nbsp;&nbsp;</SPAN>(</FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">灵活顶点格式</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">)</FONT></SPAN></B><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">是用来描述顶点属性的一种格式，而这种格式是可以由我们自定义的，所以称它为“灵活顶点格式”。至此，我们至少知道了顶点有三种属性：</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman">x</FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">值、</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman">y</FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">值和</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman">z</FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">值。其实顶点还可以有其他属性，例如颜色与亮度</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun"> </H1>
<P></P></SPAN></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">Vertex Buffers (</FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">顶点缓冲</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">)</FONT></SPAN></B><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">顶点缓冲就是一块用于保存顶点的内存缓冲区。</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun"> 
<P></P></SPAN></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">Backface Culling (</FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">背面拣选</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體"><FONT face="Times New Roman">)</FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-fareast-language: ZH-CN"> </SPAN></B><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">所有的三角形面，面向我们的面将会被渲染出来（可见），否则将不被渲染（不可见，被拣选出来了）。</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun"> 
<P></P></SPAN></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">垂直回扫周期</SPAN></B><SPAN lang=ZH-CN style="FONT-SIZE: 10pt; FONT-FAMILY: 新細明體; mso-bidi-font-weight: bold; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">或</SPAN><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">屏幕空白周期</SPAN></B><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">当电子束从上至下完成了屏幕上的每一行水平回扫后，会被暂时关闭，回到屏幕的左上角；此过程所需的时间</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun"> 
<P></P></SPAN></FONT>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">纹理</SPAN></B><FONT size=3><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">就是</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman">3D</FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">图形中的</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><FONT face="Times New Roman">2D</FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 新細明體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN">贴图（位图），能应用到三角形（或一定数目的三角形）上，用来增加真实感</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"> 
<P></P></SPAN></FONT>
<P></P>
<P class=TutorialTitle style="MARGIN: 0cm 0cm 0pt"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none">Materials </SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">（材质）</SPAN></STRONG><FONT size=3><SPAN lang=ZH-CN style="FONT-WEIGHT: normal; FONT-FAMILY: 新細明體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">用于描述对象（三角形）的反光性能，使它看起来有没有光泽和带有什么颜色。</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none"> 
<P></P></SPAN></FONT>
<P></P>
<P class=TutorialTitle style="MARGIN: 0cm 0cm 0pt"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none">Diffuse Reflection </SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">（漫反射）</SPAN></STRONG><FONT size=3><SPAN lang=ZH-CN style="FONT-WEIGHT: normal; FONT-FAMILY: 新細明體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">物体的漫反射颜色，能使物体看起来是什么颜色。</SPAN><SPAN lang=EN-GB style="FONT-WEIGHT: normal; FONT-SIZE: 10pt; TEXT-DECORATION: none; mso-bidi-font-weight: bold; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; text-underline: none"> 
<P></P></SPAN></FONT>
<P></P>
<P class=TutorialTitle style="MARGIN: 0cm 0cm 0pt"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none">Ambient Reflection </SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">（环境反射）</SPAN></STRONG><FONT size=3><SPAN lang=ZH-CN style="FONT-WEIGHT: normal; FONT-FAMILY: 新細明體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">这也是一个颜色值，用于描述对象反射环境光的数量。你甚至可以指定它根本不反射环境光，这意味着它将不可见，除非接收到其它类型的光。</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none"> 
<P></P></SPAN></FONT>
<P></P>
<P class=TutorialTitle style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none"><STRONG>Specular Reflection and Power</STRONG></SPAN><FONT size=3><SPAN lang=ZH-CN style="FONT-WEIGHT: normal; FONT-FAMILY: 新細明體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">镜面反射的值，可以用镜面反射和高光强度设置对象，使它看起来发亮。</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none"> 
<P></P></SPAN></FONT>
<P></P>
<P class=TutorialTitle style="MARGIN: 0cm 0cm 0pt"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none">Emission </SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">（放射）</SPAN></STRONG><FONT size=3><SPAN lang=ZH-CN style="FONT-WEIGHT: normal; FONT-FAMILY: 新細明體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">使物体自发光，但不会影响到场景内的其它物体。</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none"> 
<P></P></SPAN></FONT>
<P></P>
<P class=TutorialTitle style="MARGIN: 0cm 0cm 0pt"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none">Normals </SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">（法线）</SPAN></STRONG><FONT size=3><SPAN lang=ZH-CN style="FONT-WEIGHT: normal; FONT-FAMILY: 新細明體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">法线是垂直于三角形面的一个向量，它的方向是由三角形的顶点定义顺序所决定的。</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none"> 
<P></P></SPAN></FONT>
<P></P>
<P class=TutorialTitle style="MARGIN: 0cm 0cm 0pt"><STRONG><SPAN lang=EN-US style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-fareast-font-family: 標楷體; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none">Index Buffer</SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">（索引缓冲）</SPAN></STRONG><FONT size=3><SPAN lang=ZH-CN style="FONT-WEIGHT: normal; FONT-FAMILY: 新細明體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">索引缓冲就是内存中的一块用于索引顶点的区域。</SPAN><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none"> 
<P></P></SPAN></FONT>
<P></P>
<P class=TutorialTitle style="MARGIN: 0cm 0cm 0pt"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'"><STRONG>缓冲数据</STRONG></SPAN><FONT size=3><SPAN lang=ZH-CN style="FONT-WEIGHT: normal; FONT-FAMILY: 新細明體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">就是在专用的缓冲区中存储的输入设备的数据</SPAN><SPAN lang=ZH-CN style="FONT-WEIGHT: normal; FONT-FAMILY: SimSun; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-GB style="FONT-SIZE: 10pt; mso-bidi-font-weight: bold; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> 
<P></P></SPAN></FONT>
<P></P>
<P class=TutorialTitle style="MARGIN: 0cm 0cm 0pt"><SPAN lang=ZH-CN style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 標楷體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'"><STRONG>即时数据</STRONG></SPAN><FONT size=3><SPAN lang=ZH-CN style="FONT-WEIGHT: normal; FONT-FAMILY: 新細明體; TEXT-DECORATION: none; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">就是指设备当前的状态</SPAN><SPAN lang=ZH-CN style="FONT-WEIGHT: normal; FONT-FAMILY: SimSun; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none; mso-bidi-font-family: 'Times New Roman'">。</SPAN></FONT><SPAN lang=EN-US style="FONT-WEIGHT: normal; FONT-FAMILY: 'Times New Roman'; TEXT-DECORATION: none; mso-fareast-language: ZH-CN; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; text-underline: none"> </SPAN></P><img src ="http://www.cnitblog.com/Larry.Zhao/aggbug/2760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Larry.Zhao/" target="_blank">Larry.Zhao's Coding Diary</a> 2005-09-20 08:09 <a href="http://www.cnitblog.com/Larry.Zhao/archive/2005/09/20/2760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows程序设计课程笔记一--回顾C++</title><link>http://www.cnitblog.com/Larry.Zhao/archive/2005/09/16/2682.html</link><dc:creator>Larry.Zhao's Coding Diary</dc:creator><author>Larry.Zhao's Coding Diary</author><pubDate>Fri, 16 Sep 2005 00:40:00 GMT</pubDate><guid>http://www.cnitblog.com/Larry.Zhao/archive/2005/09/16/2682.html</guid><wfw:comment>http://www.cnitblog.com/Larry.Zhao/comments/2682.html</wfw:comment><comments>http://www.cnitblog.com/Larry.Zhao/archive/2005/09/16/2682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Larry.Zhao/comments/commentRss/2682.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Larry.Zhao/services/trackbacks/2682.html</trackback:ping><description><![CDATA[<UL>
<LI><FONT color=#ff1493>面向对象的三大特征(以重要性排序)：</FONT>封装、继承、多态。 
<LI><FONT color=#ff1493>一个对象的构造过程：</FONT>class A、class C、class B : public A{private: C c;}这样的三个类，当作如下声明：B b时，构造函数调用的顺序依次是: A C B，先构造class C这样可以保证在class B中对成员数据c的操作是安全的。 
<LI><FONT color=#ff1493>构造函数：</FONT>有class A，A a, 有函数F(A a)，当调用F(a)时由于是船传值调用，在这次函数调用时会调用A的拷贝构造函数。 
<LI><FONT color=#ff1493>析构函数什么时候应该为虚函数：</FONT>有class&nbsp;A; class B : public A; 有各自的构造、析构函数，A* pA = new B; delete pA;&nbsp;构造函数和析构函数调用的顺序为：A(), B(), ~A()。这样就没有析构B。所以把析构函数写为虚函数virtual&nbsp;~A()，就会得到我们想要的结果：A(), B(), ~B(),&nbsp;~A()。
<LI><FONT color=#ff1493>多态性的实现原理：</FONT>虚函数表机制。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</LI></UL><img src ="http://www.cnitblog.com/Larry.Zhao/aggbug/2682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Larry.Zhao/" target="_blank">Larry.Zhao's Coding Diary</a> 2005-09-16 08:40 <a href="http://www.cnitblog.com/Larry.Zhao/archive/2005/09/16/2682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Java核心技术卷一》读记</title><link>http://www.cnitblog.com/Larry.Zhao/archive/2005/08/07/1380.html</link><dc:creator>Larry.Zhao's Coding Diary</dc:creator><author>Larry.Zhao's Coding Diary</author><pubDate>Sun, 07 Aug 2005 08:13:00 GMT</pubDate><guid>http://www.cnitblog.com/Larry.Zhao/archive/2005/08/07/1380.html</guid><wfw:comment>http://www.cnitblog.com/Larry.Zhao/comments/1380.html</wfw:comment><comments>http://www.cnitblog.com/Larry.Zhao/archive/2005/08/07/1380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Larry.Zhao/comments/commentRss/1380.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Larry.Zhao/services/trackbacks/1380.html</trackback:ping><description><![CDATA[<span style="color: rgb(0, 0, 0);"><span style="color: rgb(255, 20, 147);">标记接口：</span>普
通的接口的通常目的是保证类实现了某个或某组方法。而标记接口没有方法，像Cloneable&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 接口是Java提供的几个标记接口之一。使用标记接口的唯一目的是使得可以用<span style="color: rgb(0, 100, 0);">instanceof</span>进行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型查询：<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp; &nbsp;&nbsp;  <span style="color: rgb(0, 0, 128);">if(Obj instanceof Cloneable) ...<br>
<br>
<span style="color: rgb(255, 20, 147);">内部类：</span>&nbsp; <span style="color: rgb(0, 0, 0);">分为：内部类、局部内部类、匿名内部类、静态内部类几种。</span><br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;<span style="color: rgb(255, 0, 0);">&nbsp;  内部类：<span style="color: rgb(0, 0, 0);">定
义在类的内部，可以用<span style="color: rgb(0, 100, 0);">public、private</span>访问指示符来修饰声明。如果是<span style="color: rgb(0, 100, 0);">private</span>级<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 别的话则属于外部类的私有内部类，只有这个外部类的方法才能生成内
部类的对象。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
所以我们说只有内部类才是私有的，普通类总是具有包可见性或公有可见性。<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;
内部类的方法可以访问它所在的外部类的实例字段，这是通过编译器添加的隐性的<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 字段来实现的。<br>
</span></span></span>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp; eg:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;  <span style="color: rgb(0, 0, 128);">class BankAccount{</span><br style="color: rgb(0, 0, 128);"><span style="color: rgb(0, 0, 128);">
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; public BankAccount (double
initBalance){</span><br style="color: rgb(0, 0, 128);"><span style="color: rgb(0, 0, 128);">
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; balance =
initBalance;</span><br style="color: rgb(0, 0, 128);"><span style="color: rgb(0, 0, 128);">
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  }</span><br style="color: rgb(0, 0, 128);"><span style="color: rgb(0, 0, 128);">
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; private double balance;</span><br style="color: rgb(0, 0, 128);"><span style="color: rgb(0, 0, 128);">
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  </span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; public void start(double rate){</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; ActionListener adder = new
InterestAdder(rate);</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; Timer t = new Timer(1000, adder);</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; t.start();</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  }</span><br style="color: rgb(0, 0, 128);">
<br style="color: rgb(0, 0, 128);"><span style="color: rgb(0, 0, 128);">
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; private class InterestAdder</span><br style="color: rgb(0, 0, 128);"><span style="color: rgb(0, 0, 128);">
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; implements ActionListener{</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; public InterestAdder (double aRate){</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; rate = aRate;</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; public void actionPerformed(ActionEvent
event){</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; double interest = balance * rate
/ 100;</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; balance += interest;</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; </span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; NumberFormat formatter</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; = NumberFormat.getCurrencyInstance();</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; System.out.println("balance=" +
formatter.format(balance)); &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; </span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; private double rate;</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 100, 0);"><span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp; }</span><br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp; <span style="color: rgb(0, 0, 0);">在
内部类的方法中，有一个隐含的外部类引用，例如内部类中的actionPerformed的方<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 法中可以的显示的表示为：</span><br style="color: rgb(0, 0, 0);">
<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  <span style="color: rgb(0, 0, 128);">double interest = BankAccount.this.balance * this.rate /100;</span></span><br style="color: rgb(0, 0, 0);">
<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp; 内部对象的构造器即可显示的表示为：</span><br style="color: rgb(0, 0, 0);">
<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  <span style="color: rgb(0, 0, 128);">Outerobject.new InnerClass(Construction paramters);</span></span><br style="color: rgb(0, 0, 0);">
<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  即：</span><br style="color: rgb(0, 0, 0);">
<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  <span style="color: rgb(0, 0, 128);">ActionListener adder = this.new InterestAdder(rate);<br>
<br>
</span></span>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="color: rgb(255, 0, 0);">局部内部类</span>：<span style="color: rgb(0, 0, 0);">定义在方法内部的类，不用访问指示符来修饰。当只要在一个范围内使用该类的情</span><br style="color: rgb(0, 0, 0);">
<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 况下使用局部内部类。其好处在于对外界完全隐藏，仅有定义该类的方法能够使用</span><br style="color: rgb(0, 0, 0);">
<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 该类。可以访问外部类的实例字段，还可以访问该方法的局部变量。不过需要被访</span><br style="color: rgb(0, 0, 0);">
<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 问的局部变量必须被声明为final的。</span><br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <span style="color: rgb(255, 0, 0);">匿名内部类</span>：<span style="color: rgb(0, 0, 0);">匿名内部类即局部内部类，不过我们仅仅需要一个类的对象，所以在定义的时候，<br>
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  连类的名字都不必指定。</span><br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  <span style="color: rgb(0, 0, 128);">eg:</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; public
void start(final double rate){</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; ActionListener adder = new
ActionListener(){</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; public void actionPerformed(ActionEvent event){</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; double interest = balance * rate
/ 100;</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; balance += interest;</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; NumberFormat formatter</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; =
NumberFormat.getCurrencyInstance();</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
System.out.println("balance="+formatter.format(balance);</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; }</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br style="color: rgb(0, 0, 128);">
<span style="color: rgb(0, 0, 128);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }</span><br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp; <span style="color: rgb(0, 0, 0);">其中用于构造对象的任意参数都要放在超类型名字后的括号后，即：</span><br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  <span style="color: rgb(0, 0, 128);">new superclass(construction parameter)</span><br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp; <span style="color: rgb(0, 0, 0);">这
里的超类型可以是接口，那么内部类实现这个接口；也可以是类，那么内部类扩<br>
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
展这个类。</span><br style="color: rgb(0, 0, 0);">
<br style="color: rgb(0, 0, 0);">
<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp; 内部类没有构造器，如果内部类是扩展外部类，那么构造参数将被送到超类的构造</span><br style="color: rgb(0, 0, 0);">
<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  器中；如果内部类是用来实现接口，则没有任何构造参数，不过必须保留括号。<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="color: rgb(255, 0, 0);">静态内部类：</span><span style="color: rgb(0, 0, 0);">静
态内部类用于只为了隐藏某个类在另一类内部，而不需要内部类对外部类对象的<br>
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
引用。这是可以把内部类生命为<span style="color: rgb(0, 100, 0);">static</span>的来去掉编译器添加的引用。除了没有对外<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  部类对象的引用，静态内部类同其他内部类都一样。而如果某个内部类对象是在静<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  态方法中构造的话，这个内部类也必须声明成静态内部类。<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="color: rgb(255, 0, 0);">内部类总结：</span>1、内部类对象能够访问创建它的对象的实现--包括那些私有数据。<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  2、内部类能够隐藏起来，不为同一包中的其他类所见。<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  3、匿名内部类可以方便地定义运行时回调。<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  4、使用内部类在编写事件驱动的程序使用起来很方便。<br>
<br>
<span style="color: rgb(255, 20, 147);">代理：<span style="color: rgb(0, 0, 0);">（这个等等再看，看了再记。）</span></span><br>
</span></span>
</span>
</span><span style="color: rgb(255, 20, 147);"></span><span style="color: rgb(255, 20, 147);"></span><img src ="http://www.cnitblog.com/Larry.Zhao/aggbug/1380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Larry.Zhao/" target="_blank">Larry.Zhao's Coding Diary</a> 2005-08-07 16:13 <a href="http://www.cnitblog.com/Larry.Zhao/archive/2005/08/07/1380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写改变数字参数的方法</title><link>http://www.cnitblog.com/Larry.Zhao/archive/2005/08/03/1276.html</link><dc:creator>Larry.Zhao's Coding Diary</dc:creator><author>Larry.Zhao's Coding Diary</author><pubDate>Wed, 03 Aug 2005 04:36:00 GMT</pubDate><guid>http://www.cnitblog.com/Larry.Zhao/archive/2005/08/03/1276.html</guid><wfw:comment>http://www.cnitblog.com/Larry.Zhao/comments/1276.html</wfw:comment><comments>http://www.cnitblog.com/Larry.Zhao/archive/2005/08/03/1276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Larry.Zhao/comments/commentRss/1276.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Larry.Zhao/services/trackbacks/1276.html</trackback:ping><description><![CDATA[如果需要编写改变数字参数的方法，那么可以使用定义在org.oma.CORBA包中的某个持有者类型。这些类型包括IntHolder, BooleanHolder等。每个持有者类型都有一个公有字段value,通过它你可以访问所存储的值。例：<br>
<br>
public static void increment (IntegerHolder x)<br>
{<br>
&nbsp;&nbsp;&nbsp; x.value++;<br>
}<br>
<br>
public static void main (String[] args)<br>
{<br>
&nbsp;&nbsp;&nbsp; IntegerHolder a = new IntegerHolder(3);<br>
&nbsp;&nbsp;&nbsp; increment (a);<br>
&nbsp;&nbsp;&nbsp; int result = a.value;<br>
&nbsp;&nbsp;&nbsp; ...<br>
}<br>
<img src ="http://www.cnitblog.com/Larry.Zhao/aggbug/1276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Larry.Zhao/" target="_blank">Larry.Zhao's Coding Diary</a> 2005-08-03 12:36 <a href="http://www.cnitblog.com/Larry.Zhao/archive/2005/08/03/1276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>