Java--多态(polymorphic),上下转型,多态好处弊端

来源:互联网 发布:idea怎么关联源码 编辑:程序博客网 时间:2024/06/06 18:11
多态(polymorphic):事物存在的多种形态
多态前提
   (1)要有继承关系
   (2)要有方法重写
   (3)要有父类引用指向子类对象
多态好处
   (1)提高了代码的维护性
   (2)提高了代码的扩展性
多态坏处

   不能使用子类的特有属性和行为


成员变量
     编译看左边(父类),运行看左边(父类)
成员方法
     编译看左边(父类),运行看右边(子类)
静态方法
     编译看左边(父类),运行看左边(父类);
     静态和类相关,算不上重写,因此访问还是左边的

只有非静态的成员方法,编译看左边,运行看右边

class Polymorphic{public static void main(String[] args){Cat c = new Cat();c.eat();Animal a = new Cat();           //父类引用指向子类对象,就是向上转型a.eat();// a.catchMouse();Cat c1 = (Cat)a;                //向下转型c1.catchMouse(); //多态提高扩展性animalEat(new Cat());          //一般在实际开发中创建对象时使用父类应用指向子类对象,直接创建子类对象更方便,可以使用子类中的特有属性和行为animalEat(new Dog());System.out.println("------------------------");Father f = new Son();//父类引用指向子类对象System.out.println(f.num);f.print();f.staticPrint();//相当于使用类名去调用System.out.println("------------------------");//基本数据类型自动类型提升和强制类型转换int i = 10;byte b = 20;// i = b;                         //自动类型提升// b = (byte)i;      //强制转换}    //如果两子类之间强转,就会出现类型转换异常,ClassCastExceptionpublic static void animalEat(Animal a){ //当做参数时使用多态最好,因为扩展性好a.eat();// a.catchMouse();            //不能使用子类的特有属性和行为//关键字 instanceof 判断前边的引用是否为后边的数据类型if (a instanceof Cat) {Cat c = (Cat)a;c.eat();c.catchMouse();}else if (a instanceof Dog) {Dog d = (Dog)a;d.eat();d.lookHome();}else{a.eat();}}}class Animal{public void eat(){System.out.println("动物吃饭");}}class Cat extends Animal{public void eat(){System.out.println("猫吃鱼");}public void catchMouse(){System.out.println("猫抓老鼠");}}class Dog extends Animal{public void eat(){System.out.println("狗吃肉");}public void lookHome(){System.out.println("狗看门");}}/*  成员变量     编译看左边(父类),运行看左边(父类)  成员方法     编译看左边(父类),运行看右边(子类)  静态方法     编译看左边(父类),运行看左边(父类);     静态和类相关,算不上重写,因此访问还是左边的  只有非静态的成员方法,编译看左边,运行看右边*/class Father{int num = 10;public void print(){System.out.println("Father");}public static void staticPrint(){System.out.println("static Father");}}class Son extends Father{int num = 20;public void print(){System.out.println("Son");}public static void staticPrint(){System.out.println("static Son");}}

成员变量:


成员方法:

 

父类不能调用子类的方法,报错:


最终输出:



1 0
原创粉丝点击