【Java—–多态详解】

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。【Java—–多态详解】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

多态的概念

多态是面向对象的三大特征之一,多态是指同一个对象在不同时刻表现出来的不同形态。

实现多态的条件

  • 有继承:必须要有子类继承父类的关系
  • 有方法重写:子类需要对父类中的一些方法进行重写
  • 有向上转型:向上转型也就是有父类引用指向子类对象,如Animal a=new cat(),cat是Animal的子类

多态的好处和弊端

好处:提高了程序的可扩展性和可维护性

具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作

弊端:不能使用子类的特有功能(可以通过转型来弥补这个弊端)

多态中的转型

向上转型:

父类引用指向子类对象,如:Animal a=new cat()

向上转型可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。

说明:向上转型时,子类对象当成父类对象,只能调用父类的功能,如果子类重写了父类中声明过的方法,方法体执行的就是子类重写过后的功能,但是此时对象是把自己看作是父类类型的,所以其他资源使用的还是父类类型的。

向下转型:

父类引用转为子类对象,如:cat c=(cat) a

向下转型时子类引用指向子类对象,但过程中必须要采取强制转型,是之前向上转型时的子类对象仍然想执行子类的特有功能,所以需要重新恢复子类对象

说明:向下转型是为了方便使用子类的特殊方法

多态的具体案例

多态的特点是编译看左边,执行看右边

//定义测试类
public class demo {
	public static void main(String[] args) {
		/*向上转型
		 父类引用指向子类对象*/
		Animal a=new Cat();
		a.eat();    //执行的是子类重写后的方法
		//a.catchMouse();会报错,因为是子类特有的方法
		/*向下转型
		 父类引用转为子类对象
		 */
		Cat c=(Cat)a;
		c.catchMouse();  //不再报错,可以调用

        //Dog类读者可自行尝试
	}
}

//定义动物类作为父类
public class Animal {
	private String name;
	private int age;
	public Animal() {
		
	}
	public Animal(String name,int age) {
		this.name=name;
		this.age=age;
	}
	public void setName(String name) {
		this.name=name;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		this.age=age;
	}
	public int getAge() {
		return age;
	}
	public void eat() {
		System.out.println("动物吃东西");
	}
}

//猫类继承动物类
public class Cat extends Animal {
	public Cat() {
		
	}
	public Cat(String name,int age) {
		super(name,age);
	}

    //重写了父类的eat方法
	public void eat() {
		System.out.println("猫吃鱼");
	}

    //自己特有的方法
	public void catchMouse() {
		System.out.println("猫抓老鼠");
	}
	
}

//狗类继承动物类
public class Dog extends Animal {
	public Dog() {
		
	}
	public Dog(String name,int age) {
		super(name,age);
	}

    //重写了父类的eat方法
	public void eat() {
		System.out.println("狗吃骨头");
	}

    //自己特有的方法
	public void lookDoor() {
		System.out.println("狗会看门");
	}
}

多态的应用

当以父类对象作为方法的参数时,可以在调用方法时传入上转型对象,子类对象

//定义测试类
public class demo {
	public static void main(String[] args) {
        animalOperate ao=new animalOperate();
        Animal a1=new Cat();
        Animal a2=new Dog();
        //传入上转型对象
        ao.useAnimal(a1);
        ao.useAnimal(a2);
        Cat c=new Cat();
        Dog d=new Dog();
        //传入子类对象
        ao.useAnimal(c);
        ao.useAnimal(d);
	}
}

//创建动物类作为父类
public class Animal {
	
	public void eat() {
		System.out.println("动物吃东西");
	}
}

//创建猫类继承动物类
public class Cat extends Animal {
	
	//重写了eat方法
	public void eat() {
		System.out.println("猫吃鱼");
	}
}

//创建狗类继承动物类
public class Dog extends Animal {
	
    //重写了eat方法
	public void eat() {
		System.out.println("狗吃骨头");
	}
}

//创建动物操作类
public class animalOperate {

	//该方法的参数是一个对象
    public void useAnimal(Animal a) {
		a.eat();
	}
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153951.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!