java------继承与初始化----一个程序的调试及分析
来源:互联网 发布:异世之淘宝女王txt下载 编辑:程序博客网 时间:2024/05/08 11:10
package com.zhou1;class System1{public static int print(String s){System.out.println(s);return 2;}}class Insect{ private int i = 9; protected int j; public Insect() { System.out.println("i="+i); System.out.println("j="+j); j = 39; } private static int x1 = System1.print("Static x1");}public class Beetle extends Insect{ private int k = System1.print("class Beetle"); public Beetle() { System.out.println("k="+k); System.out.println("j="+j); } private static int x2 = System1.print("Static x2"); public static void main(String []args) { System.out.println("Constructor"); Beetle beetle = new Beetle(); }}
进入调试
可以看到,在进入main方法之前,类中的static属性已经完成了初始化。
事实上,当在命令行输入java Beetle时,java虚拟机试图访问Beetle.main(),于是对Beetle.class进行加载的过程中,编译器注意到它是一个基类,于是它继续进行加载。再检查基类是否还有基类,有则继续加载。如此类推。接下来,基类的static初始化,然后是它的导出类的static进行初始化。如此类推。这种方法很重要,因为导出类的static初始化很可能会依赖于基类成员是否被正确初始化。
然后执行System.out.println("Constructor");输出
当程序准备执行Beetle beetle = new Beetle();时,程序跳到
此时发现
说明在对象创造之前,对类的属性的默认初始化就已经执行了
再按f6(步过)
当准备执行Beetle的构造方法时,第一步默认执行super(),先执行对Beetle的基类的属性的赋值操作:int i = 9;然后执行其基类的构造方法,输出i、j的值,然后跳回Beetle,对自己的属性进行赋值操作,所以即将执行int k = System1.print("class Beetle");
下一步:执行Beetle的构造方法
0 0
- java------继承与初始化----一个程序的调试及分析
- [Think in java]初始化及类的加载——继承与初始化
- Java 继承与初始化
- Java继承与初始化
- Java继承与初始化
- JAVA--继承与初始化
- java 继承 及 初始化顺序
- Java程序与串口的通信实现及调试
- Java程序与串口的通信实现及调试
- java继承的初始化
- JAVA的继承初始化
- 从一个简单程序的GDB调试看段错误,指针的初始化及内存分配(malloc/free)
- 从一个简单程序的GDB调试看段错误,指针的初始化及内存分配(malloc/free)
- Java中继承与初始化
- 对象及继承的初始化
- java类的初始化顺序及继承顺序
- 一个java程序的分析
- [5v]Java继承中父类与子类的初始化顺序
- static在C和C++中的用法
- 【Detector】【Descriptor】尺度不变特征转换(Scale-invariant feature transform 或 SIFT)
- C/C++常见面试题
- javaWeb Tomcat端口加IP访问项目
- php的安装
- java------继承与初始化----一个程序的调试及分析
- HDU 3649 New Game
- 关于memset赋值无穷大无穷小
- 监督学习与无监督学习
- [网络分析] 1 获取网络适配器列表
- 循环-07. 爬动的蠕虫(15)
- linux安装sas raid驱动
- 字节对齐与补齐
- 认识box2d世界