【韩顺平Java笔记】第8章:面向对象编程(中级部分)【327-337】

327. 断点调试(Debug)

一个实际需求

  1. 在开发中,程序员在查找错误时,可用断点模式
  2. 在断点调试过程中,是运行状态,是以对象的运行类型来执行的。
    A extends B; B b = new A(); b.xx();//按照运行类型来执行的

断点调试介绍

  1. 断点调试是指在程序的某一步设置一个断点,调试时,程序运行到这一行就会挺住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错代码行即显示错误,停下,进行分析而找到这个Bug。
  2. 断点调试是程序员必须掌握的技能
  3. 断点调试也能帮助我们查看java底层源码的执行过程,提高程序员的Java水平。

断点调试的快捷键

  • F7(跳入):跳入方法体内执行
  • F8(跳过):逐行执行代码
  • shift+F8(跳出):跳出方法
  • F9(resume):执行到下一个断点

328. 断点调试案例1


329. 断点调试案例2

数组越界案例


330. 断点调试案例3

如何追源代码,看看java设计者是怎么实现的。

按F7进入方法体(没进去)

方法1:强制进入方法体

方法2:配置一下就好了


默认情况下不让你进入类的源码中

这次按F7就进入了

真正完成排序的是一个双重快速排序

回到主方法中“Arrays.sort(arr)"的下一行,一层一层跳回去。用shift+F8

331 断点调试案例4

演示如何直接执行到下一个断点F9 resume
断点可以在debug过程中,动态的下断点

动态加断点,然后执行到下一个断点

332. 断点调试案例5

DebugExercise.java

  1. 使用断点调试的方法,追踪下一个对象创建的过程。Person[name ,age, 构造器…]
//演示对象创建过程,加深对调试的理解
public class DebugExecrise {
    public static void main(String[] args) {
        //创建对象的流程
        //(1)加载Person类信息
        //(2)初始化(2.1)默认初始化;(2.2)显示初始化;(2.3)构造器初始化
        //(3)返回对象的地址
        Person jack = new Person("jack", 20);
        System.out.println(jack);
    }
}
class Person{
    private String name;
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}

强制步入


查看toString


333. 断点调试案例6

我们使用断点调试,查看动态绑定机制如何工作。

A.java

package com.masterspark;

public class A {
    public int i = 10;

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }

    public int sum(){
        return getI() + 10;
    }
}

B.java

package com.masterspark;

public class B extends A{
    public int i = 20;
}

Main.java

import com.masterspark.A;
import com.masterspark.B;

import java.util.Arrays;

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
    public static void main(String[] args) {
        //debug动态绑定机制
        A a = new B();
        System.out.println(a.sum());
    }
}

设置断点


进入到父类的sum方法

a本身运行类型是B,它应该找B类的sum方法,但是B类没有sum方法,于是去找父类A类的sum方法,调用getI方法,但是子类没有,又用负类的getI,

属性没有动态绑定机制,所以属性用的是编译类型A的成员,即i为10

所以最后输出的结果是20

334. 零钱通项目介绍

  • 使用 Java 开发 零钱通项目 , 可以完成收益入账,消费,查看明细,退出系统等功能.

界面:

先做过程编程,再写面向对象版本
化繁为简.

  1. 先完成显示菜单,并可以选择
  2. 完成零钱通明细.
  3. 完成收益入账
  4. 消费
  5. 退出

335. 零钱通菜单

完成零钱通菜单
SmallChangeSys.java

package com.masterspark.smallchange;


import java.util.Scanner;

public class SmallChangeSys {
    public static void main(String[] args) {
        //1. 先完成显示菜单,并可以选择菜单,给出对应的提示
        //定义变量
        boolean loop = true;//是否需要循环显示
        Scanner scanner = new Scanner(System.in);
        String key = "";//输入的选择
        do{
            System.out.println("=========零钱通菜单=========");
            System.out.println("\t\t\t1 零钱通明细");
            System.out.println("\t\t\t2 收益入账");
            System.out.println("\t\t\t3 消费情况");
            System.out.println("\t\t\t4 退出系统");
            System.out.print("请选择(1-4)");
            key = scanner.next();
            //使用siwtch分支结构
            switch(key){
                case "1":
                    System.out.println("1 零钱通明细");
                    break;
                case "2":
                    System.out.println("2 收益入账");
                    break;
                case "3":
                    System.out.println("3 消费情况");
                    break;
                case "4":
                    System.out.println("------退出了零钱通-------");
                    loop=false;//退出循环
                    break;
                default:
                    System.out.println("菜单选择有误,请重新选择");
            }
        }while(loop);
    }
}

