多态(Polymorphism)
1,概念
多种形态
水–放在不同的容器中,产生不同的形态
官方说:
-
接口的多种不同的实现方式即为多态。
Animal a = new Dog(); Animal b = new Cat(); Animal c = new Pig();
-
多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术。
-
我们在程序中定义的引用变量所指向的具体类型和通过该引用变量的方法调用在编程的时候并不确定,当处于运行期间才确定。就是这个引用变量究竟指向哪一个实例对象,在编译期间是不确定的,只有运行期才能确定,这样不用修改源码就可以把变量绑定到不同的类实例上,让程序拥有了多个运行状态,这就是多态。
说人话:
允许将子类类型的指针赋值给父类类型的指针,把不同的子类对象都当作父类来看。比如你家有亲属结婚了, 让你们家派个人来参加婚礼,邀请函写的是让你爸来,但是实际上你去了,或者你妹妹去了,这都是可以的, 因为你们代表的是你爸,但是在你们去之前他们也不知道谁会去,只知道是你们家的人。可能是你爸爸,可能 是你们家的其他人代表你爸参加。这就是多态。
多态又分为 编译时多态和运行时多态。
编译时多态:比如重载
运行时多态:比如重写
重载式多态,也叫编译时多态。也就是说这种多态再编译时已经确定好了。重载大家都知道,方法名相同而参数列表不同的一组方法就是重载。在调用这种重载的方法时,通过传入不同的参数最后得到不同的结果。
重写式多态,也叫运行时多态。这种多态通过动态绑定(dynamic binding)技术来实现,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也就是说,只有程序运行起来,你才知道调用的是哪个子类的方法。 这种多态通过函数的重写以及向上转型来实现。
2,多态的使用
形成多态的必要条件
1,要有关系–继承
2,要有方法重写–重写式多态
3,要有向上转型–父类的引用指向子类的对象
public class Animal {
public void eat(){
System.out.println("animal eatting...");
}
}
public class Cat extends Animal{
public void eat(){
System.out.println("我吃鱼");
}
}
public class Dog extends Animal{
public void eat(){
System.out.println("我吃骨头");
}
public void run(){
System.out.println("我会跑");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Cat(); //向上转型 指向 指针
animal.eat();
Cat cat = (Cat)animal; //向下转型
int 4 double 8
int a = 1;
double d = a;
int c = d;
animal = new Dog();
animal.eat();
}
}