1、讲讲多态

字节码层面调用方法有三种关键字
invokespecial:最终方法(final),私有方法(private),构造方法都是由 invokespecial 指令来调用,属于静
态绑定
invokevirtual:普通成员方法是由 invokevirtual 调用,属于动态绑定,即支持多态
invokestatic:静态方法,调用时不需要对象引用

只有字节码指令是invokevirtual的方法才支持多态,也就是非final、private,非构造方法和静态方法

首先有一个大前提,新建子类对象时,首先默认调用(如果没有显式地调用父类的super方法)父类的无参构造器(所以为什么我们通常要写一个无参构造器)。

当我们使用多态时,字节码指令首先发现是invokevirtual。然后进行以下操作。

  1. 首先通过栈帧中的对象引用找到子类对象(这时我们找到的是对象头,前八个字节是markword,后八个字节是对象的class指针)
  2. 这时候我们可以根据class指针找到实际的class对象(子类的class对象)
  3. class对象中有个vtable,它在类加载的链接阶段就已经根据方法的重写规则生成好了
  4. vtable中有方法的具体地址(包括子类重写的方法和父类没有被重写的方法)
  5. 根据方法名称执行方法的字节码,完成多态

如果我们调用的是属性或者final、private以及构造方法和static方法,是不存在多态的,因为没有vtable这个东西,所以我们以多态的形式调用这些东西,都是父类的方法或者属性

Java Bean 和 Spring Bean

  1. java Bean:是一种java编写类的规范,方法命名,构造以及行为必须符合特定的要求:java bean的应用:数据库的一个表写成一个类来进行值传递(字段写成属性)
    • 所有属性为private
    • 这个类必须具有一个公共的无参构造方法
    • private属性必须提供public的getter和setter来给外部访问,并且方法的命名也必须遵循一定的规范
    • 该类实现serializable接口
  2. springBean:受spring管理的对象,所有能受spring容器管理的对象都可以成为springBean
  3. 区别:
    • 用处不同:
      • 传统的javabean主要用作值传递参数
      • spring中的bean用处很多,任何组件都可以被称为bean
    • 写法不同:
      • 传统bean要求每个属性都提供getter和setter方法
      • spring bean只要为接受设值注入的属性提供setter方法
    • 生命周期不同:
      • 传统bean作为值对象传递,不接受任何容器管理生命周期
      • spring中的bean有spring管理其生命周期