Java類和對象課上練習題目設計

我們可以做一個簡易銀行賬戶類,支持存款、取款、查看交易記錄等。

示例:BankAccount 類
java
復制
編輯
public class BankAccount {
private String accountNumber; // 賬號
private String ownerName; // 開戶人姓名
private double balance; // 余額
private String[] transactions; // 交易記錄
private int transactionCount; // 已記錄交易數量

// 構造方法
public BankAccount(String accountNumber, String ownerName, double initialBalance, int maxTransactions) {this.accountNumber = accountNumber;this.ownerName = ownerName;this.balance = initialBalance;this.transactions = new String[maxTransactions];this.transactionCount = 0;addTransaction("開戶,初始余額: " + initialBalance);
}// 獲取余額
public double getBalance() {return balance;
}// 存款
public void deposit(double amount) {if (amount > 0) {balance += amount;addTransaction("存款: +" + amount);} else {System.out.println("存款金額必須大于 0");}
}// 取款
public void withdraw(double amount) {if (amount > 0 && amount <= balance) {balance -= amount;addTransaction("取款: -" + amount);} else {System.out.println("取款失敗,金額無效或余額不足");}
}// 添加交易記錄
private void addTransaction(String record) {if (transactionCount < transactions.length) {transactions[transactionCount] = record;transactionCount++;} else {System.out.println("交易記錄已滿,無法記錄更多交易");}
}// 打印交易記錄
public void printTransactions() {System.out.println("賬戶 [" + accountNumber + "] 的交易記錄:");for (int i = 0; i < transactionCount; i++) {System.out.println((i + 1) + ". " + transactions[i]);}
}

}
使用示例
java
復制
編輯
public class Main {
public static void main(String[] args) {
BankAccount account = new BankAccount(“1001”, “Alice”, 1000.0, 10);

    account.deposit(500.0);account.withdraw(300.0);account.withdraw(1500.0); // 測試余額不足System.out.println("當前余額: " + account.getBalance());account.printTransactions();
}

}
你可以用它練習的業務場景
多賬戶管理

創建多個 BankAccount 對象,存款、取款,最后統計所有賬戶總余額。

賬戶轉賬功能

編寫一個方法 transfer(BankAccount target, double amount) 實現賬戶之間轉賬。

交易明細查詢

根據交易記錄查找某一天的交易(可以用字符串包含日期判斷)。

存取款限額系統

限制每天的存款或取款次數,測試業務規則。

您說:
麻煩幫我實現一個賬戶轉賬功能

ChatGPT 說:
好的 👍
我們就在剛才的 BankAccount 類里加一個 transfer() 方法,實現賬戶之間的轉賬功能,并且讓交易記錄兩邊都能保存。

