Java面向對象的實際案例能很好體現封裝、繼承、多態的結合使用,以下是幾個貼近生活的場景案例:
案例1:校園人員管理系統(封裝+繼承+多態)
場景:學校有學生、老師兩類人員,需統一管理基本信息,同時區分各自特性(學生有學號、老師有工號)。
// 1. 父類:封裝共性屬性和方法
class Person {
private String name; // 封裝姓名(私有屬性)
private int age;
// 構造器初始化
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getter/setter暴露接口(封裝的體現)
public String getName() { return name; }
public int getAge() { return age; }
// 共性方法:展示基本信息
public void showInfo() {
System.out.println("姓名:" + name + ",年齡:" + age);
}
}
// 2. 子類1:學生(繼承+擴展)
class Student extends Person {
private String studentId; // 學生專屬屬性
public Student(String name, int age, String studentId) {
super(name, age); // 繼承父類構造器
this.studentId = studentId;
}
// 重寫父類方法(多態基礎)
@Override
public void showInfo() {
super.showInfo(); // 複用父類邏輯
System.out.println("身份:學生,學號:" + studentId);
}
// 學生專屬方法
public void study() {
System.out.println(getName() + "正在學習");
}
}
// 3. 子類2:老師(繼承+擴展)
class Teacher extends Person {
private String teacherId; // 老師專屬屬性
public Teacher(String name, int age, String teacherId) {
super(name, age);
this.teacherId = teacherId;
}
// 重寫父類方法(多態基礎)
@Override
public void showInfo() {
super.showInfo();
System.out.println("身份:老師,工號:" + teacherId);
}
// 老師專屬方法
public void teach() {
System.out.println(getName() + "正在講課");
}
}
// 4. 測試類(多態的實際應用)
public class SchoolSystem {
public static void main(String[] args) {
// 父類引用指向子類對象(多態)
Person s = new Student("張三", 18, "2023001");
Person t = new Teacher("李四", 35, "T001");
// 調用同一方法,表現不同行為(多態特性)
s.showInfo();
// 輸出:姓名:張三,年齡:18;身份:學生,學號:2023001
t.showInfo();
// 輸出:姓名:李四,年齡:35;身份:老師,工號:T001
// 子類專屬方法需強轉調用
((Student)s).study(); // 輸出:張三正在學習
((Teacher)t).teach(); // 輸出:李四正在講課
}
}
案例2:電商商品訂單系統(接口+多態)
場景:訂單可包含多種商品(手機、圖書),需統一計算總價,每種商品有自己的計價邏輯。
// 1. 接口:定義商品的統一行為
interface Product {
double getPrice(); // 計算價格
String getName(); // 獲取名稱
}
// 2. 實現類1:手機(封裝屬性和計價邏輯)
class Phone implements Product {
private String brand;
private double price;
private int storage; // 存儲容量(影響價格)
public Phone(String brand, double price, int storage) {
this.brand = brand;
this.price = price + (storage * 100); // 存儲越大價格越高
}
@Override
public double getPrice() { return price; }
@Override
public String getName() { return brand + "手機(" + storage + "G)"; }
}
// 3. 實現類2:圖書(封裝屬性和計價邏輯)
class Book implements Product {
private String title;
private double price;
private double discount; // 折扣(影響價格)
public Book(String title, double price, double discount) {
this.title = title;
this.price = price * discount; // 折扣後價格
}
@Override
public double getPrice() { return price; }
@Override
public String getName() { return title; }
}
// 4. 訂單類(使用多態統一管理商品)
class Order {
private Product[] products; // 訂單中的商品(父類數組存子類對象)
public Order(Product[] products) {
this.products = products;
}
// 計算訂單總價(多態:無需關心具體商品類型)
public double calculateTotal() {
double total = 0;
for (Product p : products) {
total += p.getPrice();
}
return total;
}
// 展示訂單商品
public void showProducts() {
System.out.println("訂單商品:");
for (Product p : products) {
System.out.println(p.getName() + ",單價:" + p.getPrice());
}
}
}
// 5. 測試類
public class OrderSystem {
public static void main(String[] args) {
// 創建不同商品(多態:統一用Product類型)
Product p1 = new Phone("小米", 2999, 256); // 價格=2999+256*100=28599
Product p2 = new Book("Java編程思想", 108, 0.8); // 價格=108*0.8=86.4
// 生成訂單
Order order = new Order(new Product[]{p1, p2});
order.showProducts();
System.out.println("訂單總價:" + order.calculateTotal()); // 輸出:28685.4
}
}
這些案例中,封裝保證了數據安全(如私有屬性通過方法訪問),繼承減少了代碼重複(如學生/老師複用人員信息),多態實現了靈活擴展(如同一訂單處理不同商品),完全貼合面向對象的設計思想。