多态与类型转换

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

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

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

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

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

 优势:
   ■多态可以减少类中代码量
   ·可以提高代码的可扩展性和可维护性
   ■向上转型一子类转换为父类,
   ·自动进行类型转换
   ■向下转型一父类转换为子类,
   ·结合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("猫玩球");
    }
}

Cat类

/**
 *
 */
package bdqn.javademos;

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

  public void catchFlyDisk(){
      System.out.println("狗狗玩飞盘");
  }
}

Dog类

/**
 *
 */
package bdqn.javademos;

/**
 * @author xjz
 *企鹅类
 */
public class Penguin  extends Pet{
   public void eat(){
       System.out.println("企鹅吃鱼");
   }

   public void swiming(){
       System.out.println("企鹅游泳");
   }
}

Penguin 类

/**
 *
 */
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;
       }

}

Master 类

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("猫玩球");
    }
}

Cat 类

/**
 *
 */
package bdqn.javademos;

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

  public void catchFlyDisk(){
      System.out.println("狗狗玩飞盘");
  }
}

Dog 类

/**
 *
 */
package bdqn.javademos;

/**
 * @author xjz
 *企鹅类
 */
public class Penguin  extends Pet{
   public void eat(){
       System.out.println("企鹅吃鱼");
   }

   public void swiming(){
       System.out.println("企鹅游泳");
   }
}

Penguin 类

/**
 *
 */
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();
        }

       }

}

Master 类

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/

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

Java 面向对象三大特征之一: 多态的更多相关文章

  1. 封装继承多态-java面向对象三大特征

    第七章  封装和继承 一.面向对象的三大特征 封装.继承.多态 二.封装 将类的属性(字段)设置为私有的(private),并添加getter/setter方法操作属性. 注意:get|set方法的固 ...

  2. Java面向对象三大特征

    封装: 首先,属性可用来描述同一类事物的特征, 行为可描述一类事物可做的操作,封装就是要把属于同一类事物的共性(包括属性与行为)归到一个类中,以方便使用.比如人这个东东,可用下面的方式封装:人{ 年龄 ...

  3. 简述Java面向对象三大特征:封装、继承、多态

    封装: 把对象的全部属性和服务结合在一起,形成不可分割的独立单位: 尽可能隐藏内部细节.(数据隐藏.隐藏具体实现的细节)     public.private.protected.default pu ...

  4. 面向对象三大特征之多态——Java笔记(七)

    多态:     同一个实体同时具有多种形式     编译时的类型有声明该变量时使用的类型决定,运行时的类型有实际赋值给变量的对象决定     如果编译时类型和运行时类型不同,就出现多态 例: clas ...

  5. JAVA 面向对象 三大特征:继承

    什么是继承 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 多个类可以称为子类,单独这个类称为父类.超类或者基类. 子类可以直接访 ...

  6. Java面向对象三大特点之多态

    概念: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 多态性是对象多种表现形式的体现,同一个事件发生在不同的对象上会产生不同的结果. ...

  7. Java学习:面向对象三大特征:封装、继承、多态之封装性

    面向对象三大特征:封装.继承.多态. 封装性在Java当中的体现: 方法就是一种封装 关键字private也是一种封装 封装就是将一些细节信息隐藏起来,对于外界不可见. 问题描述:定义Person的年 ...

  8. JAVA的三大特征 封装继承多态- 简单总结

    简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...

  9. Java中面向对象三大特征

    也就是说在这里"人"是多态的, 在不同的形态时,特征行为是不一样的, 这里的"人", 同时有两种形态,一种是教师形态,一种是学生形态,所对应的特征行为分别是&q ...

随机推荐

  1. J.U.C JMM. pipeline.指令重排序,happen-before

    pipeline: 现在的CPU一般采用流水线方式来执行指令.一个指令执行周期被分成:取值,译码,执行,访存,写会,更新PC若干阶段.然后,多条指令可以同时存在于流水线中,同时被执行,来提高系统的吞吐 ...

  2. zTree中父节点禁用,子节点可以用

    参考学习网址:http://www.treejs.cn/v3/main.php#_zTreeInfo zTree中父节点禁用,子节点可以用 axios.get('/base/unit/unittree ...

  3. C语言知识点总结

    本文采用思维导图的方式撰写,更好的表述了各知识点之间的关系,方便大家理解和记忆.这个总结尚未包含C语言数据结构与算法部分,后续会陆续更新出来,文中有漏掉的知识点,还请大家多多指正.

  4. 使用vue 遇到的问题————— 解决手机实时显示项目

    Vue项目文件组织架构: src文件夹存放源代码. Static文件夹存放第三方静态资源.     git将项目上传github  http://blog.csdn.net/laozitianxia/ ...

  5. junit设计模式--命令者模式

    命令模式的意图 将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化: 对请求排队或记录请求日志,以及支持可撤销的操作: 命令模式告诉我们可以为一个操作生成一个对象并给出它的一个执行方法 ...

  6. CSS--开篇

    1,什么是CSS? 层叠样式表(Cascading Style Sheet ),定义了如何显示HTML元素,用来控制网页的样式和布局. 引入CSS后:HTML标记专门用于定义网页的内容,而使用CSS来 ...

  7. UTF8编码

    UTF-8是Unicode的实现方式之一. UTF-8最大的一个特点,就是它是一种变长的编码方式.它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度. UTF-8的编码规则很简单,只有二 ...

  8. android .9图片的制作

    android .9PNG图片制作 在android开发的过程中,我们经常因为没有好的美工图片失真,这样使界面看起来要逊色很多,有的时候可能我们会想在drawable-hdpi,ldpi,mdpi下放 ...

  9. XML (二)

    1 SAX 在使用DOM解析XML文档的时候,需要读取整个XML文档,在内存中构架代表整个DOM树的Document对象,从而再对XML文档进行操作.此种情况下,如果XML文档特别大,就会消耗计算机的 ...

  10. 主函数特别之处:public static void main(String[] args)

    public static void main(String[] args) public class Test_java {//主函数特殊之处 public static void main(Str ...