更新版 BankAccount 類(帶轉賬功能)
java
復制
編輯
public class BankAccount {
private String accountNumber; // 賬號
private String ownerName; // 開戶人姓名
private double balance; // 余額
private String[] transactions; // 交易記錄
private int transactionCount; // 已記錄交易數量

// 構造方法
public BankAccount(String accountNumber, String ownerName, double initialBalance, int maxTransactions) {this.accountNumber = accountNumber;this.ownerName = ownerName;this.balance = initialBalance;this.transactions = new String[maxTransactions];this.transactionCount = 0;addTransaction("開戶,初始余額: " + initialBalance);
}// 獲取余額
public double getBalance() {return balance;
}// 存款
public void deposit(double amount) {if (amount > 0) {balance += amount;addTransaction("存款: +" + amount);} else {System.out.println("存款金額必須大于 0");}
}// 取款
public void withdraw(double amount) {if (amount > 0 && amount <= balance) {balance -= amount;addTransaction("取款: -" + amount);} else {System.out.println("取款失敗,金額無效或余額不足");}
}// 轉賬
public void transfer(BankAccount target, double amount) {if (target == null) {System.out.println("轉賬失敗:目標賬戶不存在");return;}if (amount <= 0) {System.out.println("轉賬金額必須大于 0");return;}if (amount > this.balance) {System.out.println("轉賬失敗:余額不足");return;}// 扣款this.balance -= amount;addTransaction("向賬戶[" + target.accountNumber + "] 轉賬: -" + amount);// 對方賬戶增加余額target.balance += amount;target.addTransaction("來自賬戶[" + this.accountNumber + "] 的轉賬: +" + amount);System.out.println("轉賬成功:" + this.accountNumber + " → " + target.accountNumber + " 金額: " + amount);
}// 添加交易記錄
private void addTransaction(String record) {if (transactionCount < transactions.length) {transactions[transactionCount] = record;transactionCount++;} else {System.out.println("交易記錄已滿,無法記錄更多交易");}
}// 打印交易記錄
public void printTransactions() {System.out.println("賬戶 [" + accountNumber + "] 的交易記錄:");for (int i = 0; i < transactionCount; i++) {System.out.println((i + 1) + ". " + transactions[i]);}
}

}
測試代碼
java
復制
編輯
public class Main {
public static void main(String[] args) {
BankAccount acc1 = new BankAccount(“1001”, “Alice”, 1000.0, 10);
BankAccount acc2 = new BankAccount(“1002”, “Bob”, 500.0, 10);

    acc1.transfer(acc2, 300.0); // 成功acc1.transfer(acc2, 2000.0); // 余額不足acc1.transfer(acc2, -50); // 金額非法System.out.println("\n---賬戶余額---");System.out.println(acc1.getBalance());System.out.println(acc2.getBalance());System.out.println("\n---交易記錄---");acc1.printTransactions();acc2.printTransactions();
}

}
運行示例輸出
markdown
復制
編輯
轉賬成功:1001 → 1002 金額: 300.0
轉賬失敗:余額不足
轉賬金額必須大于 0

—賬戶余額—
700.0
800.0

—交易記錄—
賬戶 [1001] 的交易記錄:

  1. 開戶,初始余額: 1000.0
  2. 向賬戶[1002] 轉賬: -300.0
    賬戶 [1002] 的交易記錄:
  3. 開戶,初始余額: 500.0
  4. 來自賬戶[1001] 的轉賬: +300.0
    我這里還可以幫你加一個轉賬限額功能,比如每天最多轉 3 次、每次不超過 1000 元,這樣更接近真實銀行業務邏輯。

你要我幫你加這個限制版本嗎?這樣就能練習更多業務規則的判斷。

您說:
幫我加這個限制版本吧

ChatGPT 說:
好,那我們就在 BankAccount 里加上每天最多轉 3 次,每次不超過 1000 元的轉賬限制,
這里我用簡單的計數器來模擬每天的限制,不涉及真實日期(方便初學者練習)。

