Debug中的一个问题

Debug中的一个问题

老师,在 继承的初始化顺序 这一节,

设好断点,开始debug后,先步入,到ClassLoader中,

再点Step Over后,并没有跳转到Aniaml类的

private static int st1 = 22;
public static int st2 = 23;

的位置,而是直接到了Cat类的

public static int st3=44;

的位置,同时控制台也输出"我是父类的静态代码块",


请问为什么会跳过中间父类静态属性和静态代码块啊?

导入了课程的源码也是同样问题,请老师指导一下这是什么问题。

下载视频          

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,老师这里没有复现同学的情况。请同学确认是否通过正确的步骤进行的测试,建议同学除了打印语句之外,都使用Step Into进行向下执行,使用Step Over可能会跳过某些步骤

1.在new Cat()语句位置设置debug断点;

2.运行时,在断点处使用Step Into进入对象创建;

3.此时会进入Animal类的静态代码块,输出“我是父类的静态代码块”;

4.接下来初始化Animal类的两个静态变量;

5.此时会进入Cat类,自上而下初始化静态成员,即先初始化静态变量;

6.接下里初始化Cat类的静态代码块,输出“我是子类的静态代码块”;

当完成这些之后,对象创建完成。

祝学习愉快~


  • roTony 提问者 #1

    老师,我设完断点,就到了上面您说的 第2步 位置,步入,像课程视频一样进入classloader.class, 再步过,这时候理应像课程视频一样回到您上面说的第3步,但它直接执行了第3和第4步,输出“我是父类的静态代码块”,跳转到了第5步,后面的是正常的;

    如果在classloader.class继续步入会出现如下图的情况。https://img1.sycdn.imooc.com//climg/61dbb9be09587e4305590491.jpg

    另:

        之前尝试在Animal类前再加一个类断点,是可以正常走到第3、4步,走完debug流程的。

    再另:

        又发现将build path 中的 libraries 从原先的 jdk 改为 jre ,也可以经过3、4步顺利走完,但是没有进入classloader.class,jdk 和 jre 在这里为什么会有区别?


    2022-01-10 12:51:07
  • 好帮手慕小蓝 回复 提问者 roTony #2

    同学你好~

    1.debug直接执行第三和第四步有可能是工具的原因,毕竟工具也是代码写的,很可能会出现一些小瑕疵。同学只需理解对象创建过程即可,不必过于在意测试结果。

    2.同学截图中的问题原因是,ClassLoader类会调用本地代码,而这些代码是没有在src.zip包中的,所以工具也无法查看其源码。这里由于不同JVM实现不同,所用知识过于偏底层,不建议同学花费精力去调试。

    3.jre仅用于运行时,而jdk包含编译时,所以jdk中提供的工具会更加完善,使用jre就会出现有些步骤被跳过。

    祝学习愉快~


    2022-01-10 13:22:45
  • roTony 提问者 回复 好帮手慕小蓝 #3
    好的好的,谢谢老师^_^
    下载视频          
    2022-01-10 13:29:28
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师