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

news2025/1/14 14:11:05

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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

金融项目实战 01|功能测试分析与设计

前置内容&#xff1a;金融项目准备的内容笔记可直接看如下笔记 只看&#xff1a;一、投资专业术语 和 二、项目简介 两部分文章浏览阅读2.3k次&#xff0c;点赞70次&#xff0c;收藏67次。安享智慧理财金融系统测试项目&#xff0c;测试用例&#xff0c;接口测试&#xff0c;金…

学习threejs,使用TrackballControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.TrackballControls 相…

ASP.NET Core - .NET 6 以上版本的入口文件

ASP.NET Core - .NET 6 以上版本的入口文件 自从.NET 6 开始&#xff0c;微软对应用的入口文件进行了调整&#xff0c;移除了 Main 方法和 Startup 文件&#xff0c;使用顶级语句的写法&#xff0c;将应用初始化的相关配置和操作全部集中在 Program.cs 文件中&#xff0c;如下&…

html5各行各业官网模板源码下载 (4)

文章目录 1.来源2.源码模板2.1 html实现酷炫美观的可视化大屏(十种风格示例&#xff0c;附源码)2.2 HTML5实现古典音乐网站源码模板22.3 HTML5实现古典音乐网站源码模板32.4 HTML5实现小鸟过管道小游戏源码2.5 HTML5实现俄罗斯方块小游戏2.5 HTML5实现剪刀石头布小游戏(附源码)…

springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)

线上预览: 移动端 http://8.146.211.120:8081/ 管理端 http://8.146.211.120:8088/ 小红书凭借优秀的产品体验 和超高人气 目前成为笔记类产品佼佼者 此项目将详细介绍如何使用Vue.js和Spring Boot 集合uniapp 开发一个仿小红书应用&#xff0c;凭借uniapp 可以在h5 小程序 app…

播放音频文件同步音频文本

播放音频同步音频文本 对应单个文本高亮显示 使用audio音频文件对应音频文本资源 音频文本内容&#xff08;Json&#xff09; [{"end": 4875,"index": 0,"speaker": 0,"start": 30,"text": "70号二啊,","tex…

数据分析-使用Excel透视图/表分析禅道数据

背景 禅道&#xff0c;是目前国内用得比较多的研发项目管理系统&#xff0c;我们常常会用它进行需求管理&#xff0c;缺陷跟踪&#xff0c;甚至软件全流程的管理&#xff0c;如果能将平台上的数据结公司的实际情况进行合理的分析利用&#xff0c;相信会给我们的项目复盘总结带来…

No. 31 笔记 | Web安全-SQL手工注入技术学习 Part 2

一、研究背景 背景介绍 SQL注入是一种常见且高危的Web安全漏洞。攻击者可以通过构造恶意SQL查询语句来绕过验证机制&#xff0c;执行未授权操作&#xff0c;如获取敏感信息、篡改数据库内容甚至控制服务器。 研究内容 本笔记探讨以下数据库的手工注入技术&#xff1a; MySQLAc…

基于FPGA的多功能数字钟设计

基于FPGA的多功能数字钟设计 前言基础知识按键数码管 系统概述按键使用说明模块描述模块设计button_debouncebutton_controllerclock_controllerdigital_tube 整体资源用量测试视频 前言 本工程主要是数码管、按键、LED的应用开发。 注&#xff1a;本工程所有IP均使用源码开发…

人工智能实验(五)-基于神经网络的模式识别实验

一、实验目的 理解BP神经网络的结构和原理&#xff0c;掌握反向传播算法对神经元的训练过程&#xff0c;了解反向传播公式。通过构建BP网络模式识别实例&#xff0c;熟悉BP网络的原理及结构 二、实验内容 基于提供的数据集&#xff0c;训练1个BP神经网络模型&#xff1a; 1. …

【伪随机数】关于排序算法自测如何生成随机数而引发的……

