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

相关文章

来自专栏Janti

Java基础巩固——异常

  在Java程序运行时,常常会出现一些非正常的现象,这种情况称为运行错误。根据其性质可以分为错误和异常。

581
来自专栏java一日一条

Java 回顾 ( Revisiting Java )

最近在看一些工程代码,于是看了看设计模式,看设计模式之前发现Java是先修知识,又重新补了一遍Java,温故知新,获得一些新的体会。 本文不打算作为“Java知...

482
来自专栏每日一篇技术文章

Swift3.0 - 类和结构体的区别

结论: 在数据量比较大的排序中,结构体排序的速度比较慢,因为结构体是值类型,排序的时候,需要大量的赋值运算。而对象只需要交换地址即可。

491
来自专栏我是攻城师

使用JAVA反射的利与弊

3664
来自专栏一个会写诗的程序员的博客

Kotlin 简单优雅的高阶函数Kotlin 简单优雅的高阶函数《Kotlin极简教程》正式上架:1 . Kotlin 函数式编程: 函数的组合。一切皆是函数。2. 简单好用的 Kotlin 类型别名

函数代表一种关系 f 的蕴涵逻辑流。这种蕴涵逻辑流,其实就是映射(Mapping)。

763
来自专栏一个会写诗的程序员的博客

Java8 Lambda表达式.md什么是λ表达式λ表达式的类型λ表达式的使用其它相关概念

为了支持函数式编程,Java 8引入了Lambda表达式. 在Java 8中采用的是内部类来实现Lambda表达式.具体实现代码,可以通过debug看, 同时...

643
来自专栏移动开发面面观

Java学习笔记——对象的生死

1014
来自专栏Spark学习技巧

Scala语法基础之隐式转换

一,简介 从类型S到类型T的隐式转换由具有函数类型S => T的隐式值定义,或者通过可转换为该类型的值的隐式方法来定义。隐含转换适用于两种情况: 1),如果表达...

2059
来自专栏智能算法

极简Python入门

本文旨在帮助从总体上帮助了解Python的一些基本属性,具体的使用技巧需要通过不断实践积累 一、Python的基本特性 ? ? ? 二、Python的类 ...

2636
来自专栏抠抠空间

面向对象基础

1 class Person: #定义一个Person类;类名后面可以加括号,也可以不加。类名第一...

2556

扫描关注云+社区