多态的前提:
a.类与类之间必须有关系,要么继承(extends),要么实现(implement)。
b.要有重写
c.父类的引用指向子类对象
使用多态的好处,如果一个对象它有很多的行为,如果不使用多态就需要写很多方法,使用多态的话你只需要使用一个方法就可以了。
就像我们的打印机,有黑白打印机和彩色打印机,打印效果不同
public class Armor {
String name;
int price;
public void buy(){
System.out.println("购买");
}
public void effect(){
System.out.println("吃了长胖");
}
public static void main(String[] args) {
Armor a1=new LifePoint();
Armor a2=new MrPoint();
System.out.println("a1是Armor类型,执行effect()方法");
a1.effect();
System.out.println("a2也是Armor类型,执行effect()方法");
a2.effect();
}
}
public class MrPoint extends Armor {
@Override
public void effect() {
System.out.println("吃了减肥");
}
}
public class LifePoint extends Armor{
@Override
public void effect() {
System.out.println("物品使用后的效果");
}
}
虽然实例a1和a2都是Armor类的,调用方法也一样,但是打印效果不一样
a1是Armor类型,执行effect()方法
物品使用后的效果
a2也是Armor类型,执行effect()方法
吃了减肥
要理解多态性,首先要知道什么是“向上转型”。
我定义了一个子类Cat,它继承了Animal类,那么后者就是前者的父类。我可以通过
Cat c = new Cat(); 例化一个Cat的对象,这个不难理解。
但当我这样定义时: Animal a = new Cat();
这代表什么意思呢?
很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。所以,
父类引用只能调用父类中存在的方法和属性,不能调用子类的扩展部分;因为父类引用指向的是堆中子类对象继承的父类;(但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。)
同时,父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。