java 中构造器的调用顺序
来源:互联网 发布:中国网络安全法实名制 编辑:程序博客网 时间:2024/05/20 18:18
构造器的调用顺序:
step1: 调用基类构造器,首先是根,然后是下一层的导出类,直至最底层的导出类。
step2:按声明顺序调用成员的初始化方法。
step3:调用导出类构造器的主体。
还是用代码说明吧:
/** * 构造器的调用顺序 */package sandwich;import static org.print.Print.*;//自己写的print包class Meal {Meal() { print("Meal()"); }}class Bread {Bread() { print("Bread()"); }}class Cheese {Cheese() { print("Cheese()"); }}class Lettuce {Lettuce() { print("Lettuce()"); }}class Pickle{Pickle(){print("Pickle()");}}class Lunch extends Meal {Lunch() { print("Lunch()"); }}class PortableLunch extends Lunch {PortableLunch() { print("PortableLunch()");}}public class Sandwich extends PortableLunch {private Bread b = new Bread();private Cheese c = new Cheese();private Lettuce l = new Lettuce();public Sandwich() { print("Sandwich()"); }public static void main(String[] args) { new Sandwich();}private Pickle p=new Pickle();}上述代码的运行结果:
Meal()
Lunch()
PortableLunch()
Bread()
Cheese()
Lettuce()
Pickle()
Sandwich()
然鹅,当在构造器中创建了一个对象,但是该对象的所属的类是导出类。 因为在初始化对象,调用对象的构造器的时候,导出类并没有初始化。 。。。
还是用代码说明吧:
class Glyph { void draw() { System.out.println("Glyph.draw()"); } Glyph() { System.out.println("Glyph() before draw()"); draw(); System.out.println("Glyph() after draw()"); }}class RoundGlyph extends Glyph { private int radius = 1; //radius 是1 ! RoundGlyph(int r) { radius = r; System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius); } void draw() { System.out.println("RoundGlyph.draw(), radius = " + radius); }}public class PolyConstructors { public static void main(String[] args) { new RoundGlyph(5); }}
运行结果:Glyph() before draw()
RoundGlyph.draw(), radius = 0 // radius是0!
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
so, RoundGlyph.draw() 覆盖了Glyph().draw() 的方法,但是,基类构造器在导出类构造器调用之前调用,所以此时radius 的值为0;
也就是说,完整的实例化的实际过程应该是:
1,在其他任何事物发生以前,将分配给对象的存储空间初始化为二进制的0;
2,如之前所述的那样,调用基类构造器。(第二个代码中,)
3,按照声明的顺序调用成员的初始化方法。调用覆盖后的draw()方法,但是RoundGlyph并未调用,radius 值为0;
4,调用导出类的构造器主体。
0 0
- Java中构造器的调用顺序
- java 中构造器的调用顺序
- java中构造方法的调用顺序
- Java在继承中构造器的调用顺序
- [Java] 类中构造器的调用顺序
- java构造器的调用顺序
- java 构造器的调用顺序
- java构造器的调用顺序
- java构造器的调用顺序
- Java构造器的调用顺序
- java构造器的调用顺序
- java构造器的调用顺序
- java 构造器调用顺序
- Java中继承关系的构造函数的调用顺序
- java关于继承中构造函数的调用顺序
- java 类中 构造函数的相互调用 顺序
- JAVA中复杂对象调用构造器顺序
- Java中构造函数调用顺序
- 字符串指针和字符串数组
- 设计模式简介
- 细思恐
- 无法加载DLL问题及解决方法
- 从web.xml查看相关
- java 中构造器的调用顺序
- Qt笔记:设置控件的基本属性
- maven打包跳过测试
- Qt TableWidget控件使用
- 内存泄漏的检测、几种常见场景及解决方法
- Android中的接口回调技术
- CC2530 定时器3使用 -- 实现精确定时
- 大臣的旅费(dfs)
- IIS7/8下提示 HTTP 错误 404.13