代碼結構說明
public class Dogs {
private String strain = "拉布拉多犬";
private int health = 100;
private int love = 0;
// getter/setter 略
public static void main(String[] args) { ... }
}
問題一:鍵盤輸入健康值並調用 setter
import java.util.Scanner;
public static void main(String[] args) {
Dogs dog = new Dogs();
Scanner scan = new Scanner(System.in);
System.out.print("請輸入健康值 (0-100): ");
int inputHealth = scan.nextInt(); // 讀取整數
dog.setHealth(inputHealth); // 調用 setter,內部自動驗證範圍
System.out.println("當前健康值: " + dog.getHealth());
scan.close();
}
setHealth 邏輯(已正確)
public void setHealth(int health) {
if (health > 100 || health < 0) {
this.health = 40;
System.out.println("健康值應在 0-100 之間,默認設置為 40");
} else {
this.health = health;
}
}
問題二:private 字段修改位置—— setter 內部 vs 調用處
| 場景 | 修改位置 | 說明 |
| 類內部方法 | 直接訪問 this.health = ... | 同一類中 private 可見 |
| 外部類/主程序 | **必須調用公共 setter** dog.setHealth(val) | private 封裝,禁止直接訪問 |
| setter 內部驗證 | 在 setHealth 方法中判斷範圍 | 集中驗證邏輯,保證數據完整性 |
結論:主程序中 只負責獲取輸入並調用 setter,具體賦值、驗證、默認值邏輯**完全封裝在 setter 內部**。這就是封裝的核心價值——「調用者不關心怎麼存,只關心存什麼」。
完整主程序示例
public static void main(String[] args) {
Dogs dog = new Dogs();
Scanner scan = new Scanner(System.in);
// 1. 輸入健康值
System.out.print("輸入健康值: ");
dog.setHealth(scan.nextInt());
System.out.println("健康值: " + dog.getHealth());
// 2. 設置喜愛度(setLove 邏輯有Bug,見下)
dog.setLove(16); // 傳入 16,但 setter 內寫死 50
System.out.println("喜愛度: " + dog.getLove()); // 輸出 50
// 3. 修改品種
dog.setStrain("大黃狗");
System.out.println("品種: " + dog.getStrain());
scan.close();
}
代碼 Bug 提示:setLove 邏輯錯誤
// 當前錯誤實現
public void setLove(int love) { this.love = 50; } // 忽略參數,寫死 50
// 正確實現
public void setLove(int love) {
if (love >= 0 && love <= 100) this.love = love;
else this.love = 0;
}
封裝最佳實踐口訣
「字段私有化,方法公共化,驗證內部化,調用一行化。」
掌握 Scanner 輸入 + setter 封裝驗證,Java 面向對象第一課紮實過關。
- 上一篇文章: Word 2007 限制編輯密碼保護漏洞:SP3 補丁修復無需密碼即可取消保護
- 下一篇文章: jQuery AJAX 復用封裝包:正確引入 JS 文件並調用預定義方法傳遞數據
Copyright ©
程式碼之家 All Rights Reserved