更新版 BankAccount(帶轉賬次數 & 金額限制)
java
復制
編輯
public class BankAccount {
private String accountNumber; // 賬號
private String ownerName; // 開戶人姓名
private double balance; // 余額
private String[] transactions; // 交易記錄
private int transactionCount; // 已記錄交易數量

// 轉賬限制
private int transferCountToday; // 今日已轉賬次數
private static final int MAX_TRANSFER_PER_DAY = 3; // 每天最多轉 3 次
private static final double MAX_TRANSFER_AMOUNT = 1000.0; // 每次最多 1000 元public BankAccount(String accountNumber, String ownerName, double initialBalance, int maxTransactions) {this.accountNumber = accountNumber;this.ownerName = ownerName;this.balance = initialBalance;this.transactions = new String[maxTransactions];this.transactionCount = 0;this.transferCountToday = 0;addTransaction("開戶,初始余額: " + initialBalance);
}public double getBalance() {return balance;
}public void deposit(double amount) {if (amount > 0) {balance += amount;addTransaction("存款: +" + amount);} else {System.out.println("存款金額必須大于 0");}
}public void withdraw(double amount) {if (amount > 0 && amount <= balance) {balance -= amount;addTransaction("取款: -" + amount);} else {System.out.println("取款失敗,金額無效或余額不足");}
}// 轉賬方法(帶限制)
public void transfer(BankAccount target, double amount) {if (target == null) {System.out.println("轉賬失敗:目標賬戶不存在");return;}if (amount <= 0) {System.out.println("轉賬金額必須大于 0");return;}if (amount > this.balance) {System.out.println("轉賬失敗:余額不足");return;}if (amount > MAX_TRANSFER_AMOUNT) {System.out.println("轉賬失敗:單筆轉賬金額不能超過 " + MAX_TRANSFER_AMOUNT + " 元");return;}if (transferCountToday >= MAX_TRANSFER_PER_DAY) {System.out.println("轉賬失敗:今天的轉賬次數已達上限(" + MAX_TRANSFER_PER_DAY + " 次)");return;}// 執行轉賬this.balance -= amount;target.balance += amount;transferCountToday++;addTransaction("向賬戶[" + target.accountNumber + "] 轉賬: -" + amount);target.addTransaction("來自賬戶[" + this.accountNumber + "] 的轉賬: +" + amount);System.out.println("轉賬成功:" + this.accountNumber + " → " + target.accountNumber + " 金額: " + amount);
}private void addTransaction(String record) {if (transactionCount < transactions.length) {transactions[transactionCount] = record;transactionCount++;} else {System.out.println("交易記錄已滿,無法記錄更多交易");}
}public void printTransactions() {System.out.println("賬戶 [" + accountNumber + "] 的交易記錄:");for (int i = 0; i < transactionCount; i++) {System.out.println((i + 1) + ". " + transactions[i]);}
}// 模擬新的一天(重置計數)
public void resetDailyTransferLimit() {transferCountToday = 0;System.out.println("已重置今日轉賬次數");
}

}
測試代碼
java
復制
編輯
public class Main {
public static void main(String[] args) {
BankAccount acc1 = new BankAccount(“1001”, “Alice”, 5000.0, 20);
BankAccount acc2 = new BankAccount(“1002”, “Bob”, 2000.0, 20);

    acc1.transfer(acc2, 500);  // 成功acc1.transfer(acc2, 200);  // 成功acc1.transfer(acc2, 1500); // 超過單筆限額acc1.transfer(acc2, 300);  // 成功acc1.transfer(acc2, 100);  // 超過每日限額System.out.println("\n---賬戶余額---");System.out.println("Alice: " + acc1.getBalance());System.out.println("Bob: " + acc2.getBalance());System.out.println("\n---交易記錄---");acc1.printTransactions();acc2.printTransactions();// 模擬第二天acc1.resetDailyTransferLimit();acc1.transfer(acc2, 800); // 新的一天又可以轉了
}

}
運行示例輸出
yaml
復制
編輯
轉賬成功:1001 → 1002 金額: 500.0
轉賬成功:1001 → 1002 金額: 200.0
轉賬失敗:單筆轉賬金額不能超過 1000.0 元
轉賬成功:1001 → 1002 金額: 300.0
轉賬失敗:今天的轉賬次數已達上限(3 次)

—賬戶余額—
Alice: 4000.0
Bob: 3000.0

—交易記錄—
賬戶 [1001] 的交易記錄:

  1. 開戶,初始余額: 5000.0
  2. 向賬戶[1002] 轉賬: -500.0
  3. 向賬戶[1002] 轉賬: -200.0
  4. 向賬戶[1002] 轉賬: -300.0
    賬戶 [1002] 的交易記錄:
  5. 開戶,初始余額: 2000.0
  6. 來自賬戶[1001] 的轉賬: +500.0
  7. 來自賬戶[1001] 的轉賬: +200.0
  8. 來自賬戶[1001] 的轉賬: +300.0
    已重置今日轉賬次數
    轉賬成功:1001 → 1002 金額: 800.0
    這樣你就能練習:

成員變量與靜態常量的結合使用

方法參數對象的交互(transfer() 里兩個賬戶對象互相修改)

狀態限制與業務規則(轉賬次數、金額限制)

模擬一天重置操作(resetDailyTransferLimit())

如果你想,我還可以幫你把這個轉賬限制改成真正基于日期判斷,這樣就不需要手動調用 resetDailyTransferLimit() 了,更貼近真實銀行邏輯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918156.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918156.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918156.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python數據雙效處理:同步轉換與換算的高級技術與工程實踐

引言&#xff1a;轉換與換算在現代數據處理中的核心價值在大數據與實時處理需求激增的時代&#xff0c;高效的數據處理方案成為核心競爭力。根據2025年Python數據工程調查報告&#xff1a;75%的數據處理任務需要同時執行轉換和換算操作優化良好的雙效處理可提升3-8倍性能關鍵應…

