构造器内部的多态方法的行为
2016-12-22 00:00
183 查看
public class PolyContructors { public static void main(String[] args) { new RoundGlyph(5); } } class Glyph { void draw() { System.out.println("Glyph.draw()"); } public Glyph() { System.out.println("Glyph's Constructor"); System.out.println("before draw..."); draw(); System.out.println("after draw..."); } } class RoundGlyph extends Glyph { private int radius = 1; void draw() { System.out.println("RoundGlyph.draw() -> radius=" + radius); } public RoundGlyph(int r) { radius = r; System.out.println("RoundGlyph's Constructor"); } }
输出:
Glyph's Constructor before draw... RoundGlyph.draw() -> radius=0 after draw... RoundGlyph's Constructor
输出结果radius为什么是0而不是1?
think in java说Glyph的构造器调用draw()方法时,radius不是默认初始值1,而是0(?),我理解的是radius要么是发现变量未定义,要么找到变量的定义并初始化为1,为什么是0呢.....对象.在堆里已分配了空间,初始化成了默认值0?
初始化的实际过程:
在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。
如前所述那样调用基类构造器,此时,调用被覆盖后的draw()方法(注意,要在调用RoundGlyph构造器之前调用),由于步骤1 的缘故,我们此时会发现radius的值为0
按照声明的顺序调用成员的初始化方法
调用导出类的构造器主体
在构造器内唯一能够安全调用的那些方法是基类中的final方法(也适用private方法,它们自动属于final方法),这些方法不能被覆盖,故不存在这个问题。
另,如果父类构造器调用了被子类重写的方法,且通过子类构造函数创建子类对象,调用了这个父类构造器(无论显示还是隐式),就会导致父类在构造时实际上调用的是子类覆盖的方法。
相关文章推荐
- 构造器内部的多态方法行为
- java 构造器内部的多态方法和行为
- Java中构造器内部的多态方法的行为
- java 构造器内部的多态方法和行为
- 构造器内部的多态方法的行为
- Java构造器内部的多态方法的行为
- 构造器内部的多态方法行为
- 构造器内部的多态方法的行为
- java 构造器内部的多态方法和行为
- 黑马程序员-构造器内部的多态方法的行为
- 构造器内部的多态方法的行为
- 构造器内部的多态方法的行为
- java学习之构造器内部的多态方法的行为
- 构造器内部的多态方法的行为详解(附源码)
- 构造器内部的多态方法的行为
- java基础--多态--构造器内部的多态方法行为
- [Java] 构造器内部的多态方法行为
- 构造器内部的多态方法的行为
- 构造器内部的多态方法的行为
- 构造器内部的多态方法的行为