本章内容(以下代码都在一个类里,上下能读懂):了解多态
多态:指的是同一个方法的调用,由于对象不同可能会有不同的行为。
* 要点:1.是指方法的多态,不是属性的多态
* 2.3个必要条件:继承,方法的重写,父类引用指向子类对象
* 3.父类引用指向子类对象后,用该父类引用调用子类重写的方法,
* 此时多态就出现了。
*
* 对象的转型:向上转型:父类引用指向子类对象,这个就是向上转型,是自动转型。
* 向下转型:父类转为子类,就是向下转型,是强制转型。
了解final
final:修饰变量:变常量,就是一旦赋值就不可改变
* 修饰方法:修饰后该方法不能被重写,但可以被重载
* 修饰类:修饰的类不能被继承
*/
比如类Math是被final修饰的,不能被继承,一继承就报错:
//class Test extends Math{
// 因为Math被final修饰,所以不能被继承
//}
为什么要使用多态?看下面代码
定义一个父类Animal,两个子类继承了父类并重写了父类的方法。
class Animal{
public void shout(){
System.out.println("叫一声");
}
}
class Dog extends Animal{
public void shout(){
System.out.println("汪汪");
}
}
class Cat extends Animal{
public void shout(){
System.out.println("喵喵");
}
}
按照以往的思路,我们想调用animal类的方法那么需要new一个类来调用,调用dog,cat类的方法也要new,那么这么很麻烦很繁琐,代码也不简洁,于是有了多态。
那么多态怎么用呢?必须满足三个条件,上面一开始也说了。以上代码已经满足前两个条件:继承,重写父类方法,那么下一步就是要父类引用指向子类对象:这个方法里传了一个animal类型的参数,调用了shout()这个方法
//下面这个方法可以实现多态,这样就不需要重载方法这么繁琐了
static void getAnimal(Animal a){
a.shout();
}
我们先调用下这个方法,看下结果
调用代码:以下代码中:Animal dog = new dog();这是因为dog是继承于animal类,按照通俗的话讲,狗也是动物啊。不过这个也涉及到一个转型的问题,子类向父类转型,是向上转型,小范围向大访问转型,是自动的。
Animal a = new Animal();
getAnimal(a);//调用了父类的方法
Animal dog = new Dog();
getAnimal(dog);//调用了子类dog的方法
Animal cat = new Cat();
getAnimal(cat);//调用了子类dog的方法
结果:
叫一声
汪汪
喵喵
那么我们发现,都是调用同一个方法,只是因为传入的参数不同,就发生了不同的行为,这就发生了多态了。
getAinaml(Animal a)这个方法中,参数就是父类引用,那么在调用的时候有时会传入子类的对象,这个就是父类引用指向子类对象,第三个必要条件满足了。