前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 面向对象三大特征之一: 多态

Java 面向对象三大特征之一: 多态

作者头像
房上的猫
发布2018-03-14 12:48:14
7230
发布2018-03-14 12:48:14
举报
文章被收录于专栏:个人随笔个人随笔

多态与类型转换

子类重写父类方法  1)位置:子类和父类中有同名的方法  2)方法名相同,返回类型和修饰符相同,参数列表相同        方法体不同

多态的优势和应用场合  多态:同一个引用类型,使用不同的实例而执行不同的操作  实现多态的两种形式  1.使用父类作为方法形参实现多态  2.使用父类作为方法返回值实现多态

形式1.1:父类做形参      子类做实参 形式1.2:父类做类型         子类实例化      (数据类型中的自动类型转换) 形式2.1:父类作为方法的返回值  子类实例化,类型自动转换

 生活中的多态:     打印机   结论:   同一事物,由于条件不同,产生的结果也不同

 多态实现思路:   编写父类   编写子类,子类重写父类方法   运行时,使用父类的类型,子类的对象(自动类型转换)

 优势:

把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。   赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。   举个例子:从一个基类中派生,响应一个虚命令,产生不同的结果。   比如从某个基类继承出多个对象,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子对象中的任何一个可以赋给其基类的对象,这样其基类的对象就可以执行不同的操作了。实际上你是在通过其基类来访问其子对象的,你要做的就是一个赋值操作。   使用继承性的结果就是可以创建一个类的家族,在认识这个类的家族时,就是把导出类的对象当作基类的的对象,这种认识又叫作upcasting。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,因为编译器会自动就找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamic binding)。   简单的说,建立一个父类的变量,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个变量调用这个函数的时候,定义这个变量的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用。

多态的终极目标:为了实现统一调用

   ■多态可以减少类中代码量    ·可以提高代码的可扩展性和可维护性    ■向上转型一子类转换为父类,    ·自动进行类型转换    ■向下转型一父类转换为子类,    ·结合instanceof运算符进行强制类型转换

 注:方法重载也是多态的一种体现

栗子:

代码语言:javascript
复制
/**
 * 
 */
package bdqn.javademos;
/**
 * 
 * @author: 房上的猫
 * 
 * @time: 下午3:51:59
 * 
 * 博客地址: https://www.cnblogs.com/lsy131479/
 *
 */
/**
 * @author xjz
 *父类 宠物类
 */
public class Pet {
   public void eat(){
       System.out.println("pet正在吃");
   }
}
代码语言:javascript
复制
/**
 * 
 */
package bdqn.javademos;
/**
 * 
 * @author: 房上的猫
 * 
 * @time: 下午3:51:59
 * 
 * 博客地址: https://www.cnblogs.com/lsy131479/
 *
 */
/**
 * @author xjz
 *
 */
public class Cat extends Pet {
    public void eat(){
        System.out.println("猫吃猫粮");
    }
    
    public void ball(){
        System.out.println("猫玩球");
    }
}
代码语言:javascript
复制
/**
 * 
 */
package bdqn.javademos;

/**
 * @author xjz
 *子类:狗狗类
 */
public class Dog extends Pet{
  public void eat(){
      System.out.println("狗狗吃狗粮");
  }
  
  public void catchFlyDisk(){
      System.out.println("狗狗玩飞盘");
  }
}
代码语言:javascript
复制
/**
 * 
 */
package bdqn.javademos;

/**
 * @author xjz
 *企鹅类
 */
public class Penguin  extends Pet{
   public void eat(){
       System.out.println("企鹅吃鱼");
   }
   
   public void swiming(){
       System.out.println("企鹅游泳");
   }
}
代码语言:javascript
复制
/**
 * 
 */
package bdqn.javademos;

/**
 * @author xjz
 *主人类 
 */
public class Master {
    
       public void feed(Pet pet){
           pet.eat();
       }
      
   //领养宠物 多态形式3:父类作为方法返回值,子类实例化  类型自动转换
       public Pet getPet(int typeid){
           Pet pet=null;
           if(typeid==1){
                pet=new Dog();
           }
           else if(typeid==2){
                pet=new Penguin();
           }
           else if(typeid==3)
           {
                pet=new Cat();
           }
           return pet;
       }
   
   
}
代码语言:javascript
复制
package bdqn.javademos;

