- 成员方法的访问
子类继承父类,如果子类的成员方法名和父类的成员方法名不一致的情况:分别调用即可!
如果子类的成员方法名称和父类的成员方法名称一致的情况:
1)先在子类找,如果存在方法名,就使用。
2)如果子类中不存在,就在父类中找,存在就使用。
3)父类中都没有,就编译报错了! - 方法重写
定义:子类出现了和父类一模一样的方法声明。修饰符 返回值 方法名都一样(一模一样)。 - 方法重写的注意事项:
子类重写父类的方法的时候,访问权限不能更低!,最好带上权限修饰符 跟父类一样都是public。
要么子类重写父类的方法的时候,访问权限比父类大即可!(或者和父类一模一样)。 - final关键字
子类继承父类的时候,有的时候不需要让子类重写父类的方法可以使用final进行修饰。
final为状态修饰符,表示终态的,无法更改的。
可以修饰变量:此时变量是一个常量!(自定义常量)。
修饰成员方法:该方法不能被重写。
修饰类:该类不能被继承。
final修饰变量的注意事项:
a. 该变量如果是一个基本数据类型,该基本数据类型的值(已经初始化)不能再变化!
b. 如果final修饰的变量是一个引用数据类型,引用数据类型中的空间地址值不能再变化,但是可以访问里面的成员变量。
c.final修饰变量初始化时机:在执行完构造方法之前需要对final修饰的变量进行初始化。
d.本身在成员变量位置定义的final修饰的变量(非静态的变量),已经初始化了,后面构造代码块或者构造方法中 都不能再对其赋值了。
e.final的应用场景:开发中 定义一个常量:
public static final 数据类型 变量名 = 初始化值; - 多态
多态定义:一个事物在不同时刻的不同状态。 - 多态的前提条件:
1)必须有继承关系 (产生一个中extends 关系)。
2)需要有方法重写: 子类继承父类的时候,需要使用子类的功能,需要将父类的功能覆盖掉!
3)必须有父类引用指向子类对象 (向上转型)
Fu f = new Zi() ; 在内存中使用子类实例化(创建对象),但是子类继承父类,通过构造方法 让父类初始化。 - 多态的成员访问特点:
Fu f = new Zi() ;
1)成员变量(非静态变量)
编译看左,运行看左边 (看父类)
2)构造方法
Fu f = new Zi() ; 内存创建的是子类对象,但是存在继承关系,执行构造方法先让父类初始化完毕,然后在初始化子类。
3)成员方法(非静态) (方法重写,说的非静态的方法!)
编译看左,运行看右 (因为存在方法重写,运行看的右边)
4)静态的成员方法:
编译看左,运行看左(静态方法算不上方法重写,跟类先关,优先父类进行数据初始化,function方法先进内存)
父类引用.静态方法名()–调用父类的方法 - 多态的好处:
1)提高代码的维护性(继承来保证)
2)提高代码的扩展性(由多态保证) - 多态的弊端:
父类引用指向子类对象(向上转型),无法访问子类的特有功能! - 多态的前提条件:
1)继承关系
2)方法重写
3)父类引用指向子类对象 (向上转型) Fu f = new Zi() ; - 需要访问子类特有功能,怎么办?
1)直接在测试的时候,子类去创建自己的对象
Son s = new Son()
可以访问,但是从内存角度考虑,重新在堆内存中开辟空间,耗费空间的内存!
2)将父类的引用转换为子类引用 , 将父类的引用强制转换为子类的引用 :向下转型 Zi zi = (Zi)f;
在多态中,向下转型如果使用不当,那么会出现程序的异常(运行时期异常)