final:最终的、不能改变的-----------------单独应用几率低
修饰变量:变量不能被改变
修饰方法:方法不能被重写
修饰类:类不能被继承
static final常量:应用率高
必须声明同时初始化
常常通过类名点来访问,不能被改变
建议:常量名所有字母都大写,多个单词用_分隔
编译器在编译时,会将常量直接替换为具体的数,效率高
何时用:数据永远不变,并且经常使用
抽象方法:
由abstract修饰
只有方法的定义,没有具体的实现(连{}都没有)
抽象类:
由abstract修饰
包含抽象方法的类必须是抽象类
抽象类不能被实例化(new对象)
抽象类需要被继承,派生类:
重写超类的所有抽象方法----------变不完整为完整
也声明为抽象类----------------------不常用
抽象类的意义:
封装共有的属性和行为-------------------代码复用
为所有派生类提供统一的类型----------向上造型(代码复用)
可以包含抽象方法,为所有派生类提供统一的入口(向上造型后能点出来),同时可以达内强制必须重 写的目的(相当于制定了一个标准)
设计规则:
将派生类所共有的属性和行为,抽到超类中-------------抽共性
若派生类的行为/代码都一样,设计为普通方法
若派生类的行为/代码都不一样,设计为抽象方法
抽象方法/抽象类的疑问:
抽象方法存在的意义是什么?
保证当发生向上造型,通过超类的引用能点出来那个方法----------保证能点出方法来
既然抽象方法的意义是保证能点出来,那为什么不设计为普通方法呢?
设计为普通方法,意味着派生类可以重写也可以不重写,但设计为抽象方法,则可以强制派生类必须 重写------------达到强制派生类重写,统一的目的
成员内部类:应用率低
类中套类,外面的称为外部类,里面的称为内部类
内部类通常只服务于外部类,对外不具备可见性
内部类对象通常在外部类中创建
内部类中可以直接访问外部类的成员(包括私有的),
内部类有个隐式的引用指向了创建它的外部类对象----------外部类名.this
匿名内部类:------------------------简化代码
若想创建一个类(派生类)的对象,并且对象只被创建一次,此时可以设计为匿名内部类
匿名内部类中不能修饰外面局部变量的值,因为该变量在此处默认为final的
常见面试题: 问:内部类有独立的.class吗?
答:有
隐式的引用:
this:指代当前对象
super:指代当前对象的超类对象
外部类名.this:指代当前对象的外部类对象
做功能的套路:
先写行为/方法:
若为某个派生类所特有的功能/行为,则将方法设计在特定的类中
若为所有派生类所共有的功能/行为,则将方法设计在超类中
窗口调用:
若为定时发生的,则在定时器中调用
若为事件触发的,则在侦听器中调用
接口:
是一种数据类型(引用类型)
由interface定义
只能包含常量和抽象方法--------数据默认都是常量,方法默认都是抽象的
接口不能被实例化(new对象)
接口是需要被实现/继承的,实现类/派生类:必须重写所有抽象方法
一个类可以实现多个接口,用逗号分隔,若又继承又实现时,应先继承后实现
接口可以继承接口
关系:
类和类----------------------------继承extends
接口和接口----------------------继承extends
类和接口-------------------------实现implements
可以向上造型为:超类+所实现的接口
设计规则:
将所有派生类所共有的属性和行为,抽到超类中----------------抽共性
若派生类的行为都一样,设计为普通方法
若派生类的行为不一样,设计为抽象方法
将部分派生类所共有的属性和行为,抽到接口中
接口是对继承的单根性的扩展-------------------------------实现多继承
接口相当于制定了一个标准、规范
-------实现了接口,那就能干某件事,若不实现接口,就干不了那个事
多态:多种形态
意义:
同一个对象被造型为不同的类型时,有不同的功能------所有对象都是多态的(明天才能体会)
------对象的多态:我、水、你......
同一类型的引用在指向不同对象时,有不同的实现-------所有抽象方法都是多态的
------行为的多态:cut()、getImage()、getScore()......
向上造型/自动类型转换:--------就是多态
超类型的引用指向派生类的对象
能点出来什么,看引用的类型
能造型成为的类型有:超类+所实现的接口
强制类型转换/向下转换,成功的条件只有如下两种:
引用所指向的对象,就是该类型
引用所指向的对象,实现了该接口或继承了该类
强转时若不符合如上条件,则发生ClassCastException类型转换异常
建议:在强转之前先通过instanceof来判断引用的对象是否是该类型
何时需要强转:若想访问的变量/方法在超类中没有,则需要强转