import java.util.Scanner;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //多态的形式1
        Dog dog=new Dog();
        
        Penguin peng=new Penguin();
        
        Cat cat=new Cat();
        Master ms=new Master();
        ms.feed(dog);
        ms.feed(peng);
        ms.feed(cat);
        
        //多态的形式2:父类做类型,子类实例化
        Pet pet=new Dog();//自动转换
        pet.eat();
        
        //调用领养宠物 形式3:父类作为方法的返回类型
        System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅  3-猫) ");
        Scanner input=new Scanner(System.in);
        int xz=input.nextInt();
        Master dx=new Master();
        Pet pets=dx.getPet(xz); 
        pets.eat();
        
        

    }

}

instanceof运算符的使用

 作用:用来判断一个对象是否属于一个类或者实现一个接口

 类型转换比较      1. 子类转换父类    向上转型    自动转换      2. 父类转换子类    向下转型    使用isntanceof用作比较判定    子类 对象名 = (子类)父类;    使用子类对象

栗子:

代码语言:javascript
复制
/**
 * 
 */
package bdqn.javademos;

/**
 * @author xjz
 *父类 宠物类
 */
public class Pet {
   public void eat(){
       System.out.println("pet正在吃");
   }
}
代码语言:javascript
复制
/**
 * 
 */
package bdqn.javademos;

/**
 * @author xjz
 *
 */
public class Cat extends Pet {
    public void eat(){
        System.out.println("猫吃猫粮");
    }
    
    public void ball(){
        System.out.println("猫玩球");
    }
}
代码语言:javascript
复制
/**
 * 
 */
package bdqn.javademos;

/**
 * @author xjz
 *子类:狗狗类
 */
public class Dog extends Pet{
  public void eat(){
      System.out.println("狗狗吃狗粮");
  }
  
  public void catchFlyDisk(){
      System.out.println("狗狗玩飞盘");
  }
}
代码语言:javascript
复制
/**
 * 
 */
package bdqn.javademos;

/**
 * @author xjz
 *企鹅类
 */
public class Penguin  extends Pet{
   public void eat(){
       System.out.println("企鹅吃鱼");
   }
   
   public void swiming(){
       System.out.println("企鹅游泳");
   }
}
代码语言:javascript
复制
/**
 * 
 */
package bdqn.javademos;

/**
 * @author xjz
 *主人类 
 */
public class Master {
    
       public void feed(Pet pet){
           pet.eat();
       }
      
   //领养宠物 多态形式3:父类作为方法返回值,子类实例化  类型自动转换
       public Pet getPet(int typeid){
           Pet pet=null;
           if(typeid==1){
                pet=new Dog();
           }
           else if(typeid==2){
                pet=new Penguin();
           }
           else if(typeid==3)
           {
                pet=new Cat();
           }
           return pet;
       }
   //主人和宠物玩耍的行为
       public void play(Pet pet){
           if (pet instanceof Dog) {
                Dog dog=(Dog)pet;//向下转型
                dog.catchFlyDisk();
        }else if(pet instanceof Penguin){
              Penguin peng=(Penguin)pet;
              peng.swiming();
        }else  if(pet instanceof Cat){
            Cat cat=(Cat)pet;
            cat.ball();
        }
           
           
           
       }
   
}
代码语言:javascript
复制
package bdqn.javademos;

import java.util.Scanner;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //多态的形式1
        Dog dog=new Dog();
        
        Penguin peng=new Penguin();
        
        Cat cat=new Cat();
        Master ms=new Master();
        ms.feed(dog);
        ms.feed(peng);
        ms.feed(cat);
        
        //多态的形式2:父类做类型,子类实例化
        Pet pet=new Dog();//自动转换
        pet.eat();
        
        //调用领养宠物 形式3:父类作为方法的返回类型
        System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅  3-猫) ");
        Scanner input=new Scanner(System.in);
        int xz=input.nextInt();
        Master dx=new Master();
        Pet pets=dx.getPet(xz); 
        pets.eat();
        
        dx.play(dog);

    }

}

(C) 房上的猫 。 保留所有权利。  https://www.cnblogs.com/lsy131479/

如需转载,请注明出处!!!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档