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 }