运行结果:

=========零钱通菜单=========
1 零钱通明细
2 收益入账
3 消费情况
4 退出系统
请选择(1-4)1
1 零钱通明细
=========零钱通菜单=========
1 零钱通明细
2 收益入账
3 消费情况
4 退出系统
请选择(1-4)2
2 收益入账
1 零钱通明细
=========零钱通菜单=========
1 零钱通明细
2 收益入账
3 消费情况
4 退出系统
请选择(1-4)3
3 消费情况
1 零钱通明细
=========零钱通菜单=========
1 零钱通明细
2 收益入账
3 消费情况
4 退出系统
请选择(1-4)d
菜单选择有误,请重新选择
=========零钱通菜单=========
1 零钱通明细
2 收益入账
3 消费情况
4 退出系统
请选择(1-4)4
------退出了零钱通-------

进程已结束,退出代码为 0

336. 零钱通明细

完成零钱通明细。

package com.masterspark.smallchange;


import java.util.Scanner;

public class SmallChangeSys {
    public static void main(String[] args) {
        //1. 先完成显示菜单,并可以选择菜单,给出对应的提示
        //定义变量
        boolean loop = true;//是否需要循环显示
        Scanner scanner = new Scanner(System.in);
        String key = "";//输入的选择
        //完成零钱通明细
        //思路:(1)收益入账和消费保存到数组
        //(2)使用对象完成
        //(3)简单的话使用String拼接
        //使用第三个
        String details = "-------零钱通明细-------";

        do{
            System.out.println("=========零钱通菜单=========");
            System.out.println("\t\t\t1 零钱通明细");
            System.out.println("\t\t\t2 收益入账");
            System.out.println("\t\t\t3 消费情况");
            System.out.println("\t\t\t4 退出系统");
            System.out.print("请选择(1-4)");
            key = scanner.next();
            //使用siwtch分支结构
            switch(key){
                case "1":
                    System.out.println(details);
                    break;
                case "2":
                    System.out.println("2 收益入账");
                    break;
                case "3":
                    System.out.println("3 消费情况");
                    break;
                case "4":
                    System.out.println("------退出了零钱通-------");
                    loop=false;//退出循环
                    break;
                default:
                    System.out.println("菜单选择有误,请重新选择");
            }
        }while(loop);
    }
}

运行结果:
=========零钱通菜单=========
1 零钱通明细
2 收益入账
3 消费情况
4 退出系统
请选择(1-4)1
-------零钱通明细-------
=========零钱通菜单=========
1 零钱通明细
2 收益入账
3 消费情况
4 退出系统
请选择(1-4)4
------退出了零钱通-------

进程已结束,退出代码为 0

337 零钱通收益

完成收益入账

package com.masterspark.smallchange;


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class SmallChangeSys {
    public static void main(String[] args) {
        //1. 先完成显示菜单,并可以选择菜单,给出对应的提示
        //定义变量
        boolean loop = true;//是否需要循环显示
        Scanner scanner = new Scanner(System.in);
        String key = "";//输入的选择
        //完成零钱通明细
        //思路:(1)收益入账和消费保存到数组
        //(2)使用对象完成
        //(3)简单的话使用String拼接
        //使用第三个
        String details = "-------零钱通明细-------";
        //3. 完成收益入账
        //思路:定义新的变量,完成功能驱动程序员增加新的变化和代码
        double money = 0.0;
        double balance = 0.0;//🈷
        Date date = null;//data是java.util.date类型
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");//可以用于日期格式化的对象
        do{
            System.out.println("=========零钱通菜单=========");
            System.out.println("\t\t\t1 零钱通明细");
            System.out.println("\t\t\t2 收益入账");
            System.out.println("\t\t\t3 消费情况");
            System.out.println("\t\t\t4 退出系统");
            System.out.print("请选择(1-4)");
            key = scanner.next();
            //使用siwtch分支结构
            switch(key){
                case "1":
                    System.out.println(details);
                    break;
                case "2":
                    System.out.print("收1益入账金额:");
                    money = scanner.nextDouble();
                    //money的值的范围应该校验一下
                    //一会再完善
                    balance += money;
                    //拼接收益入账信息到details
                    date  = new Date();//获取当前的日期
                    details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" +balance;
                    System.out.println(details);
                    break;
                case "3":
                    System.out.println("3 消费情况");
                    break;
                case "4":
                    System.out.println("------退出了零钱通-------");
                    loop=false;//退出循环
                    break;
                default:
                    System.out.println("菜单选择有误,请重新选择");
            }
        }while(loop);
    }
}

