目录
课前先导
难点来了,多态,多少英雄豪杰都倒在了多态上。我认为他们应该是倒在定义上了,应该都是被定义搞晕了,我们这篇博文也会有很多定义,大家刚开始学,看一眼图一乐就行了,等把多态该清楚了,再去看那些定义。提示一下:多看带颜色的字。
一、多态
1、定义
(1)同一个对象,在不同时刻表现出来的不同形态
比如说,猫是猫,猫是动物,猫是猫科动物,猫是家养动物
就相当于 猫 = 猫 动物 = 猫 猫科动物 = 猫 家养动物 = 猫 (赋值符号 = 是从右往左读的)
(2)计算机程序运行时,相同的消息可能会发送给多个不同的类别之对象 ,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。
父类可能被很多个子类去继承,父类中的方法在子类中会有不同的形态(方法重写) ,我们看到的运行效果是子类的,不过,方法是父类发出的(父类中要有,就是子类和父类共有的方法)。
(3) 多态意味着在一次方法调用中根据包含的对象的实际类型(即实际的子类对象)来决定应该调用哪个方法,而不是由用来存储对象引用的变量的类型决定的。
比如我们平常创建对象 Cat c = new Cat();调用方法 c.show();我们看的是不是变量c是哪个类的,然后看Cat类继承的方法和它自己独有的方法;多态中看的是父类的方法在子类中的实例(父类和子类都有的方法)
2、多态的前提和体现
(1)有继承/实现关系;
(2)有方法重写;
(3)有父类引用指向子类对象。
要使用多态,这三个条件一定要有。我们看一下什么是父类引用指向子类对象:
我们平常创建对象:Cat c = new Cat(); Cat c :Cat类型的变量c; new Cat() :创建Cat类的对象。
多态中的创建对象:父类的引用指向子类的对象:Animal c = new Cat(); Animal c :父类Animal类型的变量c; new Cat() :创建子类Cat的对象。
3、多态中成员访问特点
我们用代码展示
父类Animal
public class Animal {
public String name = "动物";
public void eat(){
System.out.println("可爱不能当饭吃");
}
}
子类Cat
public class Cat extends Animal{
public String name = "猫";
public int age = 2;
public void action(){
System.out.println("猫会爬树");
}
@Override //方法重写
public void eat() {
System.out.println("猫吃鱼");
}
}
测试类及运行结果
通过对象调用age时报错了,因为父类中没有变量age
通过上面的代码可以看到,我们通过对象调用变量,调用的是父类的变量
下面我们调用方法
调用action()方法报错了,因为action()方法是子类Cat类特有的方法,父类没有
public class Test {
public static void main(String[] args) {
//多态
Animal cat = new Cat();
System.out.println(cat.name);
cat.eat();
}
}
调用方法,程序执行的是父类中的方法
多态的成员访问特点:
成员变量: