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 条评论
登录 后参与评论

相关文章

来自专栏函数式编程语言及工具

Scalaz(27)- Inference & Unapply :类型的推导和匹配

 经过一段时间的摸索,用scala进行函数式编程的过程对我来说就好像是想着法儿如何将函数的款式对齐以及如何正确地匹配类型,真正是一种全新的体验,但好像有点太偏...

2078
来自专栏Spark学习技巧

大数据基础系列之JAVA引用详解

一,四种引用介绍 从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员...

2547
来自专栏恰同学骚年

你必须知道的指针基础-7.void指针与函数指针

  void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。和用int表示指针异曲同工,只是更明确是“指针”。

2272
来自专栏函数式编程语言及工具

泛函编程(1)-泛函编程是如何实现的

  泛函编程就是把函数组合起来形成一个完整的程序。可想而知,函数组合的过程可以是曲折的,形成的程序可以是复杂的。那么泛函编程又是如何保证一个复杂的函数组合程序是...

2277
来自专栏菜鸟前端工程师

JavaScript学习笔记023-对象方法0包装对象0静态属性

1042
来自专栏blackheart的专栏

[C#3] 1-扩展方法

1.从DEMO开始 先看一个扩展方法的例子: 1 class Program 2 { 3 public static void Main(...

21610
来自专栏趣谈编程

Unicode与UTF-8的区别

要弄清Unicode与UTF-8的关系,我们还得从他们的来源说起,下来我们从刚开始的编码说起,直到Unicode的出现,我们就会感觉到他们之间的关系

1242
来自专栏醒者呆

大师的小玩具——泛型精解

掌握Java的泛型,这一篇文章足够了。 关键字:泛型,Iterable接口,斐波那契数列,匿名内部类,枚举,反射,可变参数列表,Set 一般类和方...

4265
来自专栏黑泽君的专栏

HashSet集合的add()方法的源码解析

1712
来自专栏函数式编程语言及工具

Scalaz(12)- Monad:再述述flatMap,顺便了解MonadPlus

  在前面的几篇讨论里我们初步对FP有了些少了解:FP嘛,不就是F[A]吗?也是,FP就是在F[]壳子(context)内对程序的状态进行更改,也就是在F壳子(...

1937

扫码关注云+社区

领取腾讯云代金券