继承

  1. 继承基本知识:
    1. 超类基类父类->子类派生类
    2. 子类继承父类的除private外的字段、方法以及构造器
    3. 超类的字段建议设定为private,并通过专用的方法来提供接口访问这些字段
  2. super和this的区别:super并不是引用,只是一个指示编译器调用超类方法的特殊关键词
  3. 子类构造器:可以通过super来调用超类构造器,或者缺省调用超类默认构造器。对超类构造器的调用必须是在子类构造器的代码体第一行。
  4. 多态:一个变量(如类型指针)可以指示多种实际类型的,运行时自动选择调用哪个类型被叫做动态绑定。
  5. 继承中的多态:被覆盖的方法只会选择覆盖后的版本,除非显示的选择;多态方法会根据参数类型判断;但是字段会根据指针类型选择版本,即使是子类实例,使用超类引用来访问超类子类的同名字段会访问超类的字段。(虽然一般超类字段都是private的,而且字段重名比较少见)
  6. jvm如何实现动态绑定:
    1. 对于方法调用:先在实际类型内查找,若没有则进入上一级超类查找。
    2. 对于字段调用:根据指针类型查找。
    3. 具体结构:多态判断只在多态方法上复杂,多态的原因有:覆盖、父子同名不同签名的方法、类自己之中同名不同签名的方法。为了分辨不同,jvm维护一张方法表辅助查找。
  7. 如何阻止继承?使用final。
    1. 将final用于类:方法将自动置为final,但是字段不会;无法被继承
    2. 将final用于方法和字段:就是使得他们无法改变
  8. 继承体系中的类型转换:向下转型必须被谨慎的使用,如果发现必须向下转型,应当首先查看是否超类的设计不合理,认真验证后再决定。
    1. 向上转型:隐形实现
    2. 向下转型:可以通过编译,但是运行会抛出异常。建议使用if-intanceof显式的验证,那么编译器会同一运行程序。
    3. 使用instanceof来检查转换是否合理是建议的
  9. 抽象类
    1. abstract只应用于方法和类,不用于字段。
    2. 包含abstract方法的类必须也被声明为abstract。
    3. 抽象类可以包含非抽象方法,可以不包含抽象方法。
    4. 抽象类无法被实现。
    5. 抽象类指针(java中的指针和c不同)是被允许的。
  10. protected访问修饰符:对本包和所有子类可见。
  11. Object类:
    1. 如何重写equals方法:判断是否引用相同->判断是否为空引用->判断类是否相同(使用getclass而非instanceof,因为instanceof包容子类,而equals要求对称性,但是如果你足够熟悉,可以在继承体系的equals中巧妙的使用instanceof)->判断自定义条款的是否相同
    2. 自定义继承体系中的equals方法:首先将调用超类的equals,然会是子类的equals
  12. 泛型数组列表:
    1. 菱形语法。
    2. 提高ArrayLIst.add效率:使用ensureCapacity来手动增加底层数组,而不是让容器自己多次添加;在初始化的时候给出一个合适的初始大小
    3. 提高ArrayList空间效率:trimToSize将抛弃多余的已分配空间。
    4. ArrayList与泛型:不带泛型的容器取出的对象是object的,需要强转才能使用;而带泛型的则直接返回泛型对象;所以可以通过ArrayList<T>和toArray实现泛型数组
    5. 容器的插入删除都是数组的插入删除,若插入到中间则需要将所有后面的元素后移。
  13. 包装器:其本身、方法、字段,都是final的,所以它是完全不可改变不可继承重写的。为了得到可改变的字段,使用holder类来实现
原文地址:https://www.cnblogs.com/gjl-blog/p/8562987.html