如何使用Eclipse逐行追踪interface与super/sub class代码执行流程?
如何用Eclipse追踪Java代码执行顺序(附接口与继承代码分析)
嘿,没问题!我来帮你拆解这两个问题——用工具追踪代码执行顺序,还有这段接口与继承代码的执行逻辑,一步步来:
一、用Eclipse追踪代码执行的实用方法
调试是搞清楚代码执行顺序最直观的方式,Eclipse里操作很简单:
- 先在你想开始追踪的代码行(比如
main方法的第一行)左侧点击,设置断点(会出现蓝色小圆点) - 点击工具栏的「Debug」按钮(那个小虫子图标),程序会自动停在断点处
- 用几个核心快捷键控制执行节奏:
F6:单步执行(逐行走,不会跳进方法内部)F5:单步跳入(进入调用的方法,比如构造函数、poit这类自定义方法)F7:单步跳出(从当前方法回到调用它的地方)F8:直接运行到下一个断点
- 在Debug视图里,你能看到调用栈(方法的执行层级)、变量的实时值,同时Console会同步输出每一步的打印内容,完全能搞清楚每一行代码什么时候执行、为什么会输出对应内容。
- 要是用IntelliJ IDEA之类的其他IDE,操作逻辑也差不多,断点+单步调试是通用的代码追踪神器,比死记硬背执行顺序靠谱多了!
二、你的代码执行逻辑逐行拆解
先把你的代码贴出来方便对照:
interface Silly { public void narf(); public void poit(Silly s); } public class Bird implements Silly { public static void main(String args[]) { System.out.println("zero"); Silly s = new SillyBird(1); Silly s2 = new Loony(); s.poit(s2); s2.poit(s); System.out.println("zymurgy"); } public Bird() { this(0); System.out.println("zircon"); } public Bird(int i) { System.out.println("zanzibar"); } public void narf() { System.out.println("zort"); } public void poit(Silly s) { s.narf(); } } class SillyBird extends Bird { public SillyBird() { System.out.println("duchess"); } public SillyBird(int i) { super(i); } public void narf() { System.out.println("drum"); super.narf(); } } class Loony extends SillyBird { public Loony() { System.out.println("stupendous"); } public void narf() { System.out.println("snark"); } }
对应输出结果:zero zanzibar zanzibar zircon duchess stupendous snark drum zort zymurgy,现在一步步拆解执行流程:
- 程序启动后,首先执行
main方法的第一行:System.out.println("zero");→ 打印zero - 创建
SillyBird(1)对象:- 调用
SillyBird(int i)构造方法,里面执行super(i);,也就是调用父类Bird的带参构造Bird(int i)→ 打印zanzibar - 这个带参构造执行完就结束,
SillyBird对象创建完成
- 调用
- 创建
Loony()对象:- 调用
Loony的无参构造,Java默认会先执行父类SillyBird的无参构造 SillyBird的无参构造又会默认调用父类Bird的无参构造Bird的无参构造里先执行this(0);,调用自己的带参构造Bird(int 0)→ 打印zanzibar- 回到
Bird的无参构造,执行System.out.println("zircon");→ 打印zircon - 回到
SillyBird的无参构造,执行System.out.println("duchess");→ 打印duchess - 回到
Loony的无参构造,执行System.out.println("stupendous");→ 打印stupendous
- 调用
- 执行
s.poit(s2);:s是SillyBird对象,但它没重写poit方法,所以调用父类Bird的poit方法- 方法里执行
s.narf();,s2是Loony对象,调用Loony重写的narf()→ 打印snark
- 执行
s2.poit(s);:s2是Loony对象,同样没重写poit,调用父类Bird的poit方法- 方法里执行
s.narf();,s是SillyBird对象,调用SillyBird重写的narf():- 先打印drum,然后执行
super.narf();调用父类Bird的narf()→ 打印zort
- 先打印drum,然后执行
- 最后执行
main方法的最后一行:System.out.println("zymurgy");→ 打印zymurgy
把这些打印内容按顺序连起来,就是你看到的输出结果啦!
内容的提问来源于stack exchange,提问作者user372204
相关产品推荐
相关产品推荐

