黑马程序员_Java基础[16]_多态1

来源:互联网 发布:真划算购物车源码 编辑:程序博客网 时间:2024/05/29 02:15
---------- android培训 、java培训、期待与您交流! ----------


【【多态】】

instanceof 
定义:某一种事物的多种存在形态

【【instanceof  关键字】】用于判断所属类型。


/*
 * 【【多态】】
 *    定义:某一种事物的多种存在形态
 * 人:男人、女人
 * 动物:猫、狗
 * 猫     x = new 猫;
 * 动物 x = new 猫;
 *
 * 多态强调对象上的体现,其实函数也体现出了。
 * 重点讲:对象的多态性。
 *
 * 围绕一下4点学习:
 * 1、多态的体现形式?
 *         父类的引用指向了自己的子类对象,这就是多态的体现。
 *         父类的引用也可以接收自己的子类对象。

 * 2、多态的前提?
 *         必须是类与类之间有关系,要么继续,要么实现。
 *         通常还有一个前提:存在覆盖。

 * 3、多态的好处?
 *         多态的出现,大大的提高了程序的扩展性
 * 4、多态的弊端:
 *         提高了扩展性,但只能使用父类的引用访问父类的成员。
 * 5、多态的应用?【请看Demo_Duotai3】
 * 6、多态出现在代码中的特点(多态使用的注意事项)【请看Demo_Duotai4】
 *
 */
/*
 * 需求:
 * 动物
 * 猫,狗
 */

package DayXuexi;
abstract class Animal{
    abstract void eat();
}
//猫
class Cat extends Animal{
    
    public void eat(){
        System.out.println("chi yu");
    }
    public void cathMouse(){
        System.out.println("zhua  mouse");
    }
}
//狗
class Dog extends Animal{
    public void eat(){
        System.out.println("chi gu tou");
    }
    public void kanHome(){
        System.out.println("kan Home");
    }
}


//猪
class Pig extends Animal{
    public void eat()
    {
        System.out.println("chi si liao");
    }
    public void gongDi(){
        System.out.println(" gong di");
    }
}

public class Demo_Duotai {
    public static void main(String []args){
        /*按照以往的逻辑,我们在这里想要这些东西吃东西,那么就得挨个new一次,并调用吃的方法。非常麻烦
         * 而多态的出现,则解决了这个复杂的代码:
         */
        //第一步:
        /*
        Animal a=new Cat();//[a]
        a.eat();
        Animal b=new Dog();
        b.eat();
        Animal c=new Pig();
        c.eat();
        */
        //继续优化:
        Function(new Cat());
        Function(new Dog());
        Function(new Pig());
        
        
        
    }
    public static void Function(Animal name){  //[b]  其实就是: Animal name=new Cat/Dog/Pig
        name.eat();
    }
    //否则每一个东西都要写这么一个方法进行重载,相比,多态提高了代码的扩展性。
    /*
    public static void Function(Cat c){  
        c.eat();
    }
    public static void Function(Dog d){  
        d.eat();
    }
    public static void Function(Pig p){  
        p.eat();
    }
     */
}
-------------------------------------------------------------------------------------------------------

package DayXuexi;
/*
 * 【【多态】】
 *    定义:某一种事物的多种存在形态    至始至终都是子类在做着变化。
     用多态1的例子来使用【特有方法】
 */
abstract class Animal2{
    abstract void eat();
}
//猫
class Cat2 extends Animal2{
    
    public void eat(){
        System.out.println("chi yu");
    }
    public void cathMouse(){
        System.out.println("zhua  mouse");
    }
}
//狗
class Dog2 extends Animal2{
    public void eat(){
        System.out.println("chi gu tou");
    }
    public void kanHome(){
        System.out.println("kan Home");
    }
}


//猪
class Pig2 extends Animal2{
    public void eat()
    {
        System.out.println("chi si liao");
    }
    public void gongDi(){
        System.out.println(" gong di");
    }
}

public class Demo_Duota2 {
    public static void main(String []args){
        //关键:
         Animal a=new Cat();//类型提升   这里把cat提升为Animal  也称为向上转型
         /*比如以前学习到的 byte=2; int x=b;  b就会被提升为int */
         a.eat();
        /*如果想要调用cat的特有方法时,如何操作*/
         //【强制】将父类的引用转成子类类型  【 向下转型】
         Cat c=(Cat)a;
        c.eat();
        c.cathMouse();
        /*这个时候,子类的两个方法都拥有了。


千万不要将父类对象转为子类类型。

正确的是将父类的应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换
当子类有限的时候可以用【mm】
【多态】至始至终都是子类对象在做着变化。
*/
    
        
        
    }
    public static void Function(Animal2 name){  //[b]  其实就是: Animal name=new Cat/Dog/Pig
        name.eat();
        /* 子类有限的时候才这么干。【mm】
        if(name instanceof Cat2){    
            Cat2 c= (Cat2)name;
        } else if(name instanceof Dog2){
            Dog2 d=(Dog2)name;
        } else if(name instanceof Pig2){
            Pig2 p=(Pig2)name;
        }
        */
    }

}




---------- android培训、 java培训、期待与您交流!----------
黑马官网: http://edu.csdn.net/heima
0 0
原创粉丝点击