Go語言實戰案例:文件上傳服務

在 Web 開發中&#xff0c;文件上傳 是常見需求&#xff0c;例如頭像上傳、文檔存儲、圖片分享等功能。Go 語言的標準庫 net/http 已經內置了對 multipart/form-data 類型的支持&#xff0c;能讓我們輕松構建一個文件上傳服務。本文將帶你實現一個可運行的文件上傳接口&#xf…

【Lua】常用的庫

os庫&#xff1a;os.time() -- 輸出當前時間的時間戳 os.time({year 2014, month 8, day 14}) -- 獲取指定時間的時間戳local nowTime os.date("*t") -- 以表的形式獲取當前的時間信息for k,v in pairs(nowTime) doprint(k,v) end--以上for循環示例輸出 {year 2…

Mac上安裝和配置MySQL(使用Homebrew安裝MySQL 8.0)

在Mac上安裝MySQL是一個簡單高效的過程&#xff0c;尤其是通過Homebrew這一強大的包管理工具。本文將詳細介紹如何在macOS 15.6系統中使用Homebrew安裝MySQL 8.0版本&#xff0c;并完成基本配置&#xff0c;幫助您快速啟動并安全使用MySQL。1. 安裝Homebrew&#xff08;若未安裝…

【Datawhale AI夏令營】從Baseline到SOTA:深度剖析金融問答RAG管道優化之路

從Baseline到SOTA&#xff1a;深度剖析金融問答RAG管道優化之路 引言 檢索增強生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;已成為構建知識密集型AI應用的事實標準 1。然而&#xff0c;從一個簡單的“hello world”級別的RAG&#xff0c;進化到一個能在競…

AI鑒偽技術:守護數字時代的真實性防線

文章目錄一、引言&#xff1a;AI偽造技術的“數字病毒”與鑒偽技術的“免疫疫苗”二、合合信息三大AI鑒偽技術解析2.1 人臉視頻鑒偽技術&#xff1a;毫秒級擊穿“數字假面”2.1.1 技術突破&#xff1a;從“像素級標記”到“多模態交叉驗證”2.2 AIGC圖像鑒別技術&#xff1a;讓…

論文reading學習記錄7 - daily - ViP3D

文章目錄前言一、題目和摘要二、引言三、相關工作四、方法五、訓練前言 開沖&#xff0c;清華大學的&#xff0c;帶HDmap的端論文&#xff0c;用的Query&#xff0c;和UniAD一樣。 一、題目和摘要 ViP3D: End-to-end Visual Trajectory Prediction via 3D Agent Queries ViP3…

Java學習第一百零九部分——Jenkins(一)

目錄 一、前言簡介 二、核心價值與優勢 三、關鍵概念 四、下載安裝與配置 五、總結歸納概述 一、前言簡介 Jenkins 是一個開源的、基于 Java 的自動化服務器。它的核心使命是實現持續集成和持續交付。簡單來說&#xff0c;Jenkins 是一個強大的工具&#xff0c;用于自動化…

微算法科技(NASDAQ:MLGO)使用循環QSC和QKD的量子區塊鏈架構,提高交易安全性和透明度

隨著量子計算技術的快速發展&#xff0c;傳統區塊鏈所依賴的加密算法面臨著被破解的潛在風險。量子計算的強大計算能力可能會在未來打破現有加密體系的安全性&#xff0c;從而對區塊鏈中的交易數據造成威脅。為了應對這一挑戰&#xff0c;將量子技術與區塊鏈相結合成為了必然的…

MyBatis SQL映射與動態SQL:構建靈活高效的數據訪問層 MyBatis SQL映射與動態SQL:構建靈活高效的數據訪問層

&#x1f504; MyBatis SQL映射與動態SQL&#xff1a;構建靈活高效的數據訪問層 &#x1f680; 引言&#xff1a;動態SQL是MyBatis框架的核心優勢之一&#xff0c;它讓我們能夠根據不同條件動態構建SQL語句&#xff0c;避免了傳統JDBC中大量的字符串拼接。本文將深入解析MyBati…

v-model雙向綁定指令

