首页 > 编程 > Java > 正文

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

2019-11-08 01:47:54
字体:
来源:转载
供稿:网友
多态(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;				      //强制转换	}    //如果两子类之间强转,就会出现类型转换异常,ClassCastException	public 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");	}}成员变量:

成员方法:

 

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

最终输出:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表