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

 

 
 
posted on 2017-08-24 17:34  我可不是隔壁的老王  阅读(125)  评论(0编辑  收藏  举报