包
包 (package) 是 组织类的一种方式.
使用包的主要 目的是保证类的唯一性.
导入包中的类
可以使用 import 语句导入包,import 只能导入一个具体的类,而不能导入一个具体的包
比如:import java.util.Date;
将类放到包中
包名需要 尽量指定成唯一的名字, 通常会用 公司的域名的颠倒形式(例如 com.bit.demo1 ).
包名要和代码路径相匹配. 例如创建 com.bit.demo1 的包, 那么会存在一个对应的路径 com/bit/demo1 来存 储代码.
如果一个 类没有 package 语句, 则该类被 放到一个默认包中
包的访问权限控制
如果 某个成员不包含 public 和 private 关键字, 此时这个成员可以在 包内部的其他类使用, 但是 不能在包外部的类使 用.
常见的系统包
继承
对共性的抽取。
使用 extends关键字进行处理的
意义:可以 对代码进行重复使用
继承是 is a 的关系:比如Dog is a Animal
(下面代码是一个例子)
子类帮父类进行构造需要用到super:
super关键字
1) 使用了 super 来调用父类的构造器
举例:
public Bird(String name) {
super(name);
}
2) 使用 super 来调用父类的普通方法
final关键字
曾经我们学习过 final 关键字, 修饰一个变量或者字段的时候, 表示 常量 (不能修改).
f inal 关键字也能修饰类, 此时表示被修饰的类就不能被继承.
组合
组合表示 has - a 语义(比如下面这个例子,学校有若干老师和学生)
多态
多态的前提:
1.向上转型:父类的引用指向子类引用的实例(三种时机,如下图)
2.动态绑定(运行时绑定):
动态绑定的前提:
3.方法重写:
重写的注意事项:
重写方法时显式加上 @Override 注解
理解多态
有了向上转型,动态绑定,方法重写的前提,就可以使用多态了!!
让我们来理解一下多态:(举一个打印多种形状的例子)
分割线上方是类的实现者
分割线下方是类的调用者
通过这个例子发现:当类的调用者在编写 drawMap 这个方法的时候, 参数类型为 Shape (父类), 此时在该方法内部并不知道, 也不关注当前的 shape 引用指向的是哪个类型(哪个子类)的实例. 此时 shape 这个引用调用 draw 方法可能会有多种不同的表现 (和 shape 对应的实例相关), 这种行为就称为 多态.
多态顾名思义, 就是 "一个引用, 能表现出多种不同形态"
使用多态的好处:
1) 类调用者对类的使用成本进一步降低.
多态能让类的调用者连这个类的类型是什么都不必知道, 只需要知道这个对象具有某个方法即可.
因此, 多态可以理解成是封装的更进一步, 让类调用者对类的使用成本进一步降低.
2) 能够降低代码的 "圈复杂度", 避免使用大量的 if - else
3) 可扩展能力更强.
如果要新增一种新的形状, 使用多态的方式代码改动成本也比较低.
这里注意需要区分:
this和super的区别
重写和重载的区别
静态绑定:(编译时绑定)
利用重载来实现多态
向下转型:(没有向上转型用的多,并且是不安全的)
父类对象转化为子类对象
抽象类
包含抽象方法的类叫做抽象类 (除了必须包含抽象方法,抽象类中也可以包含和普通类一样的成员和方法)
抽象类不能被实例化,只能被继承(抽象类最大的作用就是为了被继承)
抽象类不能被final修饰
一个普通类继承了一个抽象类,那么这个普通类中需要重写这个抽象类的所有抽象方法
一个抽象类A继承了一个抽象类B,那么这个抽象类A可以不实现抽象类B的抽象方法.但是!当抽象类A再次被一个普通类继承后,那么抽象类A和抽象类B中的抽象方法必须在这个普通类中重写.
接口
接口是抽象类的更进一步.
接口使用interface修饰,比如interface IA{}
接口不可以通过new来实例化
接口当中的普通方法,不能有具体的实现;如果非要实现,只能通过关键字default来修饰这个方法
接口中包含的方法都是抽象方法,因此可以省略 abstract;接口中的方法一定是 public, 因此可以省略 public
接口中的字段只能包含 静态常量( public static final ),其中的 public, static, final 的关键字都可以省略
接口中可以有static的方法
类和接口之间的关系是:类 implements 接口. 当一个类实现了一个接口,就必须要重写接口当中的抽象方法,并且重写的时候,前面必须加上public. 一个类可以implements多个接口,接口之间用逗号隔开
接口和接口之间的关系:接口 extends 接口,意为拓展.一个接口B通过extends拓展另一个接口C的功能.此时当一个类D通过implements实现这个接口B的时候,此时重写的方法不仅仅是B的抽象方法,还有B从C接口拓展来的方法.
接口用在什么地方:
有的时候我们需要让一个类同时继承自多个父类,但一个类只能 extends 一个父类. 但一个类可以同时 实现多个接口, 也能达到多继承类似的效果.
举一个例子:
三个常用接口:
1.Comparable
Comparable和compare to是配套使用的
缺点:对类的侵入性太强了,一旦写好了就不能动了,比如原来是通过年龄比较大小,现在想改成通过分数比较大小就不行.
比如下面的例子
2.Comparator
Comparator和compare配套使用
一般选择用Comparator而不用上面的Comparable,因为Comparator的有点是:灵活,对类的侵入性弱,想换比较就可以换.
例子如上面的代码所示
3.Cloneable
需要三步:
创建对象的方式:
之前我们学了new对象的方法创建对象,这里又学了一个通过clone()创建对象