运行结果:
=========零钱通菜单=========
1 零钱通明细
2 收益入账
3 消费情况
4 退出系统
请选择(1-4)2
收益入账金额:114514
-------零钱通明细-------
收益入账 +114514.0 2025-01-13 11:23 114514.0
=========零钱通菜单=========
1 零钱通明细
2 收益入账
3 消费情况
4 退出系统
请选择(1-4)2
收益入账金额:1919
-------零钱通明细-------
收益入账 +114514.0 2025-01-13 11:23 114514.0
收益入账 +1919.0 2025-01-13 11:23 116433.0
=========零钱通菜单=========
1 零钱通明细
2 收益入账
3 消费情况
4 退出系统
请选择(1-4)2
收益入账金额:10
-------零钱通明细-------
收益入账 +114514.0 2025-01-13 11:23 114514.0
收益入账 +1919.0 2025-01-13 11:23 116433.0
收益入账 +10.0 2025-01-13 11:24 116443.0
=========零钱通菜单=========
1 零钱通明细
2 收益入账
3 消费情况
4 退出系统
请选择(1-4)1
-------零钱通明细-------
收益入账 +114514.0 2025-01-13 11:23 114514.0
收益入账 +1919.0 2025-01-13 11:23 116433.0
收益入账 +10.0 2025-01-13 11:24 116443.0
=========零钱通菜单=========
1 零钱通明细
2 收益入账
3 消费情况
4 退出系统
请选择(1-4)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954408.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt 各版本选择

嵌入式推荐用 Qt4.8&#xff0c;打包的程序小&#xff1a;Qt4.8.7是Qt4的终结版本&#xff0c;是Qt4系列版本中最稳定最经典的 最后支持xp系统的长期支持版本&#xff1a;Qt5.6.3&#xff1b;Qt5.7.0是最后支持xp系统的非长期支持版本。 最后提供mysql数据库插件的版本&#xf…

常见好用的PHP CMS开源系统有哪些?

开源的系统&#xff0c;网站大家估计也见过很多&#xff0c;尤其是用PHP写的开源系统也很受用户们欢迎&#xff0c;这类系统通常以简单、使用、开源为优势&#xff0c;为用户提供更好的服务。以下就为大家介绍几个常见且好用的PHP CMS开源系统。欢迎补充&#xff01; 1、WordP…

DuckDB:精通Insert语句处理数据冲突

本文介绍DuckDB insert语句用法&#xff0c;包括常规的批量插入&#xff0c;尤其是插入数据冲突的处理&#xff0c;最后还提及returning子句的用法&#xff0c;每个用法提供示例说明。 insert插入数据 INSERT INTO向表中插入新行。可以插入由值表达式指定的一行或多行&#xf…

【spring mvc】文件上传、下载

文件上传&#xff0c;存储至本地目录中 一、代码1、工具类&#xff08;敏感后缀过滤&#xff09;2、文件上传&#xff0c;存储至本地3、文件下载 二、效果演示1、上传1.1、postMan 请求1.2、上传效果 2、下载2.1、下载效果 一、代码 1、工具类&#xff08;敏感后缀过滤&#x…

Ansible实战:如何正确选择 command 和shell模块?

在使用Ansible进行自动化运维时&#xff0c;command 和 shell 模块是我们执行命令的好帮手。虽然它们看起来很相似&#xff0c;但在功能特性和适用场景上其实有着明显的不同。正确选择合适的模块不仅能够提高任务的效率&#xff0c;还能帮助我们规避一些潜在的风险。在这篇文章…

手撕Transformer -- Day7 -- Decoder

手撕Transformer – Day7 – Decoder Transformer 网络结构图 目录 手撕Transformer -- Day7 -- DecoderTransformer 网络结构图Decoder 代码Part1 库函数Part2 实现一个解码器Decoder&#xff0c;作为一个类Part3 测试 参考 Transformer 网络结构 Decoder 代码 Part1 库函数…

UI自动化测试:异常截图和page_source

自动化测试过程中&#xff0c;是否遇到过脚本执行中途出错却不知道原因的情况&#xff1f;测试人员面临的不仅是问题的复现&#xff0c;还有对错误的快速定位和分析。而异常截图与页面源码&#xff08;Page Source&#xff09;的结合&#xff0c;正是解决这一难题的利器。 在实…

Unity-Mirror网络框架-从入门到精通之RigidbodyBenchmark示例

文章目录 前言示例代码逻辑测试结论性能影响因素最后前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计,它…

【Unity3D】【已解决】TextMeshPro无法显示中文的解决方法

