﻿<?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>C++博客-Aaron学习笔记-文章分类-JAVA基础</title><link>http://www.cppblog.com/wangfeng2500/category/14237.html</link><description>少壮不努力，长大没饭吃！</description><language>zh-cn</language><lastBuildDate>Tue, 31 Aug 2010 10:41:43 GMT</lastBuildDate><pubDate>Tue, 31 Aug 2010 10:41:43 GMT</pubDate><ttl>60</ttl><item><title>Java的访问控制</title><link>http://www.cppblog.com/wangfeng2500/articles/123967.html</link><dc:creator>赞劲小子</dc:creator><author>赞劲小子</author><pubDate>Thu, 19 Aug 2010 06:27:00 GMT</pubDate><guid>http://www.cppblog.com/wangfeng2500/articles/123967.html</guid><wfw:comment>http://www.cppblog.com/wangfeng2500/comments/123967.html</wfw:comment><comments>http://www.cppblog.com/wangfeng2500/articles/123967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangfeng2500/comments/commentRss/123967.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangfeng2500/services/trackbacks/123967.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: 宋体; FONT-SIZE: 10pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Java的访问控制修饰符共有<span lang=EN-US>4</span>个，分别是<span lang=EN-US>public</span>、<span lang=EN-US>protected</span>、<span lang=EN-US>default</span>、<span lang=EN-US>private</span>。下面我们分别进行讲解。<br>&nbsp;
<p><a name=_Toc5525250><span><span>4.6.1&nbsp;</span></span></a><span><span><span>类成员的访问控制</span></span></span></p>
<p><strong><span>private</span></strong><strong><span>访问控制</span></strong></p>
<p><span>在本章的前面，我们已经明白了<span>private</span>访问控制符的作用，如果一个成员方法或成员变量名前使用了<span>private</span>访问控制符，那么这个成员只能在这个类的内部使用。</span></p>
<p><span>注意：</span><span>不能在方法体内声明的变量前加<span>private</span>修饰符。</span></p>
<p><strong><span>缺省访问控制</span></strong></p>
<p><span>如果一个成员方法</span><span>或</span><span>成员变量名前没有使用任何访问控制符，我们就称这个成员是缺省的<span>(default)</span>，或是友元的<span>(friendly)</span>，或是包类型的<span>(package)</span>。对于缺省访问控制成员，可以被这个包中的其他类访问，如果一个子类与父类位于不同的包中，子类也不能访问父类中的缺省访问控制成员。</span></p>
<p><strong><span>protected</span></strong><strong><span>访问控制</span></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>如果一个成员方法</span><span>或</span><span>成员变量名前使用了</span><span>protected</span><span>访问控制符，那么这个成员即可以被同一个包中的其他类访问，也可以被不同包中的子类访问。</span></p>
<p><strong><span>public</span></strong><strong><span>访问控制</span></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>如果一个成员方法</span><span>或</span><span>成员变量名前使用了</span><span>public</span><span>访问控制符，那么这个成员即可以被所有的类访问，不管访问类与被访问类是否在同一个包中。</span></p>
<p><span>最后，我们用一张图来总结上述访问控制符的权限。</span></p>
<p align=center>&nbsp;</p>
<div align=center>
<table border=1 cellSpacing=0 cellPadding=0>
    <tbody>
        <tr>
            <td vAlign=top width=100>
            <p align=center>&nbsp;</p>
            </td>
            <td vAlign=top width=60>
            <p align=center><span>private</span></p>
            </td>
            <td vAlign=top width=53>
            <p align=center><span>defalut</span></p>
            </td>
            <td vAlign=top width=71>
            <p align=center><span>protected</span></p>
            </td>
            <td vAlign=top width=60>
            <p align=center><span>public</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=100>
            <p><span>同一类</span></p>
            </td>
            <td width=60>
            <p align=center><span>&#8730;</span></p>
            </td>
            <td width=53>
            <p align=center><span>&#8730;</span></p>
            </td>
            <td width=71>
            <p align=center><span>&#8730;</span></p>
            </td>
            <td width=60>
            <p align=center><span>&#8730;</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=100>
            <p><span>同一包中的类</span></p>
            </td>
            <td width=60>
            <p align=center>&nbsp;</p>
            </td>
            <td width=53>
            <p align=center><span>&#8730;</span></p>
            </td>
            <td width=71>
            <p align=center><span>&#8730;</span></p>
            </td>
            <td width=60>
            <p align=center><span>&#8730;</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=100>
            <p><span>子类</span></p>
            </td>
            <td width=60>
            <p align=center>&nbsp;</p>
            </td>
            <td width=53>
            <p align=center>&nbsp;</p>
            </td>
            <td width=71>
            <p align=center><span>&#8730;</span></p>
            </td>
            <td width=60>
            <p align=center><span>&#8730;</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=100>
            <p><span>其他包中的类</span></p>
            </td>
            <td width=60>
            <p align=center>&nbsp;</p>
            </td>
            <td width=53>
            <p align=center>&nbsp;</p>
            </td>
            <td width=71>
            <p align=center>&nbsp;</p>
            </td>
            <td width=60>
            <p align=center><span>&#8730;</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=center><span>表</span><span>4.1</span></p>
