黑马程序员技术交流社区
标题:
疑问
[打印本页]
作者:
杜佳瑞
时间:
2012-8-4 14:59
标题:
疑问
if(!(obj instanceof Person))//1
throw new ClassCastException();
Person p=(Person)obj;//2
instanceof的作用不就是判断左边的对象是不是右边类的实例?
那为什么还要有2这句强转呢,既然不一样就会抛出异常,那剩下的不就是一样的吗
作者:
贾成龙
时间:
2012-8-4 15:14
instanceof意思是obj属于Person这个对象吗?不属于就抛异常,
属于就将obj强转为person对象,这里强转是类型的提升,
比如动物和猫:猫属于动物,动物中有猫和其他动物所共有的功能和行为,猫只要继承了动物就会拥有动物里的功能,
如果你传入一个动物,要使用猫的特有功能,就要想把动物强转为猫才能使用。
instanceof的意思判断是否为某一个类。是属于 与 不属于 的关系!
作者:
杨康
时间:
2012-8-4 15:19
如果条件满足,则obj是Person的类型,如果不强转,Preson类中的特有方法,obj是不能调用的,所以如果不需要用到Person中的特有方法,可以不用强转,但是想要使用Person中的特有方法,不强转的话Object中没有该方法,编译会失败.
作者:
张雪磊
时间:
2012-8-4 15:26
把代码写全就知道怎么回事了
class Demo extends Object
{
private int num;
Demo(int num)
{
this.num = num;
}
public boolean equals(Object obj)//
Object obj = new Demo();
{
if(!(obj instanceof Demo))
return false;
Demo d = (Demo)obj;
return this.num == d.num;
}
/*
public boolean compare(Demo d)
{
return this.num==d.num;
}
*/
public String toString()
{
return "demo:"+num;
}
}
instanceof
的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。也可以用在继承中的子类的实例是否为父类的实现。也就是用在多态上。上面那个例子就是这样。他用父类的参数来接受子类的对象,相当于红色部分。
1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2,多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
3,多态的好处
多态的出现大大的提高程序的扩展性。
4,多态的弊端:
虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。
也就是说,你把一个Demo类或者说person类传进去,实际上是把person类向上提升成了Object类,但我们需要比较的或者要操作的是你真正传进来的对象,这时候需要把这个已经向上转型成Object的类重新向下转型。
作者:
杜佳瑞
时间:
2012-8-4 15:46
张雪磊 发表于 2012-8-4 15:26
把代码写全就知道怎么回事了
class Demo extends Object
{
obj 这个对象本来就是Demo这个类的对象啊,只是它使用了父类的引用。
难道这句Demo d = (Demo)obj;就是为了将引用强制转型吗?又是为了什么?这很迷糊,求解
作者:
牛杨
时间:
2012-8-4 16:26
这其实也算是java语言的规定吧,符合一般人类思维。
打个比方吧,比如一个军队在A这个地方现在想要到B这个地方,
那么军队会先派出个侦察兵侦查侦查能不能到B地方(也即 做下 这个判断 obj instanceof Person)
如果到不了 B地 那么整个军队就不去了;如果能到B地 那么这个军队就会去(也就相当于程序的 Person p=(Person)obj)
作者:
杜佳瑞
时间:
2012-8-4 22:12
问题已解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2