继承,封装,多态是OOP的三大特点,封装是通过合并特征和行为来创建行的数据类型,多态的作用就是消除类型之间的耦合关系,这些概念看起来很抽象,真正理解确实很难,只能以个知识点一个知识点的去累计,然后慢慢体会。
前期绑定和后期绑定
在多态中有前期绑定和后期绑定的概念,讲一个方法嗲用同方法主体关联起来叫做绑定,弱在程序执行之前绑定叫做前期绑定,反之就是后期绑定。比如说A只有一种方法调用,那就是前期绑定,java中除了static方法和final方法其他都是后期绑定,private方法也属于final方法
Private 方法
private方法不能被覆盖,严格来说我们真要去覆盖private方法也不会变异报错,但是他也不会按照我们的意志当调用父类对象的这个方法的时候然后被子类的方法覆盖掉。所以在子类中对于父类的private方法,最好次用不同的名字
只有普通的方法调用可以是多态的
当子类对象转型为父类对象的时候,任何域访问操作都是有编译器解析,因此不是多态,但父类和子类拥有相同的field的时候他们只想不同的存储空间,因此如果想要在子类中引用相同名字的父类的field,就应在field前显示的加上父类名super.field_name。这是我们可以想象为什么类中的field为什么最好定义成private的,这样可以避免其它类包括子类因为想要获得这个类的field而是实际得不到而产生的错误。
构造器中多态方法的行为
如果父类在构造器中调用子类被子类覆盖的方法,会调用子类的方法,如果子类的方法中用到了子类的field而父类中没有,那么父类构造器调用子类方法的时候这个field使用的是初始值。因为初始化的实质是:
1。在其他任何事务发生之前,讲分配给对象的存储空间初始化为二进制的零
2. 由上而下调用构造器
3按照声明的顺序调用成员的初始化方法
4.调用导出类的构造器主体。
上述情况的调用的效果是难以预料的,因为被覆盖的方法在对象被完全初始化之前就会被调用,这样会造成隐藏错误。所以我们要尽可能的用简单的方法是对象进入正常状态,如果可以的话避免调用其他方法。