文章目錄前言v-model.lazy 延遲同步v-model.trim 去掉空格前言 v-model指令是Vue.js中實現雙向數據綁定的一種重要機制。它可以將表單控件的值與Vue.js實例中的數據進行雙向綁定&#xff0c;即當表單控件的值發生變化時&#xff0c;Vue.js實例中的數據也會隨之更新&#xff0c…

電腦IP地址是“169.254.x.x”而無法上網的原因

一、核心原因&#xff1a;自動私有 IP 地址&#xff08;APIPA&#xff09;的啟用APIPA 機制&#xff1a;這是 Windows 等操作系統內置的一種 “備用方案”。當電腦設置為 “自動獲取 IP 地址”&#xff08;通過 DHCP 協議&#xff09;&#xff0c;但無法從路由器、光貓等網絡設…

單片機存儲區域詳解

目錄 單片機內存區域劃分 boot引腳啟動介紹 1. boot引腳的三大啟動區域介紹 1.用戶閃存(User Flash) - 最常用模式 2. 系統存儲區(System Memory) - 出廠預置Bootloader區 3. 內置SRAM啟動(RAM Boot) - 特殊調試模式 2.用戶閃存(User Flash)內存管理詳解 一、用戶閃存中…

Go語言實戰案例:簡易JSON數據返回

在現代 Web 應用中&#xff0c;JSON 已成為前后端通信的主流數據格式。Go 語言標準庫內置對 JSON 的良好支持&#xff0c;只需少量代碼就能返回結構化的 JSON 響應。本篇案例將手把手帶你完成一個「返回 JSON 數據的 HTTP 接口」&#xff0c;幫助你理解如何用 Go 語言實現后端服…

扣子Coze中的觸發器實現流程自動化-實現每日新聞卡片式推送

基礎知識 什么是觸發器/能做什么 Triggers 智能體設置觸發器&#xff08;Triggers&#xff09;&#xff0c;使智能體在特定時間或接收到特定事件時自動執行任務。為什么需要觸發器&#xff1f;實操步驟 第1步&#xff1a;打開一個智能體編輯頁第2步&#xff1a;技能 - 觸發器 -…

GitCode 7月:小程序積分商城更名成長中心、「探索智能倉頡!Cangjie Magic 體驗有獎征文活動」圓滿收官、深度對話欄目持續熱播

運營情況總結 &#x1f389; 截至7月底&#xff0c;GitCode 這個熱鬧的開發者社區&#xff0c;已經聚集了 656 萬位開發者小伙伴啦&#xff01; &#x1f4bb; 產品&#xff1a;小程序積分商城更名為成長中心啦&#xff0c;更多功能將陸續上線。 &#x1f31f; G-Star&#xff…

機器學習之支持向量機(原理)

目錄 摘要 一、概述 二、SVM算法定義 1.超平?最?間隔介紹 2.硬間隔和軟間隔 1.硬間隔分類 2. 軟間隔分類 三、SVM算法原理 1 定義輸?數據 2 線性可分?持向量機 3 SVM的計算過程與算法步驟 四、核函數 五、SVM算法api介紹 1. 核心參數說明 2. 主要方法 3. 重…

【Unity3D實例-功能-跳躍】角色跳躍

今天&#xff0c;我們來聊聊 Unity 里最常打交道的動作之一——角色跳躍。無論是橫版闖關還是 3D 跑酷&#xff0c;跳躍都是讓角色“活”起來的核心操作。在 Unity 里&#xff0c;幾行腳本就能讓角色一蹬而起、穩穩落地。下面&#xff0c;就讓我們一起把這個“彈跳感”親手做出…

react+echarts實現變化趨勢縮略圖

如上圖&#xff0c;實現一個縮略圖。 import React, { useState, useEffect } from react; const ParentCom () > {const [data, setData] useState({});useEffect(() > {// 這里可以做一些接口請求等操作setData({isSheng: false, value: 11.24, percentage: 2.3%, da…

C語言宏相關操作

宏 宏名稱通常都是由大寫英文字母構成的宏名稱里不可以包含空格用宏給數字起名字的時候不可以使用賦值運算符&#xff0c;不要自增自減可以在編寫程序的時候直接使用宏名稱替代數字&#xff0c;編譯器在編譯的時候會把程序里的宏替換成它所代表的數字 1. 為什么要使用宏&#x…