前言
- 本篇以Java初学者视角写下,难免有不足,或者术语不严谨之处。如有错误,欢迎评论区指正。
- 本篇说明多态相关的知识。
- 若本文无法解决您的问题,可以去最下方的参考文献出,找出想要的答案。
多态概念
多态(polymorphism):多种形态,具体是不同对象完成某个行为,它们的状态不同。
比如,同样是跑1000米,有些人气喘吁吁(我),还有一些大佬跑完气都不带喘的。
我认为多态是一种思想。而要理解多态得熟悉向上转型,和方法重写的知识。
多态分类
- 多态分为编译时多态和运行时多态:
- 编译时多态主要指方法的重载。
- 运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。
向上转型
字面意思:转型,类型转换;向上,即子类向超类(或者超类的超类等等)转换。
向上转型属于自动转换类型,不用强制类型转换运算符。
这里向上转型不一定是本身的父类,还可以是父类的父类,甚至祖先类(Object-Java父类),或者是接口。
如果采用向上转型,那么编译时期,Java编译器就会认为它就是这个类型,这意味着它只能调用父类的成员和方法,而它实际类型的方法成员无法使用。但是,若子类重写了父类的方法,那么在运行时它会根据实际类型调用方法,这就实现了多态。
public class Main {
public static void main(String[] args) {
Dog dog =Dog.Init("旺财",2);//这里采用的是静态工厂方法,不熟悉的可以看下面的参考文献阅读一下。
Animal animal = dog;//这里Dog类转换成了父类Animal
}
}
不熟悉的可以先跳过,这里只是为了代码的完整性放这儿/
//Dog.java
class Dog extends Animal{
public static Dog Init(String name,int age){
Dog dog = new Dog(name,age);
return dog;
}
public Dog(String name,int age){
super(name,age);
}
public Dog(){
}
@Override
public void eat() {
System.out.println(this.name+" 正在吃狗粮.......");
}
}
//Animal.java
class Animal {
String name;
int age;
public Animal(String name,int age){
this.name=name;
this.age =age;
}
public Animal(){
}
public static void fun(Animal animal){
animal.eat();
}
public void eat(