介绍多态,需要先了解向上转型与方法的重写
一、向上转型(多态的前提)
1、概念
实际上就是创建一个子类对象,把它当做父类对象来使用。
就是常规写法是Cat cat = new Cat( );
现在写成 Animal animal = new Cat( );
2、语法
父类类型 对象名 = new 子类类型( );
eg. Animal animal = new Cat( );
3、案例演示
比如有一个Animal类,现在有一个Cat类继承了Animal类,我们可以实例化一个Cat对象,但父类Animal引用这个对象。
class Animal{
String name;
int age;
}
class Cat extends Animal{
}
public class TestDemo {
public static void main(String[] args) {
Cat cat = new Cat(); //实例化一个cat
Animal animal = cat; //父类Animal引用了子类Cat的对象
}
}
也可以直接写成
Animal animal = new Cat();
4、访问权限
即使父类引用了子类的对象,依然只能访问父类自己的属性/方法
向上转型的优点:让代码实现更简单灵活
向上转型的缺点:不能调用子类特有的属性和方法
5、使用场景
1、直接赋值
Animal animal = new Cat("mimi");
2、方法的参数
public class TestDemo {
public void eat(Animal animal){ //形参为父类引用,可以接收任意子类的对象
animal.eat();
}
}
3、方法的返回值
public Animal buyAnimal(String var){ //返回任意子类对象
if("狗" == var){
return new Dog();
} else if ("猫" ==var) {
return new Cat();
}else {
return null;
}
}
二、重写(多态的基础)
1、概念:
子类与父类方法的名称,返回值,参数列表都相同,被称为方法的重写
2、案例演示
在父类Animal类中有一个eat( )方法,在Cat( )中又写了一个eat( )方法,并且它们的名称,返回值,参数列表都相同,则eat( )方法发生了重写
class Animal{
public void eat(){
System.out.println("吃食物");
}
}
class Cat extends Animal{
public void eat(){ //重写了父类的eat方法,让小猫吃猫粮
System.out.println("吃猫粮");
}
}
public class TestDemo {
public static void main(String[] args) {
Animal animal = new Cat();
animal.eat();//使用animal调用eat()方法,显示吃猫粮
}
}
使用animal调用eat()方法,显示吃猫粮
3、动态绑定
在编译的时候,还是Animal的eat( )方法,但在运行的时候,就变成了Cat的eat( )方法,因此被称为运行时绑定
重载:函数或者方法有相同的名称,但参数列表不同的。它是静态绑定的,在编译时就已经被赋值了
4、注意
静态方法不能被重写
private方法不能被重写
被final修饰的方法不能被重写
子类的访问修饰限定符应该大于等于父类
访问修饰限定符:public > protected > 包访问权限 > private
三、多态
1、概念
多态是一种思想,同一个方法,因为调用这个方法的引用,引用对象不同,所执行的行为也是不一样的。
2、案例演示
在Animal类中写一个eat( )方法,然后我们在Cat类和Dog类中都重写一个eat( )方法,想要猫吃猫粮,狗吃狗粮,这样因为调用者不同,产生不同的结果,我们称之为多态
在Cat类和Dog类中重写eat( )方法:
class Animal{
public void eat(){
System.out.println("吃食物");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("吃猫粮");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("吃狗粮");
}
}
分别调用Cat类和Dog类
public class TestDemo {
public static void main(String[] args) {
Animal animal1 = new Cat();
animal1.eat(); //animal1引用cat
Animal animal2 = new Dog();
animal2.eat();//animal1引用dog
}
}
结果: