某一个事物,在不同时刻表现出来的不同状态。
前提:a:要有继承关系;
b:要有方法重写;
c:要有父类引用指向子类对象。
父 f = new 子();
举例:
publicclassTest{publicstaticvoidmain(String[] args){
Dog dog =newDog();//狗属于狗类
dog.eat();
System.out.println("--------------------------");
Animal an =newDog();//狗也属于动物类
an.eat();}}classAnimal{publicvoideat(){
System.out.println("吃饭");}}classDogextendsAnimal{publicvoideat(){
System.out.println("狗吃骨头");}}
运行结果:
狗吃骨头
--------------------------
狗吃骨头
Process finished with exit code 0
publicclassTest{publicstaticvoidmain(String[] args){//创建子类对象的时候,会先访问父类的构造方法,对父类的数据进行初始化
Zi zi =newZi();
Fu fu =newZi();//成员变量:编译看左边,运行看左边
System.out.println(zi.num);//左边是zi,就是子类成员变量 打印:100
System.out.println(fu.num);//左边是fu,就是父类成员变量 打印:10//成员方法:编译看左边,运行看右边
zi.show();
fu.show();//父类引用调用方法,运行子类重写过后的方法}}classFu{int num =10;publicFu(){
System.out.println("父类构造执行了");}publicvoidshow(){
System.out.println("fu show");}}classZiextendsFu{int num=100;publicZi(){
System.out.println("子类构造执行了");}@Overridepublicvoidshow(){
System.out.println("zi show");}}
运行结果:
父类构造执行了
子类构造执行了
父类构造执行了
子类构造执行了
10010
zi show
zi show
Process finished with exit code 0
3、多态的利弊
优点:a:提高了代码的维护性(继承保证)
b:提高了代码的扩展性(由多态保证)
弊端:不能使用子类特有的功能
解决办法:把父类的引用强制转换为子类的引用(向下转型)。
示例:Animal an = new Cat();//多态就是向上转型
Cat cat= (Cat) an; //向下转型 将父引用转成他所指向的那个子类型
4、多态的内存图解
二、抽象类
1、抽象类的概述及其特点
概述:在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,则该类必须定义为抽象类。
特点:
a:抽象类和抽象方法必须用abstract关键字修饰
抽象类格式: abstract class 类名 {}
抽象方法格式: public abstract void eat();
b:抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类;
c:抽象类不能进行实例化,有构造方法,构造方法用于子类访问父类数据时的初始化;
d:抽象类不能直接实例化,按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态;
e:抽象类的子类,要么是抽象类,要么重写抽象类中的所有抽象方法。
面向对象(四)一、多态1、多态的概述及格式 某一个事物,在不同时刻表现出来的不同状态。 前提:a:要有继承关系; b:要有方法重写; c:要有父类引用指向子类对象。 父 f = new 子();举例:public class Test { public static void main(String[] args) { Dog d...