Java面向对象之多态

浅谈Java的多态性

1.什么是多态

多态按照字面意思来讲就是多种形态。多态是同一个行为具有多个不同表现形式或形态的能力。
就比如说吧,小张和小王都是人,猫和狗都是动物,汉堡和薯条都是食物一样,具体的事物都有不同的形态。
在java中也是同样的道理,比如说我的一个Person类,可以有Man和Woman两种不同形态的子类,这就是我理解的多态了。

2.多态的存在的必要条件

  • 继承
  • 重写
  • 父类引用指向子类对象

Java中的转型又分为向上转型和向下转型,下面我来依次介绍

3.Java多态的向上转型

向上转型,就是将子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。下面我将用具体例子来进行说明。
首先创建一个Animal动物类,里面有名字,出生年份两个属性,还有一个吃的方法。

public class Animal {
	
	public Animal() {
		
	}
	public Animal(int years, String name) {
		this.years = years;
		this.name = name;
	}

	private int years;
	private String name;

	public int getYears() {
		return years;
	}
	public void setYears(int years) {
		this.years = years;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void eat() {
		System.out.println("动物真香");
	}
}

为了严谨,我们再将其带参无参的构造和其对应属性的getter和setter方法加上。
之后我们再编写两个动物类的子类,大象类和老虎类,里面重写了动物类中的eat方法。

public class Elephant extends Animal {
	public void eat() {
		System.out.println("大象真香");
	}

}
public class Tiger extends Animal {
		public void eat() {
			System.out.println("老虎真香");
		}

}

之后我们编写测试类AnimalTest进行测试

public class AnimalTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Animal tiger = new Tiger();//子类Tiger转换为了父类
		Animal elephant = new Elephant();
		tiger.eat();
		elephant.eat();
		
	}

}



最终结果
在这里插入图片描述将老虎和大像对象转化为了动物类的对象,但是又根据其各自类调用了其各自的eat方法
向上转型的好处

  • 减少重复代码,使代码变得简洁。
  • 提高系统扩展性。

4.Java多态的向下转型

那如果想把我的Animal类型的tiger和elphant转换为他们各自的类型咋整?
那就将用到向下转型了。向下转型是把父类对象转为子类对象。
通过强制转换,将父类引用类型转为子类引用各类型。

Tiger tiger1 = (Tiger)tiger;//将原本为Animal类型的tiger转化为Tiger类型
Elephant elephant1 = (Elephant)elephant;
System.out.println(tiger1);
System.out.println(elephant1);

这样就称为向下转型

但是这里要注意:
向下转型的前提是父类对象指向的是子类对象(也就是说,在向下转型之前,它得先向上转型)
向下转型只能转型为本类对象(老虎是不能变成大象的)。

就比如说我想把elephant转化为Tiger类型的就是不行的了,因为elephant当初是通过Elephant类转化为了Animal父类,大象这个类和老虎类本来是没有关系的。

		Elephant elephant1 = (Elephant)tiger;

这样运行就会报错
在这里插入图片描述我们可以使用instanceof关键字用来测试一个对象是否为一个类的实例。
例如我们把代码修改成这样

		if(tiger instanceof Elephant)
		{
		Elephant elephant1 = (Elephant)tiger;
		}
		else {
			System.out.println("转不了啊");
		}

来判断tiger是否为大象类的实例。
最终的结果是
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值