以 Random 开始 可能一开始&#xff0c;你只是写到了排序算法如何生成随机数 public static void main(String[] args) {Random random new Random();int[] nums new int[10];for (int i 0; i < nums.length; i) {nums[i] random.nextInt(100);}System.out.println(&q…

【LeetCode】力扣刷题热题100道(26-30题)附源码 轮转数组 乘积 矩阵 螺旋矩阵 旋转图像(C++)

目录 1.轮转数组 2.除自身以外数组的乘积 3.矩阵置零 4.螺旋矩阵 5.旋转图像 1.轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 class Solution { public:void rotate(vector<int>& nums, int k) …

IDEA中创建maven项目

1. IDEA中创建maven项目 在IDEA中创建Maven项目&#xff0c;前提是已经安装配置好Maven环境。如还未配置安装Maven的&#xff0c;请先下载安装。如何下载安装&#xff0c;可参考我另外篇文章&#xff1a;maven的下载与安装教程本篇教程是以创建基于servlet的JavaWeb项目为例子&…

【PyQt】如何在mainwindow中添加菜单栏

[toc]如何在mainwindow中添加菜单栏 如何在mainwindow中添加菜单栏 主要有两种方法&#xff1a; 1.直接创建mainwindow进行添加 2.使用ui文件加载添加 第二种方法更为常见&#xff0c;可以应用到实际 1.直接创建mainwindow进行添加 import sysfrom PyQt5.QtWidgets import …

Kubernetes1.28 编译 kubeadm修改证书有效期到 100年.并更新k8s集群证书

文章目录 前言一、资源准备1. 下载对应源码2.安装编译工具3.安装并设置golang 二、修改证书有效期1.修改证书有效期2.修改 CA 证书有效期 三、编译kubeadm四、使用新kubeadm方式1.当部署新集群时,使用该kubeadm进行初始化2.替换现有集群kubeadm操作 前言 kubeadm 默认证书为一…

Web前端:JavaScript标识符与变量

JavaScript介绍 JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”&#xff0c;指的是它不具备开发操作系统的能力&#xff0c;而是只用来编写控制其他大型应用程序的“脚本”。 JavaScript 是一种嵌入式&#xff08;embedded&#xff09;语言。它本身提供的核心语法不算…

【从零开始使用系列】StyleGAN2:开源图像生成网络——环境搭建与基础使用篇(附大量测试图)

StyleGAN2 是英伟达团队 NVIDIA 提出的生成对抗网络&#xff08;GAN&#xff09;的一种改进版本。 它通过创新的网络架构&#xff0c;能够生成细节丰富、逼真的图像&#xff0c;特别在高频细节&#xff08;如皮肤纹理、光照等&#xff09;的表现上表现卓越。与传统 GAN 相比&am…

【时时三省】(C语言基础)经典笔试题2

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 题目 这个代码有什么问题&#xff1f; 过程&#xff1a; 从主函数开始进入Test函数&#xff0c;在这个Test函数里面&#xff0c;创建了一个str指针变量&#xff0c;str里面放了一个空指针&…

Therabody 与Garmin联手,共同推进运动恢复与健康科技新突破

本次合作以数据整合、人工智能驱动的数字教练与科学研究为重点&#xff0c;旨在更好地了解科学恢复对运动表现的影响 &#xff08;2025年1月13日&#xff0c;中国上海&#xff09;全球健康领导者Therabody宣布与智能手表品牌Garmin佳明建立战略合作关系&#xff0c;共同致力于…

vue城市道路交通流量预测可视化系统

项目亮点 编号&#xff1a;R09 &#x1f687; 网站大屏管理三大前端、vuespringbootmysql、前后端分离架构 &#x1f687; 流量预测道路查询流量查询 &#x1f687; echarts可视化、地图流量分析、限流分析、站点流量分析等 &#x1f687; 管理员可以进行、用户管理、道路信息…