<p><a name=_Toc5525251><span><span>4.6.2 </span></span></a><span><span><span>类的访问控制</span></span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>除了类中的成员有访问控制外，类本身也有访问控制，即在定义类的<span>class</span>关键字前加上访问控制符，但类本身只有两种访问控制，即<span>public </span>和默认，父类不能是<span>private</span>和<span>protected</span>，否则子类无法继承。<span>public</span>修饰的类能被所有的类访问，默认修饰（即<span>class</span>关键字前没有访问控制符）的类，只能被同一包中的所有类访问。</span></p>
<p><strong><span>多学两招：</span></strong><strong></strong></p>
<p><span>只要在</span><span>class</span><span>之前，没有使用</span><span>public</span><span>修饰符，源文件的名称可以是一切合法的名称。带有</span><span>public </span><span>修饰符的类的类名必须与源文件名相同，读者可以想一想，一个</span><span>.java</span><span>源文件中能否包含多个</span><span>public</span><span>的类呢？</span></p>
<p>&nbsp;</p>
<p><a name=_Toc44209537><span>4.6.3&nbsp;Java</span></a><span><span>的命名习惯</span></span></p>
<p align=left><span>养成良好的命名习惯，意义重大，如果大家的习惯都一样，我们就能够很容易使用别人提供的类，别人也很容易理解我们的类，对此，我送给读者一句话，<span>&#8220;</span>勿以善小而不为，勿以恶小而为之<span>&#8221;</span>！下面是<span>Java</span>中的一些命名习惯，假设<span>xxx</span>，<span>yyy</span>，<span>zzz</span>分别是一个英文单词的拼写。</span></p>
<p><span><span>&nbsp; 1. </span></span><span>包名中的字母一律小写<span>,</span>如：<span>xxxyyyzzz</span>。</span></p>
<p><span>&nbsp; 2. 类名、接口名应当使用名词，每个单词的首字母大写，如：<span>XxxYyyZzz</span>。</span></p>
<p><span>&nbsp;&nbsp;3. 方法名，第一个单词小写，后面每个单词的首字母大写，如：<span>xxxYyyZzz</span>。</span></p>
<p><span>&nbsp;&nbsp;4.&nbsp;变量名，第一个单词小写，后面每个单词的首字母大写<span>,</span>如：<span>xxxYyyZzz</span>。</span></p>
<p><span><span><span>&nbsp;&nbsp;5.&nbsp;</span></span></span><span>常量名中的每个字母一律大写，如：<span>XXXYYYZZZ</span>。</span></p>
<p align=left>&nbsp;</p>
</span>
<img src ="http://www.cppblog.com/wangfeng2500/aggbug/123967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangfeng2500/" target="_blank">赞劲小子</a> 2010-08-19 14:27 <a href="http://www.cppblog.com/wangfeng2500/articles/123967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的抽象和接口</title><link>http://www.cppblog.com/wangfeng2500/articles/123833.html</link><dc:creator>赞劲小子</dc:creator><author>赞劲小子</author><pubDate>Wed, 18 Aug 2010 07:24:00 GMT</pubDate><guid>http://www.cppblog.com/wangfeng2500/articles/123833.html</guid><wfw:comment>http://www.cppblog.com/wangfeng2500/comments/123833.html</wfw:comment><comments>http://www.cppblog.com/wangfeng2500/articles/123833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangfeng2500/comments/commentRss/123833.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangfeng2500/services/trackbacks/123833.html</trackback:ping><description><![CDATA[&nbsp;
<p style="FONT-SIZE: 10pt"><a name=_Toc5525232>4.2.1&nbsp;</a>抽象类</p>
<p style="FONT-SIZE: 10pt">Java中可以定义一些不含方法体的方法，它的方法体的实现交给该类的子类根据自己的情况去实现，这样的方法就是抽象方法，包含抽象方法的类就叫抽象类。一个抽象类中可以有一个或多个抽象方法。</p>
<p style="FONT-SIZE: 10pt">抽象方法必须用abstract修饰符来定义，任何带有抽象方法的类都必须声明为抽象类。</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">抽象类定义规则</p>
<p style="FONT-SIZE: 10pt" align=left>1.&nbsp;&nbsp;抽象类必须用abstract关键字来修饰；抽象方法也必须用abstract来修饰。<br>2.&nbsp; 抽象类不能被实例化，也就是不能用new关键字去产生对象。<br>3.&nbsp; 抽象方法只需声明，而不需实现。<br>4.&nbsp; 含有抽象方法的类必须被声明为抽象类，抽象类的子类必须覆盖所有的抽象方法后才能被实例化，否则这个子类还是个抽象类。</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">抽象方法的写法：</p>
<p style="FONT-SIZE: 10pt">abstract 返回值类型 抽象方法( 参数列表 );</p>
<p style="FONT-SIZE: 10pt">抽象类和抽象方法的例子：</p>
<p style="FONT-SIZE: 10pt">abstract class A</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; abstract int aa(int x,int y);</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">&nbsp;注意：含有抽象方法的类肯定是抽象类，抽象类中的某个方法不一定是抽象的。</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt"><a name=_Toc5525233>4.2.2&nbsp;</a>接口(interface)</p>
<p style="FONT-SIZE: 10pt">如果一个抽象类中的所有方法都是抽象的，我们就可以将这个类用另外一种方式来定义，也就是接口定义。接口是抽象方法和常量值的定义的集合，从本质上讲，接口是一种特殊的抽象类，这种抽象类中只包含常量和方法的定义，而没有变量和方法的实现。</p>
<p style="FONT-SIZE: 10pt">下面是一个接口定义例子：</p>
<p style="FONT-SIZE: 10pt">public interface Runner </p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int ID = 1;</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void run();</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">在接口Runner的定义中，即使我们没有显示的将其中的成员用public关键字标识，但这些成员都是public访问类型的。接口里的变量默认是用public static final标识的，所以，接口中定义的变量就是全局静态常量。</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; 我们可以定义一个新的接口用extends关键字去继承一个已有的接口，我们也可以定义一个类用implements关键字去实现一个接口中的所有方法，我们还可以去定义一个抽象类用implements关键字去实现一个接口中定义的部分方法。</p>
<p style="FONT-SIZE: 10pt">interface Animal extends Runner</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">void breathe();</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">class Fish implements Animal</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;public void run()</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("fish is swimming");</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;}</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;public void breathe()</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;System.out.println("fish is bubbling");</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;}</p>
<p style="FONT-SIZE: 10pt">} </p>
<p style="FONT-SIZE: 10pt">abstract LandAnimal implements Animal</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp; public void breathe()</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;System.out.println("LandAnimal is breathing");</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;}</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">在上面的几个类和接口的定义中，Animal是一个接口，Animal接口具有Runner接口的特点，是对Runner接口的一种扩展。Fish是一个类，具有Animal接口中定义的所有方法，必须实现Animal接口中的所有方法（包括从Runner接口继承到的方法）。LandAnimal是一个抽象类，它实现了Animal接口中的breathe方法，但没有实现Run方法，Run方法在LandAnimal中就成了一个抽象方法，所以LandAnimal应是一个抽象类。</p>
<p style="FONT-SIZE: 10pt">在Java中，设计接口的目的是为了让类不必受限于单一继承的关系，而可以灵活地同时继承一些共有的特性，从而达到多重继承的目的，并且避免了C++中多重继承的复杂关系所产生的问题。多继承的危险性在于一个类有可能继承了同一个方法的不同实现，对接口来讲决不会发生这种情况，因为接口没有任何实现。</p>
<p style="FONT-SIZE: 10pt">一个类可以在继承一个父类的同时，实现一个或多个接口，extends关键字必须位于implements关键字之前，如我们可以这样定义类Student。</p>
<p style="FONT-SIZE: 10pt">class Student extends Person implements Runner</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&#8230;&#8230;</p>
<p style="FONT-SIZE: 10pt">public void run()</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&#8220;the student is running&#8221;);</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">&#8230;&#8230;</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">下面是一个类实现多个接口的例子，我们在程序中再定义一个Flyer接口。</p>
<p style="FONT-SIZE: 10pt">interface Flyer</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">void fly();</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">class Bird implements Runner , Flyer</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">public void run()</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&#8220;the bird is running&#8221;);</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">public void fly()</p>
<p style="FONT-SIZE: 10pt">{</p>
<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&#8220;the bird is flying&#8221;);</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">}</p>
<p style="FONT-SIZE: 10pt">下面是关于接口中定义的常量的举例，</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<div style="FONT-SIZE: 10pt">&nbsp;1<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">class&nbsp;TestFish&nbsp;<br>&nbsp;2<img id=Codehighlighter1_16_228_Open_Image onclick="this.style.display='none'; Codehighlighter1_16_228_Open_Text.style.display='none'; Codehighlighter1_16_228_Closed_Image.style.display='inline'; Codehighlighter1_16_228_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img id=Codehighlighter1_16_228_Closed_Image onclick="this.style.display='none'; Codehighlighter1_16_228_Closed_Text.style.display='none'; Codehighlighter1_16_228_Open_Image.style.display='inline'; Codehighlighter1_16_228_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><img src="http://www.cppblog.com/Images/dot.gif">{<br>&nbsp;3<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])<br>&nbsp;4<img id=Codehighlighter1_63_225_Open_Image onclick="this.style.display='none'; Codehighlighter1_63_225_Open_Text.style.display='none'; Codehighlighter1_63_225_Closed_Image.style.display='inline'; Codehighlighter1_63_225_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=Codehighlighter1_63_225_Closed_Image onclick="this.style.display='none'; Codehighlighter1_63_225_Closed_Text.style.display='none'; Codehighlighter1_63_225_Open_Image.style.display='inline'; Codehighlighter1_63_225_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br>&nbsp;5<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fish&nbsp;f&nbsp;=new&nbsp;Fish();<br>&nbsp;6<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;j=0;<br>&nbsp;7<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=Runner.ID;//&#8220;类名.静态成员&#8221;的格式<br>&nbsp;8<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=f.ID;&nbsp;//&nbsp;&#8220;对象名.静态成员&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;9<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.ID=2;//出错，不能为final&nbsp;变量重新赋值<br>10<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;}<br>11<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br>12<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}<br>13<img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></div>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">下面是对接口的实现及特点的小结：</p>
<p style="FONT-SIZE: 10pt">1.&nbsp; 实现一个接口就是要实现该接口的所有方法（抽象类除外）。</p>
<p style="FONT-SIZE: 10pt">2.&nbsp; 接口中的方法都是抽象的。</p>
<p style="FONT-SIZE: 10pt" align=left>3.&nbsp; &nbsp;多个无关的类可以实现同一个接口，一个类可以实现多个无关的接口。</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<img src ="http://www.cppblog.com/wangfeng2500/aggbug/123833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangfeng2500/" target="_blank">赞劲小子</a> 2010-08-18 15:24 <a href="http://www.cppblog.com/wangfeng2500/articles/123833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的内部类</title><link>http://www.cppblog.com/wangfeng2500/articles/123737.html</link><dc:creator>赞劲小子</dc:creator><author>赞劲小子</author><pubDate>Tue, 17 Aug 2010 08:43:00 GMT</pubDate><guid>http://www.cppblog.com/wangfeng2500/articles/123737.html</guid><wfw:comment>http://www.cppblog.com/wangfeng2500/comments/123737.html</wfw:comment><comments>http://www.cppblog.com/wangfeng2500/articles/123737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangfeng2500/comments/commentRss/123737.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangfeng2500/services/trackbacks/123737.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;3.8&nbsp;内部类&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一个类内部定义类，这就是嵌套类（nested classes），也叫内部类、内置类。读者以后不要死抠这些名称术语，不同的书籍有不同的翻译风格，你只要知道怎么回事就行了。我曾经碰到一个学员为了弄清楚方法与函数的区别（因为有的书叫方法，有的书叫函数，反而把他给弄糊涂了），...&nbsp;&nbsp;<a href='http://www.cppblog.com/wangfeng2500/articles/123737.html'>阅读全文</a><img src ="http://www.cppblog.com/wangfeng2500/aggbug/123737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangfeng2500/" target="_blank">赞劲小子</a> 2010-08-17 16:43 <a href="http://www.cppblog.com/wangfeng2500/articles/123737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中的final关键字用法</title><link>http://www.cppblog.com/wangfeng2500/articles/123735.html</link><dc:creator>赞劲小子</dc:creator><author>赞劲小子</author><pubDate>Tue, 17 Aug 2010 08:39:00 GMT</pubDate><guid>http://www.cppblog.com/wangfeng2500/articles/123735.html</guid><wfw:comment>http://www.cppblog.com/wangfeng2500/comments/123735.html</wfw:comment><comments>http://www.cppblog.com/wangfeng2500/articles/123735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangfeng2500/comments/commentRss/123735.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangfeng2500/services/trackbacks/123735.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java关键字final有&#8220;这是无法改变的&#8221;或者&#8220;终态的&#8221;含义，它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变：设计或效率。可以修饰的对象: final变量、final方法和final类。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp; final类不能被继承，没有子类，final类中的方法默认是final的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp; final方法不能被子类的方法覆盖，但可以被继承。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp; final成员变量表示常量，只能被赋值一次，赋值后值不再改变。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp; final不能用于修饰构造方法。 　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：父类的private成员方法是不能被子类方法覆盖的，因此private类型的方法默认是final类型的。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final int X=3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X=4; //出错<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final标记的成员变量必须在声明的同时或在该类的构造方法中显式赋值，然后才能使用。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class Test<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final int X=3;<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;或者：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class Test<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final int X;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Test()<br>&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X=3;<br>&nbsp;&nbsp;&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; 5. 方法中定义的内置类只能访问该方法内的final类型的局部变量，用final定义的局部变量相当于是一个常量，它的生命周期超出方法运行的生命周期，这种情况的应用，我们已在第三章中讲过。将一个形参定义成final也是可以的，这就限定了我们在方法中修改形式参数的值。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6. 但这个&#8220;常量&#8221;也只能在这个类的内部使用，不能在类的外部直接使用。当我们用public static final共同标记常量时，这个常量就成了全局的常量。而且这样定义的常量只能在定义时赋值，即使在构造函数里面也不能对其进行赋值。如：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class Xxx<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public static final int X=3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>......</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p>
<br><br>&nbsp;<br></span>
<img src ="http://www.cppblog.com/wangfeng2500/aggbug/123735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangfeng2500/" target="_blank">赞劲小子</a> 2010-08-17 16:39 <a href="http://www.cppblog.com/wangfeng2500/articles/123735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中的static用法</title><link>http://www.cppblog.com/wangfeng2500/articles/120378.html</link><dc:creator>赞劲小子</dc:creator><author>赞劲小子</author><pubDate>Wed, 14 Jul 2010 13:06:00 GMT</pubDate><guid>http://www.cppblog.com/wangfeng2500/articles/120378.html</guid><wfw:comment>http://www.cppblog.com/wangfeng2500/comments/120378.html</wfw:comment><comments>http://www.cppblog.com/wangfeng2500/articles/120378.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wangfeng2500/comments/commentRss/120378.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wangfeng2500/services/trackbacks/120378.html</trackback:ping><description><![CDATA[<div style="FONT-SIZE: 10pt" class=blog_content>
<p>static表示&#8220;全局&#8221;或者&#8220;静态&#8221;的意思，用来修饰成员变量和成员方法，也可以形成静态static代码块，但是Java语言中没有全局变量的概念。 <br><br>　被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说，它不依赖类特定的实例，被类的所有实例共享。只要这个类被加载，Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此，static对象可以在它的任何对象创建之前访问，无需引用任何对象。 <br><br>　用public修饰的static成员变量和成员方法本质是全局变量和全局方法，当声明它类的对象市，不生成 static变量的副本，而是类的所有实例共享同一个static变量。 <br><br>　static 变量前可以有private修饰，表示这个变量可以在类的静态代码块中，或者类的其他静态成员方法中使用（当然也可以在非静态成员方法中使用--废话），但是不能在其他类中通过类名来直接引用，这一点很重要。实际上你需要搞明白，private是访问权限限定，static表示不要实例化就可以使用，这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。 <br><br>　static修饰的成员变量和成员方法习惯上称为静态变量和静态方法，可以直接通过类名来访问，访问语法为： <br>类名.静态方法名(参数列表...) <br>类名.静态变量名 <br><br>　用 static修饰的代码块表示静态代码块，当Java虚拟机（JVM）加载类时，就会执行该代码块（用处非常大，呵呵）。 <br><br>1、 static变量 <br>　按照是否静态的对类成员变量进行分类可分两种：一种是被static修饰的变量，叫静态变量或类变量；另一种是没有被 static修饰的变量，叫实例变量。两者的区别是： <br>　对于静态变量在内存中只有一个拷贝（节省内存），JVM只为静态分配一次内存，在加载类的过程中完成静态变量的内存分配，可用类名直接访问（方便），当然也可以通过对象来访问（但是这是不推荐的）。 <br>　对于实例变量，没创建一个实例，就会为实例变量分配一次内存，实例变量可以在内存中有多个拷贝，互不影响（灵活）。 <br><br>2、静态方法 <br>　静态方法可以直接通过类名调用，任何的实例也都可以调用，因此静态方法中不能用this和super关键字，不能直接访问所属类的实例变量和实例方法 (就是不带static的成员变量和成员成员方法)，只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联！这个需要去理解，想明白其中的道理，不是记忆！！！ <br>　因为static方法独立于任何实例，因此static方法必须被实现，而不能是抽象的abstract。 <br><br>3、 static代码块 <br>　static 代码块也叫静态代码块，是在类中独立于类成员的static语句块，可以有多个，位置可以随便放，它不在任何的方法体内，JVM加载类时会执行这些静态的代码块，如果static代码块有多个，JVM将按照它们在类中出现的先后顺序依次执行它们，每个代码块只会被执行一次。<br>利用静态代码块可以对一些static变量进行赋值，最后再看一眼这些例子，都一个static的main方法，这样JVM在运行main方法的时候可以直接调用而不用创建实例。 <br><br>4、static和final一块用表示什么 <br>static final用来修饰成员变量和成员方法，可简单理解为&#8220;全局常量&#8221;！ <br>对于变量，表示一旦给值就不可修改，并且通过类名可以访问。 <br>对于方法，表示不可覆盖，并且可以通过类名直接访问。</p>
</div>
<img src ="http://www.cppblog.com/wangfeng2500/aggbug/120378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wangfeng2500/" target="_blank">赞劲小子</a> 2010-07-14 21:06 <a href="http://www.cppblog.com/wangfeng2500/articles/120378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>