一、封装
- 封装的理念是高内聚,低耦合
“高内聚”就是类的内部数据操作细节自己完成,不允许外部干涉。
“低耦合”是仅暴露少量的方法给外部使用,尽量方便外部调用。 - 封装的具体优点
1)提高代码的安全性。
2)提高代码的复用性。
3)“高内聚”:封装细节,便于修改内部代码,提高可维护性。
4)“低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。 - Java的4种访问权限修饰符
private:只能在同一个类中访问
default:只能在同一个类以及同一个包中访问
protected:只能在同一个类、同一个包以及子类(super调用)中访问
public:所有类都可以访问 - 开发中封装的简单规则
1)属性一般使用private访问权限,提供相应的get/set方法来访问相关属性,get/set方法通常是public修饰的,已提供对属性的赋值和读取操作,boolean变量的get方法时is开头的。
2)方法:一些用于类辅助性的方法可以用private修饰,希望其他类调用的方法用public修饰。
二、继承
- 继承的两个主要作用:
1)实现代码复用,更加容易实现类的扩展。
2)方便建模。例如猫和狗类继承动物类。 - 方法的重写(覆盖)Override
子类重写父类的方法,可以用自身行为替换父类行为(也就是子类方法替换父类方法)。重写是实现多态的必要条件。
方法重写需要符合下面的三个特点:
1)方法名、形参列表相同。
2)返回值类型和声明异常类型,子类需要小于等于父类。
3)访问权限,子类需要大于等于父类。
方法的重载overload(与继承无关)
说白了就是两个不同的方法,只是名字相同而已。
1)不同的含义:形参类型、形参个数、形参顺序不同
2)只有返回值不同不构成方法的重载(此时编译报错)
3)只有形参的名称不同,不构成方法的重载(此时编译报错)
即需要形参类型、形参个数和形参顺序不同才能实现方法的重载。 - final关键字的作用
1)修饰变量:被final修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。
2)修饰方法:被final修饰的方法,不能被子类重写。但是可以被重载。
3)修饰类:被final修饰的类,不能被继承。 - 组合:将“父类对象”作为“子类”的属性。从而也能实现代码的复用。即使用组合的方式也可以实现继承的功能。
组合比较灵活,继承只有一个父类,而组合可以有多个属性。
is-a关系:使用继承。例如学生是人。
has-a关系:使用组合。即它是某个东西的一部分,例如人有一个心脏。 - super关键字
1)super“可以看做”是直接父类对象的引用。可通过super来访问父类中被子类覆盖的方法或属性。
2)使用super调用普通方法,语句没有位置限制,可以在子类中随意调用。
3)在一个类中,若是构造方法的第一行没有调用super(…)或this(…);那么Java默认都会调用super(),含义是调用父类的无参构造。 - 继承树的追溯(例如方法重写)
1)先从当前类中查找
2)再依次向上追溯每个父类查找
3)如果没有找到,则出现编译错误
4)直到找到,则终止这个过程 - 构造方法调用顺序
1)构造方法第一行总是super(…)来调用父类对应的构造方法。
2)流程:先向上追溯到Object类,再依次向下执行类的初始化块和构造方法,直到执行到当前子类为止。
3)静态初始化块比构造方法优先级更高;即先向上追溯到Object类,再依次向下执行类的静态初始化块,直到执行到当前子类为止;再向上追溯到Object类,再依次向下执行类的构造方法,直到执行到当前子类为止。
例如:父类静态初始化块->子类静态初始化块->父类构造方法->子类构造方法。
三、多态
- 多态是方法的多态,不是属性的多态(多态与属性无关)。
- 多态的存在有三个必要条件:继承,方法重写,父类引用指向子类对象。
- 父类引用指向子类对象后,用该父类引用调用子类重写方法,此时多态就出现了。
例如父类 f = new 子类(); f.method();
此时调用的method()只能是重写的方法。
- 向上转型,父类引用指向子类对象的过程称为向上转型,属于自动类型转换。
- 向下转型,因为向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法,这时就需要进行类型的强制转换,称为向下转型。
类型的判断instanceof