java 多态 (知识点不完整)

1.多态的条件

  1.要有继承

  2.方法重写

  3.父类引用指向子类对象


多态中成员访问

  1.   访问成员变量:  编译看左边,运行也看左边

    f.num = 10 

    因为这里是父类的,看是父类Father

 1 main{
 2   Father  f = new Son( )
 3   System.out.println( f.num);
 4 }
 5 
 6 
 7 class Father {
 8     int num = 10;}
 9 
10 class Son extends Father {
11     int num = 20;}

  2.访问成员方法: 编译看左边,运行看右边( 子类 ) 。 动态绑定

  3.访问静态成员方法: 编译看左边,运行看左边( 父类 )

    静态和类相关,算不上重写,所以,还是和左边的父类

    因为静态是属于类的,由实例共享,所以只看当前引用变量所属的类中的静态方法。

 

 1 class Demo4_Animal {
 2     public static void main(String[] args) {
 3         //Cat c1 = new Cat();
 4         //c1.eat();
 5         method(new Cat());
 6         method(new Dog());
 7 
 8         //Animal a = new Cat();   开发的是很少在创建对象的时候用父类引用指向子类对象,直接创建子类对象更方便,可以使用子类中的特有属性和行为
 9     }
10     
11     //Cat c = new Dog();狗是一只猫,这是错误的
12     /*public static void method(Cat c) {            
13         c.eat();
14     }
15 
16     public static void method(Dog d) {
17         d.eat();
18     }*/
19     
20     //如果把狗强转成猫就会出现类型转换异常,ClassCastException
21     public static void method(Animal a) {    //当作参数的时候用多态最好,因为扩展性强
22         //关键字 instanceof 判断前边的引用是否是后边的数据类型
23         if (a instanceof Cat) {
24             Cat c = (Cat)a;
25             c.eat();
26             c.catchMouse();
27         }else if (a instanceof Dog) {
28             Dog d = (Dog)a;
29             d.eat();
30             d.lookHome();
31         }else {
32             a.eat();
33         }
34     }
35 }
36 /*
37 * A:多态的好处
38     * a:提高了代码的维护性(继承保证)
39     * b:提高了代码的扩展性(由多态保证)
40 * B:案例演示
41     * 多态的好处
42     * 可以当作形式参数,可以接收任意子类对象
43 * C:多态的弊端
44     * 不能使用子类的特有属性和行为。
45 */
46 
47 class Animal {
48     public void eat() {
49         System.out.println("动物吃饭");
50     }
51 }
52 
53 class Cat extends Animal {
54     public void eat() {
55         System.out.println("猫吃鱼");
56     }
57 
58     public void catchMouse() {
59         System.out.println("抓老鼠");
60     }
61 }
62 
63 class Dog extends Animal {
64     public void eat() {
65         System.out.println("狗吃肉");
66     }
67 
68     public void lookHome() {
69         System.out.println("看家");
70     }
71 }
原文地址:https://www.cnblogs.com/gaoyang666/p/11097546.html