包
导入包中的类
将类放到包中
包的访问权限控制
常见的系统包
继承
举一个继承的例子:
但是即使如此, 我们并不希望类之间的继承层次太复杂. 一般我们不希望出现超过三层的继承关系. 如果继承层次太多, 就需要考虑对代码进行重构了.如果想从语法上进行限制继承, 就可以使用 final 关键字
final关键字
简单总结:
组合
多态
多态的前提:
1.向上转型:父类的引用指向子类引用的实例
向上转型发生的三种时机:直接赋值,方法传参,方法返回
直接赋值:
方法传参:
方法返回:
2.动态绑定(运行时绑定):
什么叫动态绑定:
在 Java 中, 调用某个类的方法, 如果父类和子类中有同名方法,究竟执行哪个类中的代码 (是父类方法的代码还是子类方法的代码) , 要看究竟这个引用指向的是父类对象还是子类对象. 这个过程是程序运行时决定的(而不是编译期), 因此称为 动态绑定.
举一个动态绑定的例子:
所谓"动态":
3.方法重写:
针对上面举的动态绑定的例子中的 eat 方法来说:子类实现父类的同名方法, 并且参数的类型和个数完全相同, 这种情况称为 覆写/重写/覆盖(Override)
重写的注意事项:
理解多态
为什么会出现编译出错呢?
那么想要实现想要实现上面fly的效果,就需要向下转型:
super关键字
前面的代码中由于使用了重写机制, 调用到的是子类的方法. 如果需要在子类内部调用父类方法可以使用super 关键字
super 表示获取到父类实例的引用
super涉及两种常见用法:
1) 使用了 super 来调用父类的构造器
举例:
2) 使用 super 来调用父类的普通方法
在这个代码中, 如果在子类的 eat 方法中直接调用 eat (不加super), 那么此时就认为是调用子类自己的 eat (也就是递归了). 而加上 super 关键字, 才是调用父类的方法.
注意:super不能出现在静态方法中,并且super必须在方法中的第一行
在构造方法中调用重写的方法(一个坑)
简单总结:
抽象类
下面这个代码是我们上面在理解多态处举得例子中的代码,我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由Shape 的各种子类的 draw 方法来完成的. 像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstract method), 包含抽象方法的类我们称为 抽象类(abstract class).
在 draw 方法前加上 abstract 关键字, 表示这是一个抽象方法. 同时抽象方法没有方法体(没有 { }, 不能执行具体代码).
对于包含抽象方法的类, 必须加上 abstract 关键字表示这是一个抽象类.
抽象类的作用:
接口
接口是抽象类的更进一步. 抽象类中还可以包含非抽象方法, 和字段. 而接口中包含的方法都是抽象方法, 字段只能包含静态常量.
三个常用接口:
注意:如果自定义的数据类型进行大小的比较,一定要实现可以比较的接口!!!!
1.Comparable
2.Comparator(推荐)
Comparator和compare配套使用
一般选择用Comparator而不用上面的Comparable,因为Comparator的优点是:灵活,对类的侵入性弱,想换比较就可以换.