多态概述
同一个对象,在不同时刻表现出来的不同形态
有父类引用指向子类对象的理解:就是上面动物 animal = new 猫(),这个动物就是父类,猫就是子类对象
具体实现步骤
先要有继承,然后在派生类中方法重写,然后在测试类中这么写:
父类名 a=new 子类名();
多态中成员访问特点
虽说我们创建的是子类的对象,但是外界看到的只是父类的引用
所以我们通过多态的形式访问成员变量时,他的编译要看左边,即调用成员变量时,要先看父类中有没有,父类中有才行
且通过多态形式访问成员变量,我们访问到的是父类中的,即运行也要看左边
通过多态访问成员方法也是看左边,要先看父类中有没有
但是运行时侯看子类,即此时输出的内容就是子类的对象调用的了
多态的好处和弊端
好处:如果在一个测试类中,要调用很多次不同功能,但是方法名相同的方法,我们就可以不用方法重载,而使用多态,直接把形参改为父类的,然后进行多态即可
在定义方法时,使用父类作为参数,在具体操作时,使用子类参与操作
但是通过多态的形式,他不能访问具体的子类所特有的功能,如果在父类没有这个方法,那么我们就不能访问
多态中的转型
向上转型
把子类对象赋值给父类引用,即
Animal a=new Cat();
向下转型
父类引用强转为子类对象,即
Cat c=(Cat) a;
通过向下转型解决了多态不能访问子类特有功能的弊端
但是向下转型只能在父类和子类中转型,不能在继承自同一父类的子类两个之间转型,会报错
当前面的a已经定义过时,也可以这么向上转型
抽象类
抽象的方法体必需放在抽象类中
Java的抽象类定义
public abstract class animal{
public abstract void eat();//抽象方法
}
要有abstract关键字
因为抽象类不是具体的,所以不能创建对象
在抽象类中也可以定义非抽象方法
如果抽象类想要创建对象,得参照多态的形式,通过子类对象来实例化,就是上面写的
派生类继承抽象类的话,必需要重写抽象类中的抽象方法,但是不用加abstract
如果不想重写抽象方法,那么子类本身也得是抽象类
抽象类的成员特点
抽象类可以有构造方法
用于子类要访问父类时,对父类的数据成员进行初始化
如果子类重写了父类的方法,抽象类调用成员变量时先看子类的,没有才看父类的(其实继承也是如此)