浅谈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是否为大象类的实例。
最终的结果是