JAVA多态

本文详细介绍了Java中的多态概念,包括其作为面向对象三大特性之一的地位,以及多态在类继承中的体现。通过实例展示了多态成员变量和方法的特点,强调了多态在减少冗余代码和提高代码扩展性上的优势。最后,通过主人喂食猫和狗的案例,说明了多态在实际编程中的应用,展示了如何通过向上转型和向下转型实现灵活的类型转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多态的理解与运用

1.多态是继封装,继承之后,面对对象的第三大特性。

2.对多态的一些理解:

例如:现实事物通常会出现多种形态,猫是动物的一种,则一个具体的事物”渐层猫“既是猫,也是动物,即出现两种形态。java作为面向对象而言,同样可以描述一种事物的多种形态。如StepiseCat类继承了Cat类,一个Stepwise的对象既是Stepwise,也是Cat.

3.java中如何体现多态

父类型的变量可以引用子类型的对象,但是前提条件是必须要有子父类关系,在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。子类是父类的特殊化,每个子类都是其父亲的实例,但是反过来却不成立。例如:每个同学都是人对象,但是每一个人不一定都是同学对象。因此,总可以将子类的实例传给需要父类型的参数。

4.多态的定义与使用格式:  父类类型  变量名  =  new  子类类型();

5.多态是一个行为具有多个不同的表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同的操作。

二、多态中成员的特点

1.多态成员变量:编译运行看左边

例如:

Fu f=new Zi();

System.out.println(f.num);//f是Fu中的值,只能取到父中的值

2.多态成员方法:编译看左边,运行看右边

   Fu f1=new Zi();

   System.out.println(f1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。

三、多态的转型

向上转型:多态本身就是向上转型的过程

    使用格式: 父类类型  变量名   =  new  子类类型();

    使用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作

向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型

         使用格式:子类类型 变量名=(子类类型) 父类类型的变量;

         适用场景:当要使用子类特有功能时。

四:案例

1.an相当于一个引用(例子),但是他可以表示多种状态

 2.一个完整的实例:
场景假设:一个主人养了猫和狗,猫和狗都有自己爱吃的东西,主人在喂它们的时候,如果既要判断是猫还是狗,再判断他们分别爱吃什么,就显得很麻烦。如果主人养了很多种动物,这样的重复判断,就会浪费很多时间。有什么办法,能让主人拿到一种食物就知道这是哪种动物的,就好了。

1、一些类的定义:


public class Animal {
	int age;
	String name;
	
	public int getAge()	{
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}	
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	//动物类里面有叫和吃两个方法
	public void cry() {
		System.out.println("我不知道叫什么");
	}
	
	public void eat() {
		System.out.println("我不知道吃什么");
	}
}

class Dog extends Animal{
	//覆盖(重写)方法
	public void cry() {
		System.out.println("旺旺");
	}
	
	public void eat() {
		System.out.println("我爱吃骨头");
	}
}

class Cat extends Animal{
	//覆盖(重写)方法
	public void cry() {
		System.out.println("miaomiao");
	}
	
	public void eat() {
		System.out.println("我爱吃鱼");
	}
}

class Food{
	String name;
public class Animal {
	int age;
	String name;
	
	public int getAge()	{
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}	
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	//动物类里面有叫和吃两个方法
	public void cry() {
		System.out.println("我不知道叫什么");
	}
	
	public void eat() {
		System.out.println("我不知道吃什么");
	}
}

class Dog extends Animal{
	//覆盖(重写)方法
	public void cry() {
		System.out.println("旺旺");
	}
	
	public void eat() {
		System.out.println("我爱吃骨头");
	}
}

class Cat extends Animal{
	//覆盖(重写)方法
	public void cry() {
		System.out.println("miaomiao");
	}
	
	public void eat() {
		System.out.println("我爱吃鱼");
	}
}

class Food{
	String name;
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	// 食物类里面让它有一个方法
	public void showName() {
		
	}
}
//鱼(食物的一种)继承于食物
class Fish extends Food{
	public void showName() {
		System.out.println("食物: 鱼");
	}
}
//骨头(食物的一种)继承于食物
class Bone extends Food{
	public void showName() {
		System.out.println("食物: 骨头");
	}
}

//主人类 存在一种喂食方法
class Master{
	// 给动物喂食物,如果没有多态,他要写给猫喂食和给狗喂食两个方法
    // 有了多态,以后即使再来好多动物,用这一个函数就可以了
	public void feed(Animal an,Food f) {
		an.eat();
		f.showName();
	}
}

	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	// 食物类里面让它有一个方法
	public void showName() {
		
	}
}
//鱼(食物的一种)继承于食物
class Fish extends Food{
	public void showName() {
		System.out.println("食物: 鱼");
	}
}
//骨头(食物的一种)继承于食物
class Bone extends Food{
	public void showName() {
		System.out.println("食物: 骨头");
	}
}

//主人类 存在一种喂食方法
class Master{
	// 给动物喂食物,如果没有多态,他要写给猫喂食和给狗喂食两个方法
    // 有了多态,以后即使再来好多动物,用这一个函数就可以了
	public void feed(Animal an,Food f) {
		an.eat();
		f.showName();
	}
}

2.调试:


public class DuoTaiDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Master master = new Master();
		master.feed(new Dog(),new Bone());
		master.feed(new Cat(), new Fish());
	}

}

3.结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值