堆栈的地址是从高到低的,托管堆的地址是从低到高的。
这个部分的创建制止与类的继承本质直接相关,在与创建GC堆内类字段的时候的递归创建以及创建方法表时候的递归创建。
这里对与类成员方法相关的几个关键字:例如abstract , new , override做简单的描述。
方法表先于类型句柄产生。产生过程中,与类成员变量继承时的递归空间分配大同小异。在与几个关键字的处理上略有区别。
对于abstract关键字,在父类中出现,在子类中必须被覆盖,也就是在子类中由override关键字将其覆盖。(过程是递归的,方法表中,父类方法先出现,子类方法出现之时将其覆盖)
对于override关键字,在子类中出现,无论子类的直接父类使用的是abstract 或override关键字,都将将父类方法覆盖,也就是说,父类方法在方法表中将不再存在,也就无法调用。
对于new关键字,在子类中出现,那么,其父类的同名方法仍将存在。也就是说,此时方法表中有两个同名方法,一个属于父类,一个属于子类,调用关系看继承大原则。
继承大原则一:对象原则(针对的是类方法的继承)
从上述几个关键字也可以看出,对于方法来说,除非使用new关键字,否则在一般情况下,父类的方法都会被子类的方法覆盖,将不复存在。那么也就是说,对象是什么,方法表里的方法就是原本属于那个对象的方法。
继承大原则二:就近原则(针对的是类字段或类方法)
对于类字段的继承,如果子类中有与父类同名的字段,那么将采用就近原则。就近原则在子类被强制转换成父类的情况下发挥着重要作用。或者在我肤浅的看来,也可以说成是类型就近原则。
引用类型的区别确定了不同对象在方法表中不同的访问权限。
这里给出一个简单的例子:Chicken : Bird : Animal
Bird bird = new chicken();
Chicken chicken = new chicken();
bird.type 为 bird;
bird.showType() 为 chicken();
耐人寻味,细细体会。。。。。