﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-ALL  ABOUT JAVA-随笔分类-Java 面试题目大全</title><link>http://www.blogjava.net/wdlfellow/category/21513.html</link><description>JAVA 技术</description><language>zh-cn</language><lastBuildDate>Wed, 11 Apr 2007 02:49:44 GMT</lastBuildDate><pubDate>Wed, 11 Apr 2007 02:49:44 GMT</pubDate><ttl>60</ttl><item><title>华为JAVA inteview topics</title><link>http://www.blogjava.net/wdlfellow/archive/2007/04/11/109814.html</link><dc:creator>泡面</dc:creator><author>泡面</author><pubDate>Wed, 11 Apr 2007 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/wdlfellow/archive/2007/04/11/109814.html</guid><wfw:comment>http://www.blogjava.net/wdlfellow/comments/109814.html</wfw:comment><comments>http://www.blogjava.net/wdlfellow/archive/2007/04/11/109814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wdlfellow/comments/commentRss/109814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wdlfellow/services/trackbacks/109814.html</trackback:ping><description><![CDATA[JAVA 方面<br><br>1 面向对象的特征有哪些方面<br>2 String 是最基本的数据类型吗?<br>3 int 和 Integer 有什么区别<br>4 String 和StringBuffer 的区别<br>5 运行时异常与一般异常有何异同？<br>异常表示程序运行过程中可能出现的非正常状态，运行时异常表示虚拟机的通常<br>操作中可能遇到的异常，是一种常见运行错误。java 编译器要求方法必须声明抛<br>出可能发生的非运行时异常，但是并不要求必须声明抛出未被捕获的运行时异<br>常。<br>6 说出一些常用的类，包,接口，请各举5 个<br>7 说出ArrayList,Vector, LinkedList 的存储性能和特性<br>ArrayList 和Vector 都是使用数组方式存储数据，此数组元素数大于实际存储的<br>数据以便增加和插入元素，它们都允许直接按序号索引元素，但是插入元素要涉<br>及数组元素移动等内存操作，所以索引数据快而插入数据慢，Vector 由于使用了<br>synchronized 方法（线程安全），通常性能上较ArrayList 差，而LinkedList 使用<br>双向链表实现存储，按序号索引数据需要进行前向或后向遍历，但是插入数据时<br>只需要记录本项的前后项即可，所以插入速度较快。<br>8 设计4 个线程，其中两个线程每次对j 增加1，另外两个线程对j 每次减少1。<br>写出程序。<br>以下程序使用内部类实现线程，对j 增减的时候没有考虑顺序问题。<br>public class ThreadTest1{<br>private int j;<br>public static void main(String args[]){<br>ThreadTest1 tt=new ThreadTest1();<br>Inc inc=tt.new Inc();<br>Dec dec=tt.new Dec();<br>for(int i=0;i&lt;2;i++){<br>Thread t=new Thread(inc);<br>t.start();<br>t=new Thread(dec);<br>t.start();<br>}<br>}<br>private synchronized void inc(){<br>j++;<br>System.out.println(Thread.currentThread().getName()+"-inc:"+j);<br>}<br>private synchronized void dec(){<br>j--;<br>System.out.println(Thread.currentThread().getName()+"-dec:"+j);<br>}<br>class Inc implements Runnable{<br>public void run(){<br>for(int i=0;i&lt;100;i++){<br>inc();<br>}<br>}<br>}<br>class Dec implements Runnable{<br>public void run(){<br>for(int i=0;i&lt;100;i++){<br>dec();<br>}<br>}<br>}<br>}<br>9．JSP 的内置对象及方法。<br>request request 表示HttpServletRequest 对象。它包含了有关浏览器请求的信息，并且提<br>供了几个用于获取cookie, header, 和session 数据的有用的方法。<br>response response 表示HttpServletResponse 对象，并提供了几个用于设置送回 浏览器的<br>响应的方法（如cookies,头信息等）<br>out out 对象是javax.jsp.JspWriter 的一个实例，并提供了几个方法使你能用于向浏览器回<br>送输出结果。<br>pageContext pageContext 表示一个javax.servlet.jsp.PageContext 对象。它是用于方便存<br>取各种范围的名字空间、servlet 相关的对象的API，并且包装了通用的servlet 相关功能的<br>方法。<br>session session 表示一个请求的javax.servlet.http.HttpSession 对象。Session 可以存贮用<br>户的状态信息<br>application applicaton 表示一个javax.servle.ServletContext 对象。这有助于查找有关<br>servlet 引擎和servlet 环境的信息<br>config config 表示一个javax.servlet.ServletConfig 对象。该对象用于存取servlet 实例的初<br>始化参数。<br>page page 表示从该页面产生的一个servlet 实例<br>10.用socket 通讯写出客户端和服务器端的通讯，要求客户发送数据后能够回显<br>相同的数据。<br>参见课程中socket 通讯例子。<br>11 说出Servlet 的生命周期，并说出Servlet 和CGI 的区别。<br>Servlet 被服务器实例化后，容器运行其init 方法，请求到达时运行其service 方<br>法，service 方法自动派遣运行与请求对应的doXXX 方法（doGet，doPost）等，<br>当服务器决定将实例销毁的时候调用其destroy 方法。<br>与cgi 的区别在于servlet 处于服务器进程中，它通过多线程方式运行其service<br>方法，一个实例可以服务于多个请求，并且其实例一般不会销毁，而CGI 对每<br>个请求都产生新的进程，服务完成后就销毁，所以效率上低于servlet。<br>12.EJB 是基于哪些技术实现的?并说出SessionBean 和EntityBean 的区别，<br>StatefulBean 和StatelessBean 的区别。<br>13．EJB 包括（SessionBean,EntityBean）说出他们的生命周期，及如何管理事务<br>的？<br>14．说出数据连接池的工作机制是什么?<br>15 同步和异步有和异同，在什么情况下分别使用他们？举例说明。<br>16 应用服务器有那些？<br>17 你所知道的集合类都有哪些？主要方法？<br>18 给你一个:驱动程序A,数据源名称为B,用户名称为C,密码为D,数据库表为T，<br>请用JDBC 检索出表T 的所有数据。<br>19．说出在JSP 页面里是怎么分页的?<br>页面需要保存以下参数：<br>总行数：根据sql 语句得到总行数<br>每页显示行数：设定值<br>当前页数：请求参数<br>页面根据当前页数和每页行数计算出当前页第一行行数，定位结果集到此行，对<br>结果集取出每页显示行数的行即可。<br>数据库方面：<br>1. 存储过程和函数的区别<br>存储过程是用户定义的一系列sql 语句的集合，涉及特定表或其它对象<br>的任务，用户可以调用存储过程，而函数通常是数据库已定义的方法，<br>它接收参数并返回某种类型的值并且不涉及特定用户表。<br>2. 事务是什么？<br>事务是作为一个逻辑单元执行的一系列操作，一个逻辑工作单元必须有四个<br>属性，称为 ACID（原子性、一致性、隔离性和持久性）属性，只有这样才能成<br>为一个事务：<br>原子性<br>事务必须是原子工作单元；对于其数据修改，要么全都执行，要么全都不执行。<br>一致性<br>事务在完成时，必须使所有的数据都保持一致状态。在相关数据库中，所有规则<br>都必须应用于事务的修改，以保持所有数据的完整性。事务结束时，所有的内部<br>数据结构（如 B 树索引或双向链表）都必须是正确的。<br>隔离性<br>由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据<br>时数据所处的状态，要么是另一并发事务修改它之前的状态，要么是另一事务修<br>改它之后的状态，事务不会查看中间状态的数据。这称为可串行性，因为它能够<br>重新装载起始数据，并且重播一系列事务，以使数据结束时的状态与原始事务执<br>行的状态相同。<br>持久性<br>事务完成之后，它对于系统的影响是永久性的。该修改即使出现系统故障也将一<br>直保持。<br>3. 游标的作用？如何知道游标已经到了最后？<br>游标用于定位结果集的行，通过判断全局变量@@FETCH_STATUS 可以判<br>断是否到了最后，通常此变量不等于0 表示出错或到了最后。<br>4. 触发器分为事前触发和事后触发，这两种触发有和区别。语句级触发和<br>行级触发有何区别。<br>事前触发器运行于触发事件发生之前，而事后触发器运行于触发事件发<br>生之后。通常事前触发器可以获取事件之前和新的字段值。<br>语句级触发器可以在语句执行前或后执行，而行级触发在触发器所影响<br>的每一行触发一次。<br>
<img src ="http://www.blogjava.net/wdlfellow/aggbug/109814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wdlfellow/" target="_blank">泡面</a> 2007-04-11 09:38 <a href="http://www.blogjava.net/wdlfellow/archive/2007/04/11/109814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>每个Java 初学者都应该搞清楚的问题</title><link>http://www.blogjava.net/wdlfellow/archive/2007/04/09/109305.html</link><dc:creator>泡面</dc:creator><author>泡面</author><pubDate>Sun, 08 Apr 2007 19:14:00 GMT</pubDate><guid>http://www.blogjava.net/wdlfellow/archive/2007/04/09/109305.html</guid><wfw:comment>http://www.blogjava.net/wdlfellow/comments/109305.html</wfw:comment><comments>http://www.blogjava.net/wdlfellow/archive/2007/04/09/109305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wdlfellow/comments/commentRss/109305.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wdlfellow/services/trackbacks/109305.html</trackback:ping><description><![CDATA[<font face=Tahoma size=2>对于这个系列里的问题，每个学Java的人都应该搞懂。当然，如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了，却不很懂这些问题，请将你自己重归初学者行列。内容均来自于CSDN的经典老贴。<br><br>问题一：我声明了什么！<br><br>String&nbsp;s&nbsp;=&nbsp;"Hello&nbsp;world!";<br><br>许多人都做过这样的事情，但是，我们到底声明了什么？回答通常是：一个String，内容是&#8220;Hello&nbsp;world!&#8221;。这样模糊的回答通常是概念不清的根源。如果要准确的回答，一半的人大概会回答错误。<br>这个语句声明的是一个指向对象的引用，名为&#8220;s&#8221;，可以指向类型为String的任何对象，目前指向"Hello&nbsp;world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象，我们只是声明了一个只能指向String对象的引用变量。所以，如果在刚才那句语句后面，如果再运行一句：<br><br>String&nbsp;string&nbsp;=&nbsp;s;<br><br>我们是声明了另外一个只能指向String对象的引用，名为string，并没有第二个对象产生，string还是指向原来那个对象，也就是，和s指向同一个对象。<br><br>问题二："=="和equals方法究竟有什么区别？<br><br>==操作符专门用来比较变量的值是否相等。比较好理解的一点是：<br>int&nbsp;a=10;<br>int&nbsp;b=10;<br>则a==b将是true。<br>但不好理解的地方是：<br>String&nbsp;a=new&nbsp;String("foo");<br>String&nbsp;b=new&nbsp;String("foo");<br>则a==b将返回false。<br><br>根据前一帖说过，对象变量其实是一个引用，它们的值是指向对象所在的内存地址，而不是对象本身。a和b都使用了new操作符，意味着将在内存中产生两个内容为"foo"的字符串，既然是&#8220;两个&#8221;，它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值，所以使用"=="操作符，结果会是false。诚然，a和b所指的对象，它们的内容都是"foo"，应该是&#8220;相等&#8221;，但是==操作符并不涉及到对象内容的比较。<br>对象内容的比较，正是equals方法做的事。<br><br>看一下Object对象的equals方法是如何实现的：<br>boolean&nbsp;equals(Object&nbsp;o){<br><br>return&nbsp;this==o;<br><br>}<br>Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法，那你的类使用equals和使用==会得到同样的结果。同样也可以看出，Object的equals方法没有达到equals方法应该达到的目标：比较两个对象内容是否相等。因为答案应该由类的创建者决定，所以Object把这个任务留给了类的创建者。<br><br>看一下一个极端的类：<br>Class&nbsp;Monster{<br>private&nbsp;String&nbsp;content;<br>...<br>boolean&nbsp;equals(Object&nbsp;another){&nbsp;return&nbsp;true;}<br><br>}<br>我覆盖了equals方法。这个实现会导致无论Monster实例内容如何，它们之间的比较永远返回true。<br><br>所以当你是用equals方法判断对象的内容是否相等，请不要想当然。因为可能你认为相等，而这个类的作者不这样认为，而类的equals方法的实现是由他掌握的。如果你需要使用equals方法，或者使用任何基于散列码的集合（HashSet,HashMap,HashTable），请察看一下java&nbsp;doc以确认这个类的equals逻辑是如何实现的。</font>
<p>&nbsp;</p>
<p><font face=Tahoma color=#ff0000 size=2><strong>继续深入讨论一下&#8220;＝＝&#8221;和equals，看如下例子</strong></font></p>
<p><font face=Tahoma size=2>public class TestStringIntern {<br>&nbsp; <br>&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp; testIt();<br>&nbsp; }<br>&nbsp; <br>&nbsp; private static void testIt() {<br>&nbsp;&nbsp;&nbsp; String s1 = "sean_gao";<br>&nbsp;&nbsp;&nbsp; String s2 = "sean"+"_"+"gao";<br>&nbsp;&nbsp;&nbsp; String s3 = new String("sean_gao");<br>&nbsp;&nbsp;&nbsp; String s4 = new String("sean_gao").intern();<br>&nbsp;&nbsp;&nbsp; System.out.println("s1==s2? "+(s1==s2));<br>&nbsp;&nbsp;&nbsp; System.out.println("s1==s3? "+(s1==s3));<br>&nbsp;&nbsp;&nbsp; System.out.println("s1==s4? "+(s1==s4));<br>&nbsp;&nbsp;&nbsp; System.out.println("s1.equals(s2)? "+(s1.equals(s2)));<br>&nbsp;&nbsp;&nbsp; System.out.println("s1.equals(s3)? "+(s1.equals(s3)));<br>&nbsp;&nbsp;&nbsp; System.out.println("s1.equals(s4)? "+(s1.equals(s4)));<br>&nbsp; }<br>&nbsp; <br>}</font></p>
<p><font face=Tahoma size=2>以下是结果：</font></p>
<p><font face=Tahoma size=2>s1==s2? true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 引用的是同一个对象，因为内容一致<br>s1==s3? false&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 引用的是不同的对象，因为用了new关键字<br>s1==s4? true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 引用的是同一个对象，因为用了intern方法<br>s1.equals(s2)? true&nbsp; // 内容一致<br>s1.equals(s3)? true&nbsp; // 内容一致<br>s1.equals(s4)? true&nbsp; // 内容一致<br><font color=#ff0000><strong>再次解释：</strong></font>对于String对象，如果是按照String s = "some string";这样的形式声明的，如果同一个JVM中恰好有相同内容的String对象，那么这个s指向的就是那个已有的对象。但如果使用String s = new String("some string");这样的语法，那么不管JVM中有没有可以重用的String对象，都将新建一个对象。</font></p>
<p><font face=Tahoma size=2>==操作符判断的是对象引用是否指向同一个对象，而equals方法在String类中的实现是判断String对象的内容是否一致。<br><br><br>问题三：String到底变了没有？<br><br>没有。因为String被设计成不可变(immutable)类，所以它的所有对象都是不可变对象。请看下列代码：<br><br>String&nbsp;s&nbsp;=&nbsp;"Hello";<br>s&nbsp;=&nbsp;s&nbsp;+&nbsp;"&nbsp;world!";<br><br>s所指向的对象是否改变了呢？从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中，s原先指向一个String对象，内容是"Hello"，然后我们对s进行了+操作，那么s所指向的那个对象是否发生了改变呢？答案是没有。这时，s不指向原来那个对象了，而指向了另一个String对象，内容为"Hello&nbsp;world!"，原来那个对象还存在于内存之中，只是s这个引用变量不再指向它了。<br>通过上面的说明，我们很容易导出另一个结论，如果经常对字符串进行各种各样的修改，或者说，不可预见的修改，那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变，所以对于每一个不同的字符串，都需要一个String对象来表示。这时，应该考虑使用StringBuffer类，它允许修改，而不是每个不同的字符串都要生成一个新的对象。并且，这两种类的对象转换十分容易。<br>同时，我们还可以知道，如果要使用内容相同的字符串，不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化，把它设置为初始值，应当这样做：<br>public&nbsp;class&nbsp;Demo&nbsp;{<br>private&nbsp;String&nbsp;s;<br>...<br>public&nbsp;Demo&nbsp;{<br>s&nbsp;=&nbsp;"Initial&nbsp;Value";<br>}<br>...<br>}<br>而非<br>s&nbsp;=&nbsp;new&nbsp;String("Initial&nbsp;Value");<br>后者每次都会调用构造器，生成新对象，性能低下且内存开销大，并且没有意义，因为String对象不可改变，所以对于内容相同的字符串，只要一个String对象来表示就可以了。也就说，多次调用上面的构造器创建多个对象，他们的String类型属性s都指向同一个对象。<br>上面的结论还基于这样一个事实：对于字符串常量，如果内容相同，Java认为它们代表同一个String对象。而用关键字new调用构造器，总是会创建一个新的对象，无论内容是否相同。<br>至于为什么要把String类设计成不可变类，是它的用途决定的。其实不只String，很多Java标准类库中的类都是不可变的。在开发一个系统的时候，我们有时候也需要设计不可变类，来传递一组相关的值，这也是面向对象思想的体现。不可变类有一些优点，比如因为它的对象是只读的，所以多线程并发访问也不会有任何问题。当然也有一些缺点，比如每个不同的状态都要一个对象来代表，可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本，即StringBuffer。<br><br>问题四：final关键字到底修饰了什么？<br><br>final使得被修饰的变量"不变"，但是由于对象型变量的本质是&#8220;引用&#8221;，使得&#8220;不变&#8221;也有了两种含义：引用本身的不变，和引用指向的对象不变。<br><br>引用本身的不变：<br>final&nbsp;StringBuffer&nbsp;a=new&nbsp;StringBuffer("immutable");<br>final&nbsp;StringBuffer&nbsp;b=new&nbsp;StringBuffer("not&nbsp;immutable");<br>a=b;//编译期错误<br><br>引用指向的对象不变：<br>final&nbsp;StringBuffer&nbsp;a=new&nbsp;StringBuffer("immutable");<br>a.append("&nbsp;broken!");&nbsp;//编译通过<br><br>可见，final只对引用的&#8220;值&#8221;(也即它所指向的那个对象的内存地址)有效，它迫使引用只能指向初始指向的那个对象，改变它的指向会导致编译期错误。至于它所指向的对象的变化，final是不负责的。这很类似==操作符：==操作符只负责引用的&#8220;值&#8221;相等，至于这个地址所指向的对象内容是否相等，==操作符是不管的。<br><br>理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象，不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改，一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final，意图使得它&#8220;永远不变&#8221;。其实那是徒劳的。<br><br>问题五：到底要怎么样初始化！<br><br>本问题讨论变量的初始化，所以先来看一下Java中有哪些种类的变量。<br>1.&nbsp;类的属性，或者叫值域<br>2.&nbsp;方法里的局部变量<br>3.&nbsp;方法的参数<br><br>对于第一种变量，Java虚拟机会自动进行初始化。如果给出了初始值，则初始化为该初始值。如果没有给出，则把它初始化为该类型变量的默认初始值。<br><br>int类型变量默认初始值为0<br>float类型变量默认初始值为0.0f<br>double类型变量默认初始值为0.0<br>boolean类型变量默认初始值为false<br>char类型变量默认初始值为0(ASCII码)<br>long类型变量默认初始值为0<br>所有对象引用类型变量默认初始值为null，即不指向任何对象。注意数组本身也是对象，所以没有初始化的数组引用在自动初始化后其值也是null。<br><br>对于两种不同的类属性，static属性与instance属性，初始化的时机是不同的。instance属性在创建实例的时候初始化，static属性在类加载，也就是第一次用到这个类的时候初始化，对于后来的实例的创建，不再次进行初始化。这个问题会在以后的系列中进行详细讨论。<br><br>对于第二种变量，必须明确地进行初始化。如果再没有初始化之前就试图使用它，编译器会抗议。如果初始化的语句在try块中或if块中，也必须要让它在第一次使用前一定能够得到赋值。也就是说，把初始化语句放在只有if块的条件判断语句中编译器也会抗议，因为执行的时候可能不符合if后面的判断条件，如此一来初始化语句就不会被执行了，这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句，就可以通过编译，因为无论如何，总有至少一条初始化语句会被执行，不会发生使用前未被初始化的事情。对于try-catch也是一样，如果只有在try块里才有初始化语句，编译部通过。如果在catch或finally里也有，则可以通过编译。总之，要保证局部变量在使用之前一定被初始化了。所以，一个好的做法是在声明他们的时候就初始化他们，如果不知道要出事化成什么值好，就用上面的默认值吧！<br><br>其实第三种变量和第二种本质上是一样的，都是方法中的局部变量。只不过作为参数，肯定是被初始化过的，传入的值就是初始值，所以不需要初始化。<br><br>问题六：instanceof是什么东东？<br><br>instanceof是Java的一个二元操作符，和==，&gt;，&lt;是同一类东东。由于它是由字母组成的，所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例，返回boolean类型的数据。举个例子：<br><br>String&nbsp;s&nbsp;=&nbsp;"I&nbsp;AM&nbsp;an&nbsp;Object!";<br>boolean&nbsp;isObject&nbsp;=&nbsp;s&nbsp;instanceof&nbsp;Object;<br><br>我们声明了一个String对象引用，指向一个String对象，然后用instancof来测试它所指向的对象是否是Object类的一个实例，显然，这是真的，所以返回true，也就是isObject的值为True。<br>instanceof有一些用处。比如我们写了一个处理账单的系统，其中有这样三个类：<br><br>public&nbsp;class&nbsp;Bill&nbsp;{//省略细节}<br>public&nbsp;class&nbsp;PhoneBill&nbsp;extends&nbsp;Bill&nbsp;{//省略细节}<br>public&nbsp;class&nbsp;GasBill&nbsp;extends&nbsp;Bill&nbsp;{//省略细节}<br><br>在处理程序里有一个方法，接受一个Bill类型的对象，计算金额。假设两种账单计算方法不同，而传入的Bill对象可能是两种中的任何一种，所以要用instanceof来判断：<br><br>public&nbsp;double&nbsp;calculate(Bill&nbsp;bill)&nbsp;{<br>if&nbsp;(bill&nbsp;instanceof&nbsp;PhoneBill)&nbsp;{<br>//计算电话账单<br>}<br>if&nbsp;(bill&nbsp;instanceof&nbsp;GasBill)&nbsp;{<br>//计算燃气账单<br>}<br>...<br>}<br>这样就可以用一个方法处理两种子类。<br><br>然而，这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现，这是面向对象变成应有的做法，避免回到结构化编程模式。只要提供两个名字和返回值都相同，接受参数类型不同的方法就可以了：<br><br>public&nbsp;double&nbsp;calculate(PhoneBill&nbsp;bill)&nbsp;{<br>//计算电话账单<br>}<br><br>public&nbsp;double&nbsp;calculate(GasBill&nbsp;bill)&nbsp;{<br>//计算燃气账单<br>}<br><br>所以，使用instanceof在绝大多数情况下并不是推荐的做法，应当好好利用多态。</font></p>
<img src ="http://www.blogjava.net/wdlfellow/aggbug/109305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wdlfellow/" target="_blank">泡面</a> 2007-04-09 03:14 <a href="http://www.blogjava.net/wdlfellow/archive/2007/04/09/109305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>