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

多态与类型转换

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

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

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

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

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

 优势:

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

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

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

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

栗子:

/**
 * 
 */
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正在吃");
   }
}
/**
 * 
 */
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("猫玩球");
    }
}
/**
 * 
 */
package bdqn.javademos;

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

/**
 * @author xjz
 *企鹅类
 */
public class Penguin  extends Pet{
   public void eat(){
       System.out.println("企鹅吃鱼");
   }
   
   public void swiming(){
       System.out.println("企鹅游泳");
   }
}
/**
 * 
 */
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;
       }
   
   
}
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用作比较判定    子类 对象名 = (子类)父类;    使用子类对象

栗子:

/**
 * 
 */
package bdqn.javademos;

/**
 * @author xjz
 *父类 宠物类
 */
public class Pet {
   public void eat(){
       System.out.println("pet正在吃");
   }
}
/**
 * 
 */
package bdqn.javademos;

/**
 * @author xjz
 *
 */
public class Cat extends Pet {
    public void eat(){
        System.out.println("猫吃猫粮");
    }
    
    public void ball(){
        System.out.println("猫玩球");
    }
}
/**
 * 
 */
package bdqn.javademos;

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

/**
 * @author xjz
 *企鹅类
 */
public class Penguin  extends Pet{
   public void eat(){
       System.out.println("企鹅吃鱼");
   }
   
   public void swiming(){
       System.out.println("企鹅游泳");
   }
}
/**
 * 
 */
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();
        }
           
           
           
       }
   
}
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/

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏陈树义

3.Java集合总结系列:Set接口及其实现

一、Set接口 Set 接口与 List 接口相比没有那么多操作方法,比如: 1、List 接口能直接设置或获取某个元素的值,而Set接口不能。 2、List ...

3765
来自专栏Java帮帮-微信公众号-技术文章全总结

第十九天 集合-Map接口容器工具类集合框架总结【悟空教程】

Map集合的特点,如是否可重复,是否有序仅作用在键上,如HashMap集合的键不得重复,值可以重复。

1183
来自专栏代码拾遗

​Java反射详解

反射的概念是软件可以在运行时,检查,分析,修改代码。例如:在Junit中,使用@Test注解等。 在Java中,通过反射可以在运行时检查字段,方法,类,接口,注...

1213
来自专栏mathor

2018年全国多校算法寒假训练营练习比赛(第二场)

 背包问题,只是特殊处理一下h为0和不为0的情况就行  若h=0,卡不了bug,就是正常的o-1背包  若h不等于0,可以卡bug,假设第i件武器是卡b...

1083
来自专栏LanceToBigData

JavaSE(八)集合之List

前面一篇的corejava讲的是集合的概述,这一篇我将详细的和大家讲解一下Collection下面的List、set、queue这三个子接口。希望大家能得到提升...

22810
来自专栏编程心路

自己动手实现Java中的StringBuffer类

在网上复习 Java 的基础知识,看到 String 和 StringBuffer 这里,简单的实现了下 StringBuffer 这个类,并对 String,...

903
来自专栏Java帮帮-微信公众号-技术文章全总结

第十七天 集合-Collection&增强for&迭代器【悟空教程】

出现意义:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。

932
来自专栏浪淘沙

利用Map统计字符串中字符出现的次数

631
来自专栏微信公众号:Java团长

Java集合类详解

上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollectio...

791
来自专栏java达人

java反射简明示例

Java反射在我们Java学习的过程中是非常重要的知识点。可能有些同学认为这个学习起来不容易理解,其实就我个人而言还是比较简单,学习起来也比较容...

1746

扫码关注云+社区