• OOP⑺


    1.多态和instanceof

    都是去买东西,但是根据我们给别人金额的不同,得到不同的结果!!!! 生活中的多态!
    
    操作是否一致?   一致!  都是买东西!
    什么不一样??
         01.消费金额不一样
         02.因为消费金额不一样   所以  得到的东西不一样
         
    程序中的多态:
        01.静态的多态     方法重载
        
        String     buySomething();
        String     buySomething(double money);
        String     buySomething(double money,String something);
       
        02.动态的多态
        
         Animal  是抽象类
         Animal x=new X(); 
         
         同一个引用类型,使用不同的对象实例,而执行不同的操作,从而得到一个不同的结果!
      
      如果X是Dog,等会执行eat()就是吃骨头;  
      如果X是Cat,等会执行eat()就是吃鱼;
      
      01.Dog和Cat都是动物!! ===》同一个引用类型
      02.一个Dog 一个Cat     ===》不同的对象实例
      03. 吃骨头     吃鱼            ===》不同的操作结果
      
      
    多态存在的必要条件:
    01.要有继承关系!                                    Dog和Cat   is a  动物        都是 extends  Animal
    02.子类要重写父类方法 !                              eat()是重写了父类的方法
    03.父类的引用指向了子类的对象!                        Animal x=new X();   X()子类的对象
      
      
    
    多态的实际应用场景:
    01.使用父类作为方法的参数!         
          
          我要买小动物!    buy(Animal)   buy(Dog)  对!
          
    02.使用父类作为方法的返回值!
       
        我要买小动物! 
         public   Animal   buy(Animal  animal){
    		         这个方法让我们返回一个Animal(动物)
    		        我们返回一个Cat 小猫咪  行吗?   行!!!
              return  new Cat();
         }
          
     **instanceof  判断某个对象 是否属于某个类型
       所有的对象  instanceof  Object  返回值都是true
    2.代码
    需求:
     01.创建Dog  Cat  Animal  三个类
     02.Dog  Cat 分别继承   Animal
     03.创建一个Master 主人类
     04.在Master中新增一个 给宠物喂食的方法,方法的参数是???Animal
     05.模拟主人给小动物 喂食的方法
     1 /**
     2  * 动物的抽象类
     3  */
     4 public abstract class Animal {
     5 
     6     /**
     7      * 所有动物的吃饭方法
     8      */
     9     public abstract void eat();
    10 
    11 }
    多态
    1 public class Cat extends Animal {
    2 
    3     @Override
    4     public void eat() {
    5         System.out.println("СèßäÔÚ³ÔÓã");
    6     }
    7 
    8 }
    多态
     1 public class Dog extends Animal {
     2 
     3     @Override
     4     public void eat() {
     5         System.out.println("小狗狗在啃骨头");
     6     }
     7 
     8     /**
     9      * 小狗狗特有的游泳的方法
    10      */
    11     public void swimming() {
    12         System.out.println("小狗狗在游泳");
    13     }
    14 
    15 }
    多态
     1 /**
     2  * 宠物的主人类
     3  */
     4 public class Master {
     5 
     6     /**
     7      * 给所有宠物喂食的方法
     8      * 有那么多小宠物?  喂谁???
     9      * 关键点:
    10      *  我们怎么知道  传递来的是 小猫咪还是小狗狗!!!
    11      *  
    12      *  instanceof  判断某个对象 是否属于某个类型
    13      *  所有的对象  instanceof  Object  返回值都是true
    14      */
    15     public void feed(Animal animal) {
    16         // animal.eat(); 那么子类中特有的方法我们无法访问
    17         if (animal instanceof Dog) {
    18             Dog dog = (Dog) animal;// 向下转型
    19             dog.eat();
    20             dog.swimming(); // 调用子类特有的方法
    21         } else if (animal instanceof Cat) {
    22             Cat cat = (Cat) animal;// 向下转型
    23             cat.eat();
    24         }
    25 
    26     }
    27 }
    多态
     1 import java.util.Scanner;
     2 
     3 public class AnimalTest {
     4 
     5     public static void main(String[] args) {
     6         // 实例化主人类
     7         Master master = new Master();
     8         System.out.println("请您选择需要喂食的宠物: 01.小猫咪   02.小狗狗");
     9         Scanner input = new Scanner(System.in);
    10         int choose = input.nextInt();
    11         // 创建一个动物 抽象类 不能被实例化 具体是哪个动物我们不知道
    12         Animal animal;
    13         switch (choose) {
    14         case 1: // 给小猫咪喂食
    15             animal = new Cat(); // 父类的引用指向了子类的对象
    16             master.feed(animal);
    17             break;
    18         case 2: // 给小狗狗喂食
    19             animal = new Dog();
    20             master.feed(animal);
    21             break;
    22         }
    23 
    24     }
    25 }
    多态

    3.面试题

    
    
     1 public class A {
     2     /**
     3      * ÏÂÃæÁ½¸ö·½·¨ÊÇÖØÔØ
     4      */
     5     public String show(D d) {
     6         return " A   AND  D";
     7     }
     8 
     9     public String show(A a) {
    10         return " A   AND  A";
    11     }
    12 
    13 }
    exam
    
    
     1 public class B extends A {
     2 
     3     /**
     4      * 下面两个方法是重载
     5      */
     6     public String show(B b) {
     7         return " B   AND  B";
     8     }
     9 
    10     /**
    11      *重写A类的方法
    12      */
    13     public String show(A a) {
    14         return " B   AND  A";
    15     }
    16 
    17 }
    exam
    1 public class C extends B {
    2 
    3 }
    exam
    1 public class D extends B {
    2 
    3 }
    exam
     1 public class TestExam {
     2 
     3     public static void main(String[] args) {
     4         A a1 = new A();
     5         A a2 = new B(); // 父类的引用指向了子类的对象
     6         B b = new B();
     7         C c = new C();
     8         D d = new D();
     9 
    10         System.out.println(a1.show(b)); // A AND A
    11         /**
    12          * a1是A类的对象!
    13          * 我们传递了一个C对象
    14          * C类继承B类 ,B类继承A类
    15          * 所以会执行 A类中的  show(A a)
    16          */
    17         System.out.println(a1.show(c)); // A AND A
    18         System.out.println(a1.show(d)); // A AND D
    19         /**
    20          * a2是父类的引用指向了子类的对象
    21          * a2.show(b)应该去A类中查询 show()并且参数是B类型的!
    22          * A类中没有参数为B的!
    23          * 但是有参数是B类父类的方法的!show(A a)!
    24          * 又因为子类B重写了A类的show(A a) 所以执行 B类的show(A a)
    25          */
    26         System.out.println(a2.show(b)); // B AND A
    27         System.out.println(a2.show(c)); // B AND A
    28         System.out.println(a2.show(d)); // A AND D
    29         System.out.println(b.show(b)); // B AND B
    30         System.out.println(b.show(c)); // B AND B
    31         /**
    32          * b确实是B类的对象!
    33          * 但是b.show(d)在B类中没有发现!
    34          * 这时候 会去父类中查询 有没有对应的show(d) 因为B类继承了A类
    35          * 所以说 A类中的 show(D d)  B类中也有!只不过在A类中!
    36          * A类中有就执行!否则就执行B类中的show(B b)  因为D类继承了B类
    37          */
    38         System.out.println(b.show(d)); // A AND D
    39 
    40     }
    41 
    42 }
    exam
     
     
  • 相关阅读:
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files/编译错误
    连接数据库配置 System.Data.Common.DbProviderFactory
    c# socket 发送邮件
    code first 数据迁移
    adb shell monkey
    汇编语言学习小总结
    zookeeper快速安装配置
    编译自己的Hadoop Eclipse插件
    在Windos上使用Eclipse进行Hadoop开发的环境搭建
    Hive安装配置以及整合HBase和hadoop
  • 原文地址:https://www.cnblogs.com/wwlw/p/7424228.html
Copyright © 2020-2023  润新知