Java 继承和多态的重点&动态绑定机制&instanceOf(看源码必备知识!)
  ZI8auM7AuOiW 2023年11月01日 65 0

在看集合源码的时候,因为对继承和多态的知识有些模糊,导致看源码比较吃力。所以重新回顾一下面向对象的继承和多态,顺便记录一下重点。

继承

  1. 子类会继承父类的所有属性和方法,但私有属性和方法在子类不能直接访问,需要通过父类提供的公共方法访问;

  2. 子类必须调用父类的构造器,完成父类的初始化(创建子类对象时会调用父类的无参构造器,其实在子类的无参构造方法的第一行默认有super() );

  3. 创建子类对象时,不管子类使用有参构造还是无参构造,默认情况下总会去调用父类的无参构造。如果父类没有写无参构造器(当父类写了有参构造器而没写无参构造器,那么无参构造器就没有了),那么子类的构造器要用super()指定使用父类的什么构造器,否则编译不通过;

  4. 如果想要指定调用父类的某个构造器,则需要用super()显式调用。调用super()时必须要放在第一行,而this()也是必须放在第一行,所以这两个方法只能用一个,不能共存;

  5. Object类是所有类的父类,因此创建子类对象调用父类构造器时,会一直向上追溯到Object类;

  6. 当子类对象访问某个属性/方法时:
    (1) 首先看子类对象本身有没有该属性/方法,如果有并且是可以访问的,那么直接访问
    (2) 如果子类没有该属性/方法,看父类有没有该属性/方法,如果父类有并且是可以访问的,那么就访问
    (3) 同理,如果父类也没有,则一直向上找,直到Object类

多态

多态分为方法的多态和对象的多态(核心),重载和重写体现了方法的多态,具体可以看下这篇重写,里面有案例

对象的多态:(前提:两个对象/类具有继承关系)

  1. 一个对象的编译类型和运行类型可以不一致;

  2. A a = new B(); B是A的子类,A是编译类型,B是运行类型,这种就是父类的引用指向子类的对象,这里就是向上转型

  3. 编译类型在定义对象时就确定了,不能改变;

  4. 运行类型是可以变化的;

  5. 可以调用父类中所有属性/方法(要遵守访问权限),不能调用子类特有的属性/方法,最终的运行效果看子类的具体实现;

  • 问:为什么不能调用子类特有的属性/方法?
    答:因为在编译阶段,能调用哪些属性/方法由编译类型决定
  1. 向下转型:
A a = new B();  
B b = (B) a;  //向下转型

// 只能强转父类的引用,不能强转父类的对象
// 当前父类的引用必须指向目标类型的对象
// 向下转型后,可以调用子类中所有属性/方法(要遵守访问权限)
  1. 由于属性没有重写这个机制,所以属性的值取决于编译类型
public static void main(String[] args){
  A a = new B();
  System.out.println(a.id); // 输出 001
}

class A{
  int id = 001;
}
class B extends A{
  int id = 002;
}

动态绑定机制

  1. 当调用对象方法时,该方法会和该对象的运行类型/内存地址绑定;
  2. 当调用对象属性时,哪里声明,哪里使用,没有绑定机制。

参数的多态

方法定义的形参类型为父类类型,实参类型可以是子类类型

注: 访问权限 - public > default > protected > private

另外提一嘴instanceOf 比较操作符,用于判断对象的运行类型是否是某类型或者某类型的子类类型

有不懂的地方可以在下面评论,随时交流~

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   55   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   114   0   0 Java
  8s1LUHPryisj   2024年05月17日   49   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
ZI8auM7AuOiW