TextMeshPro无法显示中文的解决方法 现象解决方法Assets 目录中新建一个字体文件夹在C:\Windows\Fonts 中随便找一个中文字体的字体文件把字体文件拖到第一步创建的文件夹中右键导入的字体&#xff0c;Create---TextMeshPro---Font Asset&#xff0c;创建字体文件资源把 SDF文件…

走出实验室的人形机器人,将复刻ChatGPT之路?

1月7日&#xff0c;在2025年CES电子展现场&#xff0c;黄仁勋不仅展示了他全新的皮衣和采用Blackwell架构的RTX 50系列显卡&#xff0c;更进一步展现了他对于机器人技术领域&#xff0c;特别是人形机器人和通用机器人技术的笃信。黄仁勋认为机器人即将迎来ChatGPT般的突破&…

Docker PG流复制搭建实操

目录标题 制作镜像1. 删除旧的容器2. 创建并配置容器3. 初始化数据库并启动 主库配置参数4. 配置主库5. 修改 postgresql.conf 配置 备库配置参数6. 创建并配置备库容器7. 初始化备库 流复制8. 配置&检查主库复制状态9. 检查备库配置 优化建议问题1&#xff1a;FATAL: usin…

【Flink】Flink内存管理

Flink内存整体结构图&#xff1a; JobManager内存管理 JVM 进程总内存(Total Process Memory)Flink总内存(Total Flink Memory)&#xff1a;JVM进程总内存减去JVM Metaspace(元空间)和JVM Overhead(运行时开销)上图解释&#xff1a; JVM进程总内存为2G;JVM运行时开销(JVM Overh…

Flink系统知识讲解之:Flink内存管理详解

Flink系统知识讲解之&#xff1a;Flink内存管理详解 在现阶段&#xff0c;大部分开源的大数据计算引擎都是用Java或者是基于JVM的编程语言实现的&#xff0c;如Apache Hadoop、Apache Spark、Apache Drill、Apache Flink等。Java语言的好处是不用考虑底层&#xff0c;降低了程…

VM(虚拟机)和Linux的安装

文章目录 1.虚拟机1.1 VM的安装和删除1.1.1 安装前提1.1.2 安装步骤 1.2 虚拟机快照1.3 虚拟机的克隆 2.Linux的安装2.1 CentOS2.2 Ubuntu 1.虚拟机 &#xff08;1&#xff09;Linux系统的安装方式 ①物理机安装&#xff1a;直接将操作系统安装到服务器硬件上 ②虚拟机安装&am…

Unity中实现倒计时结束后干一些事情

问题描述&#xff1a;如果我们想实现在一个倒计时结束后可以执行某个方法&#xff0c;比如挑战成功或者挑战失败&#xff0c;或者其他什么的比如生成boss之类的功能&#xff0c;而且你又不想每次都把代码复制一遍&#xff0c;那么就可以用下面这种方法。 结构 实现步骤 创建一…

citrix netscaler13.1 重写负载均衡响应头(基础版)

在 Citrix NetScaler 13.1 中&#xff0c;Rewrite Actions 用于对负载均衡响应进行修改&#xff0c;包括替换、删除和插入 HTTP 响应头。这些操作可以通过自定义策略来完成&#xff0c;帮助你根据需求调整请求内容。以下是三种常见的操作&#xff1a; 1. Replace (替换响应头)…

新垂直电商的社交传播策略与AI智能名片2+1链动模式S2B2C商城小程序的应用探索

摘要&#xff1a;随着互联网技术的不断进步和电商行业的快速发展&#xff0c;传统电商模式已难以满足消费者日益增长的个性化和多元化需求。新垂直电商在此背景下应运而生&#xff0c;通过精准定位、用户细分以及深度社交传播策略&#xff0c;实现了用户群体的快速裂变与高效营…

TP4056锂电池充放电芯片教程文章详解·内置驱动电路资源!!!

目录 TP4056工作原理 TP4056引脚详解 TP4056驱动电路图 锂电池充放电板子绘制 编写不易&#xff0c;仅供学习&#xff0c;感谢理解。 TP4056工作原理 TP4056是专门为单节锂电池或锂聚合物电池设计的线性充电器&#xff0c;充电电流可以用外部电阻设定&#xff0c;最大充电…

burpsiute的基础使用(2)

爆破模块&#xff08;intruder&#xff09;&#xff1a; csrf请求伪造访问&#xff08;模拟攻击&#xff09;: 方法一&#xff1a; 通过burp将修改&#xff0c;删除等行为的数据包压缩成一个可访问链接&#xff0c;通过本地浏览器访问&#xff08;该浏览器用户处于登陆状态&a…

基于32QAM的载波同步和定时同步性能仿真,包括Costas环的gardner环

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 载波同步是…