别样JAVA学习(五)继承上(0.3)多态

本文深入探讨了多态的概念,包括其定义、对象的多态性、转型以及多态的应用场景。通过具体代码实例,展示了如何利用多态提高程序的扩展性和灵活性。

多态

1、定义:

可以理解为事物存在的多种体现形态。

人:男人,女人

动物:猫,狗。

猫x=new 猫();

动物x=new猫();

多态我们强调的是多种形态的体现。

同一个函数名称体现形态不一样。


2、对象的多态性
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 Dog extends Animal
{
    public void eat()
    {
        System.out.println("吃骨头");
    }
    public void watHom()
    {
        System.out.println("看家");
    }
}
class Pig extends Animal
{
    public void eat()
    {
        System.out.println("饲料");
    }
    public void gongDi()
    {
        System.out.println("拱地");
    }
}
class DuoTaiDemo
{
    public static void main(String[] args)
    {
        //Cat c=new Cat();
        //c.eat();
        //Dog d=new Dog();
        //d.eat();
        /*
        Cat c=new Cat();
        fun(c);
        fun(new Dog());
        fun(new Pig());
        */
        //Animal c=new Cat();
        //c.eat();
        fun(new Pig());
        fun(new Dog());
    }
    public static void fun(Animal a)
    {
        a.eat();
    }
    /*
    public static void fun(Cat c)
    {
        c.eat();
    }
    public static void fun(Dog d)
    {
        d.eat();
    }
    public static void fun(Pig p)
    {
        p.eat();
    }
    */
}

3、转型:

类型提升引用到了动物类型当中。将子类转换成父类,向上转型。

如果想要调用猫的特有方法时,如何操作?

强制将父类的引用,转成子类类型。向下转型。

Cat c=(Cat)a;

c.catchMouse();

不可以这样

Animal a=new Animal();

Cat c=(Cat)a;

上面这个例子将动物强制转换成猫,千万不可将父类转成子类类型。

我们能转换的是父类应用指向了自己的子类对象时,该应用可以

被提升,也可以被强制转换。

多态自始自终都是子类对象在做着变化。


毕姥爷 x=new 毕老师();

x.讲课();

毕老师 y=(毕老师)x;

y.看电影();

    public static void main(String[] args)
    {
        Animal a=new Dog();
        fun(a);
        //a.eat();
        //想要调用猫的特有方法时,如何操作?
        //强制将父类的引用。转换成子类类型。向下转型。
        //Cat c=(Cat)a;
        //c.catchMouse();
        //千万不要出现这样的操作,就是将父类对象转成子类类型。
        //我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升
    }
    public static void fun(Animal a)
    {
        a.eat();
        if(a instanceof Cat)//判断传进来的是不是Cat类型
        {    
            Cat c=(Cat)a;
            c.catchMouse();
        }
        else if(a instanceof Dog)
        {
            Dog d=(Dog)a;
            d.kanjia();
        }
    }

4,多态的应用

我们对类型进行抽取,导致了多态的产生操作同一个大类型,

对大类型中的所有小类型都能进行操作。

/*
基础班学生:
        学习,睡觉
高级班学生:
        学习,睡觉
*/     
可以将这两类事物进行抽取。

abstract class Student
{
    public abstract void study();
    public void sleep()
    {
        System.out.println("躺着睡");
    }
}
class DoSome
{
    public  void doSome(Student stu)
    {
        stu.study();
        stu.sleep();
    }
}

class BaseStudent extends Student
{
    public void study()
    {
        System.out.println("base study");
    }
    public void sleep()
    {
        System.out.println("坐着睡");
    }
}
class AdvStudent extends Student
{
    public void study()
    {
        System.out.println("adv study");
    }
}

class DuoTaiDemo3
{
    public static void main(String[] args)
    {
        //BaseStudent bs=new BaseStudent();
        //bs.study();
        //bs.sleep();
        DoSome ds=new DoSome();
        ds.doSome(new BaseStudent());
        ds.doSome(new AdvStudent());
    }
}   




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值