面向对象_03_多态

**何为多态呢?简单点:为了让程序简单,扩展性更强,over~
   多态:可以理解为事物的多种体现形式。
  比如:
动物:猫,狗
猫   x=new 猫();
动物 x=new 猫();(多态的体现,一个对象有2种以上的形态)
  那人也如此:
人:男人,女人
男人 x=new 男人();
人   x=new 男人();(一样的,你既是男人也是人吧,多态~)
 
1.多态的体现
  父类的引用指向了自己的子类对象,父类的引用也可以接受自己的子类对象
2.多态的前提
  1、必须是类与类之间有关系,要么继承,要么实现。2、通常还有个前提,存在覆盖
3.多态的优势
  多态的出现提高了程序的扩展性
4.多态的弊端
  只能使用父类的引用访问父类中的成员
5.多态的应用
6.多态在代码中的特点(多态使用的注意事项)
 
下面有一例子可以说明多态的感觉:
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  Pig extends  Animal 
{ 
    void  eat() 
    { 
        System.out.println("饲料"); 
    } 
    void  gongDi() 
    { 
        System.out.println("拱地"); 
  } 
} 
class  DuoTaiDemo 
{ 
    public  static void  main(String[] args) 
    { 
//     Cat c = new Cat(); 
//     c.eat(); 
//     c.catchMouse(); 
       Animal a = new   Cat(); //自动类型提升,猫对象提升了动物类型。但是特有功能无法s访问。 
                          //作用就是限制对特有功能的访问。 
                          //专业讲:向上转型。将子类型隐藏。就不用使用子类的特有方法。 
//     a.eat(); 
        //如果还想用具体动物猫的特有功能。 
        //你可以将该对象进行向下转型。 
//     Cat c = (Cat)a;//向下转型的目的是为了使用子类中的特有方法。 
//     c.eat(); 
//     c.catchMouse(); 
/*      注意:千万不要出现一种操作,就是将父类对象转成子类类型。比如:
        Animal a=new Animal();
        cat c=(Cat)a;    像这样就挂了,动物不能被强制为猫
       所以,我们能转换的是父类引用指向了自己的子类对象时,该引用可以被提升,也可以被强制转换
*/
//     注意:对于转型,自始自终都是子类对象在做着类型的变化。 
//     Animal a1 = new Dog(); 
//     Cat c1 = (Cat)a1;//ClassCastException(这个错误的意思就是,这狗不能转换成猫,要不就逆天了)
        /* 
       Cat c = new Cat(); 
//     Dog d = new Dog(); 
//     c.eat(); 
       method(c); 
//     method(d); 
//     method(new Pig()); 
        */ 
       method(new   Dog()); 
    } 
    public  static void  method(Animal a)//这就相当于这个,Animal a = new Dog(); 
    { 
       a.eat(); 
 if (a instanceof Cat)//instanceof:用于判断对象的具体类型。只能用于引用数据类型判断 
                     //通常在向下转型前用于健壮性的判断。 
       { 
          Cat c = (Cat)a; 
          c.catchMouse(); 
       } 
       else if (a instanceof Dog) 
       { 
          Dog d = (Dog)a; 
          d.lookHome(); 
       } 
       else 
       { 
       } 
    } 
    /* 
   public static void method(Cat c) 
    { 
       c.eat(); 
    } 
   public static void method(Dog d) 
    { 
    } 
    */ 
} 
 
多态时,成员变量,静态函数,成员函数的变化:
1,成员变量。 
   编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。 
   运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。 
   简单说:编译和运行都参考等号的左边。哦了。 
   作为了解。 
2,成员函数(非静态)。 
   编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。 
   运行时:参考的是对象所属的类中是否有调用的函数。 
   简单说:编译看左边,运行看右边。 
    因为成员函数存在覆盖特性。 

3,静态函数。         编译时:参考引用型变量所属的类中的是否有调用的静态方法。         运行时:参考引用型变量所属的类中的是否有调用的静态方法。         简单说,编译和运行都看左边。         其实对于静态方法,是不需要对象的。直接用类名调用即可。 */

class  Fu { // int num = 3;     void  show()     {         System.out.println("fu show");     }

    static  void method()     {         System.out.println("fu static method");     } }

class  Zi extends  Fu { // int num = 4;     void  show()     {         System.out.println("zi show");     }

    static  void method()     {         System.out.println("zi static method");     } }

class   DuoTaiDemo3 {     public  static  void main(String[] args)     {         Fu.method();         Zi.method();         Fu f = new  Zi();// //      f.method(); //      f.show(); //      System.out.println(f.num);

//      Zi z = new Zi();

//     System.out.println(z.num); 
    } 
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值