1.final关键字
有关final关键字的特点:
表示:最终的,无法更改(状态修饰符)
final修饰类,该类不能被继承!
final可以修饰成员变量,该变量此时是一个常量(常驻内存!)
自定义常量的时候:public static final 数据类型 变量名 = 初始化;
final可以修饰成员方法,该方法不能被重写
final修饰的变量:只能被赋值一次(它的值不能再被更改了!)
常量的分类:
字面值常量
自定义常量(final修饰的)
2.面试题:(final修饰的类型)
final修饰基本类型的变量和引用类型的区别?
final修饰的基本数
据类型的变量:它的数据值不能再改变了(具体的数据值)
final修饰的引用数据类型,它的地址值不能再改变了(但是成员变量的值不影响!)
3…多态
什么是多态?
一个事物在不同时刻显示出的不同状态(在堆内存中的变化)
多态的前提条件:
1)必须存在继承关系 (继承的好处第三点)
2)要有方法重写 :
3)需要存在:父类引用指向子类对象 (向上转型:使用的父类的东西,必须编译看左边!)
格式:父类名 对象名 = new 子类名() ;
多态的成员访问特点:
父类名 对象名 = new 子类名() ;
1)成员变量: 编译看左,运行看左边
2)成员方法:(非静态的):编译看左边,运行看右(因为存在子类覆盖父类的方法:方法重写)
3)静态的成员方法:编译看左,运行看左
(子类出现了和父类一摸一样的静态方法,静态方法跟类相关,不存在重写!,访问方式:类名.方法名())
4)构造方法:
由于存在继承关系,还需要分层初始化!
方法重写:指的是非静态方法!
4.多态的好处与弊端
多态的好处:
1)提高了代码的扩展性(由多态)
2)提高了代码的复用性,维护性(由继承关系保证)
多态的弊端:
不能够访问子类的特有功能!
如何解决呢?
方式1:可以创建子类具体类对象 :子类名 对象名 = new 子类名() ;
对象名.访问子类的自己的功能;
但是,不好,从内存角度考虑,在堆内存中产生一个内存空间(比较消耗内存空间!)
方式2:
多态的第三个条件:父类引用指向子类对象 (向上转型)
Fu f = new Zi() ;
想办法:将父类的引用强制转换为子类的引用(向下转型)
Zi z = (Zi)f;
好处:不需要重新new对象,在堆内存是比较节省内存空间的!
前提条件:要使用向下转型,必须先使用向上转型!
5.面试题:(多态的转型不当)
多态的向下转型使用不当,程序出现异常:
注意事项:
产生一个ClassCastException:运行时期异常(RuntimeException)的一种
使用向下转型的时候类型不匹配导致的!
解决方法:查看强制转换是否正确