目录
一个实际需求
在断点调试过程中是以对象的运行类型来执行的。
断点调试介绍
断点调试的快捷键
F7跳入方法,F8逐行执行代码,shift+F8跳出方法,F9resume执行到下一个断点。
代码调试示意图
浅蓝色像是被荧光笔划的的那个区域表示代码执行到当前行。
在下方我们可以看到各个变量的情况,使用console还可以切换到输出控制台看程序输出的情况。
断点调试案例1
在左边的行数上进行单击,那一行就会变红代表断点。再点击一次就会取消这个断点。
点击Debug开始调试。
step over代表逐行执行。
step into进入方法。
force step into表示强制进入方法。
step out跳出方法。
resume program可以直接执行到下一个断点。
停止debug。
点击F8程序就会不断的执行。
断点调试案例2
将鼠标光标放在数组上点击加号。
可以看到数组的情况。
这里args.length的值为0。
更改后,输出arr【3】时就会报错,因为不存在,数组越界了。
断点调试案例3
可以使用F7跳入方法,查看源码。
但是使用F7没跳入进去。
默认是不让我们进入的,配置一下就行了。
java的sort方法使用的是双重排序 。
那我们怎么回到原来的代码呢?
使用shift+F8快速的跳出方法。
连续跳出两次回来,发现数组已经被排序好了。
断点调试案例4
可以事先下好断点,也可以debug的同时下断点。
执行之前有两个断点。
使用resume(F9快捷键)可以直接到下一个断点的位置,断点是可以在debug的过程中实时添加的
在jdk的源码里也支持下断点。
断点调试练习1
创建一个类person,有构造器。
重写toString方法。直接输出对象。
创建对象的流程:第一步加载类信息,第二步先默认初始化再显式初始化再构造器初始化,第三步返回对象的地址。
直接强制进入。
进行类的加载。
默认初始化和显示初始化看不到,接下来直接到构造器初始化。
传进来的name为jack,age为20,当前的name为null,age为0。
再看jack的输出。
进入再进入可以看到,如果obj不为空就调用obj的toString方法,我们传入的obj类型为person,所以可以调用我们重写后的toString方法。
断点调试练习2
直接进入了父类里的sum(实际上是先找子类的sum,发现没有,再去父类找,结果找到了)
geti跑到子类来了是由于动态绑定机制,它的运行类型为子类,且geti是一个方法,所以会先去子类找。