每个初学者都应该搞懂的问题(6)

Sheepy 2004-03-25 02:11:51
对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。

问题6
instanceof是什么东东?

instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:

String s = "I AM an Object!";
boolean isObject = s instanceof Object;

我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。
instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:

public class Bill {//省略细节}
public class PhoneBill extends Bill {//省略细节}
public class GasBill extends Bill {//省略细节}

在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:

public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//计算电话账单
}
if (bill instanceof GasBill) {
//计算燃气账单
}
...
}
这样就可以用一个方法处理两种子类。

然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:

public double calculate(PhoneBill bill) {
//计算电话账单
}

public double calculate(GasBill bill) {
//计算燃气账单
}

所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。
...全文
427 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
ben512 2004-09-23
  • 打赏
  • 举报
回复
前几篇看得挺爽,这篇有点迷糊。
继续努力学习!!!!!
chesterwoo 2004-09-14
  • 打赏
  • 举报
回复
我想如果假设程序设计非常完善,有些特性可能就用不到了,但随着程序功能的膨胀,原有的结构不再适合,短时间内,最小的成本是修补。
如新增了一个子类型,但只能用非重载的方法来调用,instanceof在这个时候有它的用武之地。
dongdongmaster 2004-09-14
  • 打赏
  • 举报
回复
UP
qingdaolitao 2004-09-14
  • 打赏
  • 举报
回复
to andy100085(铁桶师傅:
你说的对,楼主calculate用的是重载,而不是多态,多态是在继承的类中重写接口或虚函数,重载是参数不同而已
heibai520 2004-09-13
  • 打赏
  • 举报
回复
UP
javafaq2004 2004-04-20
  • 打赏
  • 举报
回复
给用户扩充的接口:

package p;

public interface IM{
void mA();
}

系统操作代码:
package o;

public class Operate{
public void mA(){
Class c = Class.forName("test.CM");
Object o = c.newInstance();
if(o instanceof IM)
o.mA();
}
}

使用系统的代码:

package test;

import p;

public CM implements IM{}
flyxxxxx 2004-04-20
  • 打赏
  • 举报
回复
再来一例:
interface Product{
}
class ProductA implements Product{}
class ProductB implements Product{}
class Factory{
public Product getProduct(String s){
if(){
return new ProductA();
}
return new ProductB();
}
public void operation(Product pro){
if(pro instanceof ProductA){
ProductA a=(Product)pro;
}
else if(pro instanceof ProductA){
ProductB b=(Product)pro;
}
}
}
这是java中的工厂模式
allenmingchen 2004-04-20
  • 打赏
  • 举报
回复
好帖子啊
矜持的射手 2004-04-20
  • 打赏
  • 举报
回复
系列3到5呢

偶找不到了

帮下忙了!
矜持的射手 2004-04-20
  • 打赏
  • 举报
回复
好好学习,天天向上!!
game0ver12345 2004-04-20
  • 打赏
  • 举报
回复
使用instanceOf 的地方最好都改为isInstance() 因为instanceOf是静态的,isInstance()是动态的。
因为instanceOf不能实现如下功能。

Class c = Class.forName("XXXXXXXXXXX") ;

if (c.isInstance(a))
{
System.out.println("True") ;
}
allenhe 2004-04-19
  • 打赏
  • 举报
回复
Schlemiel(维特根斯坦的扇子) ( )

还有一种情况:)
那就是重写equals()(当然还有hashcode,不过不在此讨论范围内)

为了多废话一下,举个例子
假设A class有一个key:int id
并且认为id相等的时候那这两个例子相等
那么在equals()里面做类型转换之前要instanceof一下

推而广之,向下转换类型instanceof是不可少的
至于为什么要用向下转换这种不太好的形式呢
我觉得
1。并不是任何事物都是完美的树状结构
2。并不是所有的jar包都是自己写的(对于大部分需要扩展功能的类而言更是如此)
新来的萌新 2004-04-19
  • 打赏
  • 举报
回复
为什么不把public double calculate()做成接口,
然后PhoneBill,GasBill 分别实现,
你在调用public double calculate(Bill bill)的时候,肯定要上塑造型的
直接PhoneBill.calculate()不就得了?
楼住能说说这么做得好处么?
game0ver12345 2004-04-19
  • 打赏
  • 举报
回复
基本上instanceOf 不要用,就算不得已要用,最好还是用Class.isInstance(Object obj); 道理我暂时想不到怎样表达。
yellowzhong 2004-04-19
  • 打赏
  • 举报
回复
up
gyn1978 2004-04-19
  • 打赏
  • 举报
回复
instanceof 在我们的程序中使用的越少越好,最好是不用,所有的要使用它的地方都可以用接口代替
wwoowwoo 2004-04-19
  • 打赏
  • 举报
回复
老大:
你讲得很好,我只有一个字送给你! “顶”。
小生还是初学,以后请多多关照;
小生有礼了先
casemy 2004-04-16
  • 打赏
  • 举报
回复
不过我想在jvm 里面应该使用instanceof操作符来判断多态的!

是真的么?
moonboy1980 2004-04-16
  • 打赏
  • 举报
回复
有没有这中情况:当判断是所属不同的类的时候,如果是不同的类的话我就 去做不同的事情,当然这个不同的事情是说不能用同一个方法名的方法去实现的,那么怎么用多态,是不是用instanceof就比较合适呢?
popmailzjw 2004-04-16
  • 打赏
  • 举报
回复
老大,多搞些这样的东西吧
加载更多回复(17)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