黑马程序员技术交流社区
标题:
多态问题迷惑
[打印本页]
作者:
何家旺
时间:
2013-1-25 16:20
标题:
多态问题迷惑
本帖最后由 以计盛 于 2013-1-25 22:56 编辑
abstract class Animal
{
abstract void eat();
}
class Cat extends Animal
{
public void eat()
{
System.out.println("吃鱼");
}
public void catchMouse()
{
System.out.println("抓老鼠");
}
}
class jh
{
public static void main(String[] args)
{
Animal a = new Cat();
a.eat();
//a.catchMouse();
//Cat c=(Cat)a;
//c.catchMouse();
}
}
为什么不能直接调用Cat里面的catchMouse()方法,有点疑惑!
作者:
黄锦成
时间:
2013-1-25 16:27
Animal a = new Cat();
现在是父类引用指向子类对象,调用方法时,只能调用从父类中继承或实现的方法。如果要调用子类的特有方法,则要强转 Cat cat = (Cat)a;,我们知道了a实际上是Cat,这样子强转是没问题的。之后就可以调用了
cat.catchMouse();
作者:
高浩
时间:
2013-1-25 16:58
Animal a = new Cat();//父类引用指向了子类对象,那么该子类对象类型得到了提升,
如果要调用子类对象的特有方法,这时就需要,向下转型:Cat c=(Cat)a;
这样才能调用子类对象的特有方法。
作者:
梁俊
时间:
2013-1-25 17:04
多态调用的是子类的方法还是父类的方法
如果子类和父类有相同的方法,即子类重写了父类的方法,那么执行的方法是子类的。
即调用谁的方法,由实体对象类型来决定。能调用什么方法,由引用类型来决定。
向上转型后能调用的方法个数被引用类型限制
引用是遥控器,遥控器上有几个按键,那么就能调用几个方法。就算实体对象有很多方法,但如果遥控器只有一个按键,那就只能调用一个方法。
作者:
冷延冰
时间:
2013-1-25 22:37
其实楼主可以这么理解new的过程就是用引用给对象贴标签,而你是要Animal的标签贴给了cat。编译器就会认得Animal,它不知道是cat,你调用cat的方法肯定会出错。你必须明确告诉编译器:“调用吧,我保证就是cat”(cat)a.
作者:
黑马张旭
时间:
2013-1-25 23:04
比老师总结的已经很详细了
class DuoTaiDemo2
{
public static void main(String[] args)
{
//Animal a = new Cat();//类型提升。 向上转型。
//a.eat();
//如果想要调用猫的特有方法时,如何操作?
//强制将父类的引用。转成子类类型。向下转型。
///Cat c = (Cat)a;
//c.catchMouse();
//千万不要出现这样的操作,就是将父类对象转成子类类型。
//我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
//多态自始至终都是子类对象在做着变化。
// Animal a = new Animal();
// Cat c = (Cat)a;
/*
毕姥爷 x = new 毕老师();
x.讲课();
毕老师 y = (毕老师)x;
y.看电影();
*/
function(new Dog());
function(new Cat());
}
public static void function(Animal a)//Animal a = new Cat();
{
a.eat();
/*
if(a instanceof Animal)
{
System.out.println("haha");
}
else
*/
if(a instanceof Cat)
{
Cat c = (Cat)a;
c.catchMouse();
}
else if(a instanceof Dog)
{
Dog c = (Dog)a;
c.kanJia();
}
/*
instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型)
*/
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2