1.什么是多态
同一方法可以根据发送对象的不同,采用多种不同的行为方式。
一种对象的实际类型是确定的。但是可以指向对象的引用的类型有很多。
2.多态的条件
- 存在继承关系
- 方法需要重写
- 父类引用指向子类对象
3.多态的理解
父类的引用指向子类的对象。需要注意的是,虽然指向的是子类的对象,但是如果出现子类存在,但父类不存在的方法,该对象是没有办法实现的。具体如下:
假设有三个类,分别为Animal类,Dog类,Cat类。后两类均继承Animal类。假设shout(叫喊)是所有动物都会的行为。
class Animal {//动物类
public void shout(){
System.out.println("动物可以叫");
}
}
class Cat extends Animal{//猫类
@Override
public void shout() {
System.out.println("喵喵喵");
}
public void sticky() {
System.out.println("猫会粘人");
}
}
class Dog extends Animal{//狗类
@Override
public void shout() {
System.out.println("汪汪汪");
}
}
public class demo {
public static void main(String[] args) {
Animal cat = new Cat();//父类的引用指向子类的对象(Cat子类)
Animal dog = new Dog();//父类的引用指向子类的对象(Dog子类)
//cat.sticky(); 会报错
cat.shout();//喵喵喵
dog.shout(); //汪汪汪
//同一类对象实现同名方法,出现不同的结果。
}
}
当对象cat实现Cat类的sticky方法时,程序报错。
多态的好处在于,使得同名方法需求不同,同一类的对象可以实现方法名相同但是具体的内容却不相同的情况。
4.为什么会有这样的效果呢?
Animal cat;//声明
Animal dog;//声明
当我们声明一个对象时,是存在栈里面的。它决定了这个对象会有哪些方法。比如声明一个Animal(动物)类的对象cat,只在栈里面存的是指向cat的引用(也就是地址)。因此,只声明了Animal的方法,并没有声明到Cat的所有方法。
cat = new Cat();实例化
dog = new Dog();
当我们实例化这个类时,也就new这个类后,在堆中开辟出来一个Cat类的内容。但是由于上述栈中只有Animal的方法,因此,cat对象不能使用Animal类有的,但是Cat类独有的方法。