多态的详细介绍

多态:
   定义:某一类事物的多种存在形态
列:动物中 猫 狗;
    猫这这个对象对应的类型是猫类型;
          猫 a = new 猫();
    同时猫也是动物中的一种,也可以把猫称为动物;
        动物 b = new 猫();
    动物是猫和狗具体事物中抽取出来的父类型
       父类型引用指向子类型对象。

对象的多态性:
    class 动物{
    class 猫 extends 动物{}
    class 狗 extends 动物{}
        猫 a = new 猫();
        动物  b = new 猫();//一个对象两种形态
    猫这类事物即具备猫的形态又具备动物的形态,也就算对象的多态性;
    简单的说:就是一个对象对应着不同的类型;
    
多态在代码中的体现:
    父类或者接口的引用指向其子类对象
    
多态的好处:
    提高了代码的扩展性,前期定义的代码可以使用后期定义的内容;


    abstract class Animal{
        abstract void eat();

}

    class Dog extends Animal{

        void eat(){
    System.out.println("啃骨头");
    }
        void lookHome(){
    System.out.println("看家");
    }

}
    
    class Cat extends Animal{
            void eat(){
    System.out.println("吃鱼");
    }
    void catchMouse(){
    System.out.println("抓老鼠");
    }

}
    class DuoTaiDemo{

    public static void main(String[] args){
            
        Cat c = new Cat();
        Dog d = new Dog();
        Animal a = new Dog();
                method1(a);
        method1(c);
        method1(d);

    }

    public static viod method1(Animal a){
        a.eat();
        a.catchMouse();//编译报错,动物里没有抓老鼠的方法。
        
    }

}
《多态的弊端:
        前期定义的内容不能调用后期子类中特有的内容。
  多态的前提:
        1:必须有关系 :继承 实现 。
        2:要有覆盖。
》

    if(a instanceof Cat){
    Cat c = (Cat)a;
    c.catchMouse();
/*
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一

个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
用于判断对象的具体类型,只能用于引用数据类型判断,通常在向下转型前用于健壮性判断;
*/    

}

    Animal a = new Cat();//自动类型提升猫对象,提升了动物类型,但是特有的功能无法访问
                 //作用就是限制了对特有功能的访问;
                 //专业上讲:向上转型将子类型隐藏,就不使用子类的特有方法;
                 //如果还想使用具体动物猫的特有功能,可以将该对象进行向下转型;
                 //向下转型的目的是为了使用子类中的特有方法。
    a.eat();
    Cat c = (Cat)a;
    c.eat();
    c.catchMouse();


/*注意:对于转型,自始至终都是子类对象在做着类型的变化(如小猫转动物,小猫转小猫)

Animal an = new Dog();
Cat c = (Cat)an;
错误:报classCatException 类型转换异常

*/


class 毕姥爷{
         viod 讲课(){
    System.out.println("管理课");

    }
              viod 钓鱼(){
    System.out.println("钓鱼");

    }
}

class 毕老师 extends 毕姥爷{
         viod 讲课(){
    System.out.println("java");

    }
              viod 看电影(){
    System.out.println("无间道");

    }
}

class DuoTaiDemo{

public static void main(String[] args){
    //毕老师 b = new 毕老师();
    //   b.讲课();
    //   b.看电影();

    毕姥爷 bl = new 毕老师();
         bl.讲课();   -----------System.out.println("java");
         bl.钓鱼();   -----------System.out.println("钓鱼");
    //   bl.看电影();  错误

    }
}


多态时 成员的特点:

1,成团变量:
    
    编译时参考引用型变量所属的类中是否有调用的变量,有,编译通过;没有,编译失败;
    运行时参考引用型变量所属的类中是否有调用的变量,并运行该属性类中的成员变量;
    简单说:编译和运行都参考等号的左边。
2,成员函数:
    
    编译时参考引用型变量所属的类中是否有调用的函数,有,编译通过;没有,编译失败;
    运行时参考的是对象所属的类中是否有调用的函数;
    简单说:编译看左边,运行看右边。
3,静态函数:
    
    编译时参考引用型变量所属的类中是否有调用的静态方法;
    运行时参考引用型变量所属的类中是否有调用的静态方法;
    简单说:编译和运行都看左边。
        <!--静态方法是不需要对象的,直接类名调用即可-->

---------------------------------------
成员变量:
class Fu{

    int num = 3;
}
class Zi extends Fu{

    int num = 4;
}
class DuoTaiDemo{

public static void main(String[] args){    
    
    Fu f = new Zi();
    System.out.println(f.num);//运行结果等于3  编译和运行都看左边
    }
}
------------------------------------------
成员函数:
class Fu{
    
    void Show(){
   System.out.println("fu show");
    
    }
}

class Zi extends Fu{
    
    void Show(){
   System.out.println("zi show");
    
    }
}

public static void main(String[] args){    
    
    Fu f = new Zi();
    f.show();//运行结果等于"zi show"  编译看左边和运行看右边
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值