黑马程序员技术交流社区

标题: 关于面向对象的多态问题 [打印本页]

作者: 董将    时间: 2012-12-19 20:01
标题: 关于面向对象的多态问题
本帖最后由 董将 于 2012-12-22 19:42 编辑

今天在学习的过程中,遇到很多关于多态的问题,在这个地方有一些疑惑,请求大神指点?
多态的机制是什么?
最好来几个向上转型和向下转型的例子,附上代码最好,再次感谢
作者: 陈雪平    时间: 2012-12-19 20:07
1,多态的体现
        父类的引用指向了自己的子类对象。
        父类的引用也可以接收自己的子类对象。
2,多态的前提
        必须是类与类之间有关系。要么继承,要么实现。
        通常还有一个前提:存在覆盖。

3,多态的好处
        多态的出现大大的提高程序的扩展性。

4,多态的弊端:
        虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。

例子:

abstract class Animal
{
        abstract void eat();

}
class Cat extends Animal
{
        public void eat()
        {
                System.out.println("吃鱼");
        }
        public void catchMouse()
        {
                System.out.println("抓老鼠");
        }
}
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;
               
}

作者: 陈雪平    时间: 2012-12-19 20:08
上面的例子是毕老师视频里面的,楼主看看喽
作者: 高境    时间: 2012-12-19 20:14
方法的重写Overriding和重载Overloading是Java多态性的不同表现。
重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
多态就是父类的引用可以指向子类的对象。
public class polyTest extends demo
{       
public void run()       
{               
System.out.println("Son");       
}     
public static void main(String [] args )          
{      
demo de = new  polyTest();//这一行是关键也就是多态就是父类的引用可以指向子类的对象          
de.run();       
}
}
class demo
{       
public void run()       
{               
System.out.println("Father");       
}
}
作者: 董将    时间: 2012-12-19 20:16
陈雪平 发表于 2012-12-19 20:08
上面的例子是毕老师视频里面的,楼主看看喽

多谢多谢,我这现在就少多态的代码
作者: 杨雯雯    时间: 2012-12-20 11:12
一个关于多态的代码:
class Animal{//声明一个父类Animal
int weight,height;
//Animal中共有的eat()方法
void eat(){
System.out.println("animal eat");
}
//Animal中共有的sleep()方法
void sleep(){
System.out.println("animal sleep");
}
//Animal中共有的breathe()方法
void breathe(){
System.out.println("animal breathe");
}
}

class Fish extends Animal{
void breathe(){
System.out.println("fish breathe");
}
}

class Test {

static void fn(Animal an){
an.breathe();
}

public static void main(String [] args){
Fish fh=new Fish();
Animal an;
an=fh;
Test.fn(an);


}
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2