linux / java / mysql / svn / apache / tomcat

instanceof应用与反例

上一篇 / 下一篇  2007-01-24 16:22:30 / 天气: 晴朗 / 心情: 平静 / 精华(1) / 个人分类:Java

Linux宝库.QZ8O6i+BN)Y

instanceofJava的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:
0GwCw Pr![q"_{H0
q&@*C l4}e:C2w/?2t0  String s = "I AM an Object!";
`Fh1w9s#F&{ `0  boolean isObject = s instanceof Object;Linux宝库7L3F)goB`
Linux宝库U H,H k d(@ Kf
  我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。
q/U@|,??$Q0  instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:
3[W5@+AO0
&c-Jku:po0  public class Bill {//省略细节}Linux宝库O-o*?Y/I
  public class PhoneBill extends Bill {//省略细节}Linux宝库i(vU"X.s*|EzVQ [1E
  public class GasBill extends Bill {//省略细节}Linux宝库(C f&?V:l^._cz

#ho)m6ha C@$a9C0  在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:
/Mgw uD3veh8c0
S z4K3`g|E9C N0  public double calculate(Bill bill) {Linux宝库&o.p+x1Y)u;J(w
  if (bill instanceof PhoneBill) {
iE'q#` a7Ec0  //计算电话账单Linux宝库 J]?},Ur4@#x`6H
  }Linux宝库Hi6DfX s
  if (bill instanceof GasBill) {Linux宝库 \a ^bUh
  //计算燃气账单
/YY cjn*D\;E0  }Linux宝库b3}1OuL8K:ku ^
  ...Linux宝库JKR+r3`-HA3t
  }Linux宝库n'l.qch4@
  这样就可以用一个方法处理两种子类。Linux宝库Gs_8eM
Linux宝库4r{ K7}&Z;u ~;jC+a4a6B
  然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:Linux宝库{.\V s}.u$B.O.{XB^5y

G I1?O&BU0  public double calculate(PhoneBill bill) {
KXy&zQ9hU0  //计算电话账单Linux宝库h3c!?"X;M?;Y&?.Y \)\
  }Linux宝库-V3D5qYz_I0x
Linux宝库w$zL6x~.j
  public double calculate(GasBill bill) {
Dl+Hd @ ]0  //计算燃气账单
&m/?+A$Bu4r`0  }
l{;B NwK0
q9R6A^'v"pO1qR'`0  所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。Linux宝库9U `mF(FFfh

Linux宝库&i"s]x.v:T U!n

收藏,差不多的例子!

j5I({7da0Linux宝库Q+ar3b)c T

使用instanceof关键字在运行时动态判断实例的类型-Linux宝库-q,sP U,i W

Linux宝库'W v V+Uf"{B^@

Linux宝库#A"Mts h2E#r6cU

Java的instance关键字可以实现"运行时类型识别"(Run-time type identification, RTTI)
0TRo/M!]y0Linux宝库%}u Yl1D

mN2Fz2Y8Ir0Java的instance关键字可以实现"运行时类型识别"(Run-time type identification, RTTI),也就是说可以通过instanceof关键字判断某个对象是否时没个类的实例,例如:

k2b^ N$MC-GxJ&V%u i0

W?]Da!_/h4i6`0class ClassA {
aER!Ofl:?0ClassA() {
_q Bz[/\0}
? v(MN+J'n l0Sd0}Linux宝库BM sp/YR

Linux宝库] ]`Oj t)E,[9`~

class ClassB {
$Xl@@%~?2\u0] |0ClassB() {
L+z%zJ w`B C0}Linux宝库^Oy/F;f9M`
}

^OT(Vi0

c/O3E_r0public class MyInstanceOf {Linux宝库~%a'ex&I%g;~`U
public static void main(String[] args) {Linux宝库3D n-js C*Ki
sayClass(new ClassA());
P ShCg'XhVD0sayClass(new ClassB());Linux宝库4BR3Ho1B^h.D.@
}

5a;yc0GY0

p'K)x'J1Q*J0public static void sayClass(Object o) {Linux宝库e:I ~&?J `
if (o instanceof ClassA)Linux宝库r#F-Xo](GE2k
System.out.println("This is ClassA");Linux宝库.^^@TL i9mW'c
if (o instanceof ClassB)Linux宝库1~ u:u oO|
System.out.println("This is ClassB");Linux宝库FT:R9Mm R&c q
}Linux宝库1p4WgvSF
}

T$Ex`4J zN0Linux宝库FDcJ"r3T1{~Hg:Wy

输出结果:Linux宝库\ O0?M C'}

Linux宝库Thf0N.OX

This is ClassALinux宝库Ys?v;_%I#j
This is ClassBLinux宝库0`]%_d#f oe

zFx*p6cJ`0通过instanceof关键字就可将Extened Class中一些差异极小的方法放在Base Class中实现,进而实现代码精简和整洁.但不可滥用,在多数情况下我们可以通过多态(Polymorphism)实现相同的功能.Linux宝库KG7K&K0jW mt^

$? R Wo;a$Wxq0 Linux宝库DOz1K6k9X^

D nxg2M gu/S9u0 

!\@%ar|`B6W0

TAG: Java java instanceof

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

数据统计

  • 访问量: 11059
  • 日志数: 14
  • 图片数: 5
  • 商品数: 6
  • 建立时间: 2006-09-21
  • 更新时间: 2007-11-02

RSS订阅

Open Toolbar