Java程序題案例分析

目錄

一、基礎語法

1. 類與對象

2. 接口與抽象類

二、面向對象語法

1. 繼承與多態

2. 四種訪問修飾符

三、設計模式相關語法

一、策略模式(接口回調實現)

1. 完整實現與解析

二、工廠模式(靜態工廠方法實現)

1. 完整實現與解析

2. 模式變體

(1) 簡單工廠模式(如上例)

(2) 工廠方法模式

三、觀察者模式(內部類實現)

1. 完整實現與解析

2. 使用內部類的優化實現

四、設計模式綜合應用示例

電商系統折扣策略案例

四、其他核心語法

1. List/Set/Map基本操作

2. 集合遍歷

3.異常處理語法

4.IO基礎語法

5.泛型類型推斷

五、設計題高頻語法要點

1. 枚舉類型(狀態模式常用)

2. 泛型(提高代碼復用性)

六、例題?


一、基礎語法

1. 類與對象

// 類定義   
public class ClassName {// 字段(成員變量)private int field;// 構造方法public ClassName(int param) {this.field = param;}// 方法public void methodName() {// 方法體}   
}// 對象創建與使用   
ClassName obj = new ClassName(10);   
obj.methodName();

2. 接口與抽象類

// 接口定義   
public interface InterfaceName {void abstractMethod();// Java8+默認方法default void defaultMethod() {// 實現}   
}// 抽象類定義   
public abstract class AbstractClass {public abstract void abstractMethod();public void concreteMethod() {// 實現}   
}   

二、面向對象語法

1. 繼承與多態

class Parent {public void show() {System.out.println("Parent");}   
}class Child extends Parent {@Overridepublic void show() {System.out.println("Child");}   
}// 多態示例   
Parent obj = new Child();
obj.show(); // 輸出"Child"

2. 四種訪問修飾符

  • public?- 所有類可見
  • protected?- 同包及子類可見
  • 默認(無修飾符)?- 同包可見
  • private?- 僅本類可見

三、設計模式相關語法

一、策略模式(接口回調實現)

interface Strategy {void execute();   
}class Context {private Strategy strategy;public void setStrategy(Strategy s) {this.strategy = s;}public void executeStrategy() {strategy.execute();}        
}        

1. 完整實現與解析

// 策略接口   
interface PaymentStrategy {void pay(double amount);   
}// 具體策略類   
class CreditCardPayment implements PaymentStrategy {private String cardNumber;public CreditCardPayment(String cardNumber) {this.cardNumber = cardNumber;}@Overridepublic void pay(double amount) {System.out.println("使用信用卡" + cardNumber + "支付" + amount + "元");}   
}class AlipayPayment implements PaymentStrategy {private String account;public AlipayPayment(String account) {this.account = account;}@Overridepublic void pay(double amount) {System.out.println("使用支付寶賬戶" + account + "支付" + amount + "元");}   
}// 上下文類   
class PaymentContext {private PaymentStrategy strategy;public void setStrategy(PaymentStrategy strategy) {this.strategy = strategy;}public void executePayment(double amount) {strategy.pay(amount);}   
}// 使用示例   
public class StrategyDemo {public static void main(String[] args) {PaymentContext context = new PaymentContext();// 使用信用卡支付context.setStrategy(new CreditCardPayment("1234-5678-9012-3456"));context.executePayment(100.0);// 切換為支付寶支付context.setStrategy(new AlipayPayment("example@alipay.com"));context.executePayment(200.0);}   
}
  • 核心思想:定義算法族,分別封裝起來,使它們可以互相替換

二、工廠模式(靜態工廠方法實現)

class ProductFactory {public static Product createProduct(String type) {switch(type) {case "A": return new ProductA();case "B": return new ProductB();default: throw new IllegalArgumentException();}}            
}            

1. 完整實現與解析

// 產品接口   
interface Shape {void draw();   
}// 具體產品類   
class Circle implements Shape {@Overridepublic void draw() {System.out.println("繪制圓形");}   
}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("繪制矩形");}   
}// 工廠類   
class ShapeFactory {// 靜態工廠方法public static Shape createShape(String type) {if(type == null) {return null;}if(type.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if(type.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();}throw new IllegalArgumentException("不支持的形狀類型");}   
}// 使用示例   
public class FactoryDemo {public static void main(String[] args) {// 使用工廠創建對象Shape circle = ShapeFactory.createShape("circle");circle.draw();Shape rectangle = ShapeFactory.createShape("rectangle");rectangle.draw();}    
}    

2. 模式變體

(1) 簡單工廠模式(如上例)
(2) 工廠方法模式
interface ShapeFactory {Shape createShape();    
}class CircleFactory implements ShapeFactory {public Shape createShape() {return new Circle();}    
}class RectangleFactory implements ShapeFactory {public Shape createShape() {return new Rectangle();}
}
  • 核心思想:將對象的創建與使用分離

三、觀察者模式(內部類實現)

class Subject {private List<Observer> observers = new ArrayList<>();public void addObserver(Observer o) {observers.add(o);}public void notifyObservers() {for(Observer o : observers) {o.update();}}// 觀察者接口interface Observer {void update();}        
}        

1. 完整實現與解析

import java.util.ArrayList;   
import java.util.List;// 主題接口   
interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();   
}// 具體主題類   
class WeatherData implements Subject {private List<Observer> observers;private float temperature;public WeatherData() {observers = new ArrayList<>();}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for(Observer observer : observers) {observer.update(temperature);}}// 業務方法:當氣象站數據更新時調用public void measurementsChanged(float newTemp) {this.temperature = newTemp;notifyObservers();}   
}// 觀察者接口   
interface Observer {void update(float temperature);   
}// 具體觀察者類   
class CurrentConditionsDisplay implements Observer {@Overridepublic void update(float temperature) {System.out.println("當前溫度: " + temperature + "℃");}   
}// 使用示例   
public class ObserverDemo {public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay display = new CurrentConditionsDisplay();// 注冊觀察者weatherData.registerObserver(display);// 模擬數據變化weatherData.measurementsChanged(25.5f);weatherData.measurementsChanged(26.0f);}        
}        

2. 使用內部類的優化實現

class WeatherData {private List<Observer> observers = new ArrayList<>();private float temperature;// 內部接口public interface Observer {void update(float temp);}public void addObserver(Observer o) {observers.add(o);}public void setMeasurements(float temp) {this.temperature = temp;notifyObservers();}private void notifyObservers() {for(Observer o : observers) {o.update(temperature);}}        
}// 使用匿名內部類
WeatherData weather = new WeatherData();
weather.addObserver(new WeatherData.Observer() {@Overridepublic void update(float temp) {System.out.println("溫度更新: " + temp);}
});
  • 核心思想:定義對象間一對多的依賴關系,當一個對象狀態改變時,所有依賴它的對象都得到通知

四、設計模式綜合應用示例

電商系統折扣策略案例

// 策略模式:折扣策略   
interface DiscountStrategy {double applyDiscount(double originalPrice);   
}class NoDiscount implements DiscountStrategy {public double applyDiscount(double price) {return price;}   
}class PercentageDiscount implements DiscountStrategy {private double percentage;public PercentageDiscount(double percentage) {this.percentage = percentage;}public double applyDiscount(double price) {return price * (1 - percentage/100);}   
}// 工廠模式:創建折扣策略   
class DiscountStrategyFactory {public static DiscountStrategy createStrategy(String type, double param) {switch(type) {case "NONE": return new NoDiscount();case "PERCENT": return new PercentageDiscount(param);default: throw new IllegalArgumentException();}}   
}// 觀察者模式:訂單狀態通知   
class Order {private List<OrderObserver> observers = new ArrayList<>();private String status;public interface OrderObserver {void update(String orderStatus);}public void addObserver(OrderObserver o) {observers.add(o);}public void setStatus(String status) {this.status = status;notifyObservers();}private void notifyObservers() {for(OrderObserver o : observers) {o.update(status);}}
}
  1. 模式識別:快速判斷題目要求使用的設計模式
  2. 類圖轉換:能夠將UML類圖轉換為Java代碼
  3. 模式組合:注意多種設計模式的組合使用
  4. 代碼規范
    • 類名使用大駝峰
    • 方法名使用小駝峰
  5. 設計原則
    • 單一職責原則
    • 接口隔離原則

四、其他核心語法

1. List/Set/Map基本操作

List<String> list = new ArrayList<>();        
list.add("Java");        
list.get(0);Set<Integer> set = new HashSet<>();        
set.add(1);        
set.contains(1);Map<String, Integer> map = new HashMap<>();           
map.put("age", 25);   
map.get("age");   

2. 集合遍歷

// for-each循環   
for(String item : list) {System.out.println(item);   
}// 迭代器   
Iterator<String> it = list.iterator();   
while(it.hasNext()) {System.out.println(it.next());   
}// Lambda表達式(Java8+)   
list.forEach(item -> System.out.println(item));   

3.異常處理語法

try {// 可能拋出異常的代碼int result = 10 / 0;   
} catch (ArithmeticException e) {System.err.println("除零錯誤: " + e.getMessage());    
} finally {System.out.println("總會執行的代碼");    
}    

4.IO基礎語法

// 文件讀取    
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}    
} catch (IOException e) {e.printStackTrace();    
}    

?5.泛型類型推斷

通過泛型指定集合只能存儲String類型,避免運行時ClassCastException

 // Java 5/6:需重復聲明類型List<String> list = new ArrayList<String>();// Java 7+:使用<>自動推斷List<String> list = new ArrayList<>();  // 編譯器推斷為ArrayList<String>

五、設計題高頻語法要點

1. 枚舉類型(狀態模式常用)

enum State {START, RUNNING, STOPPED
}public class StateMachine {private State current = State.START;public void changeState(State newState) {this.current = newState;}
}

2. 泛型(提高代碼復用性)

class Box<T> {private T content;public void set(T content) {this.content = content;}public T get() {return content;}
}// 使用
Box<String> stringBox = new Box<>();
stringBox.set("Hello");

六、例題?

閱讀以下函數說明和Java代碼,將應填入(n)處的子句寫在答題紙的對應欄內。


【說明】

現有一個顯示系統,要顯示的圖形有線Line、矩形Square,抽象出一個Shape類(接口),有方法顯示display()。

需要新增圖形Circle,又已知有類XXCircle實現了所需要實現的功能:顯示displayIt()。為了繼承自Shape以提供統一接口,又不希望從頭開發代碼,希望使用XXCircle。這樣將XXCircle作為Circle的一個屬性,即Circle的對象包含一個XXCircle對象。當一個Circle對象被實例化時,它必須實例化一個相應的XXCircle對象;Circle對象收到的做任何事的請求都將轉發給這個XXCircle對象。通過這種被稱為Adapter的模式,Circle對象就可以通過“讓XXCircle做實際工作”來表現自己的行為了。圖7 - 52顯示了各個類間的關系。以下是Java語言實現,能夠正確編譯通過。

圖7 - 52 各個類之間的關系


【Java程序】

//Shape.java文件   
public interface Shape {public (1) abstract void display();   
}//XXCircle.java文件   
public class XXCircle {public void displayIt() {//省略具體實現}   
}//Circle.java文件   
public class Circle (2) implements Shape {private XXCircle pcx = (3) new XXCircle();public void display() {pcx.displayIt();}   
}//Factory.java文件   
public class Factory {public (4) static Shape getShapeInstance(int type) {switch (type) {case 1: return new Line();//Line類未定義,假設存在case 2: return new Square();//Square類未定義,假設存在case 3: return new Circle();default: return null;}}   
}//Main.java文件   
public class Main {public static void main(String[] args) {int type = 1;Factory factory = new Factory();Shape s;s = factory.(5) getShapeInstance(type);if (s == null) {System.out.println("Error get the instance!");return;}s.display();return;}   
}
  • (1) abstract:表示接口Shapedisplay方法的抽象性質。在Java接口里,方法默認是publicabstract的,寫abstract明確該方法需由實現類去具體實現。
  • (2) implements:用于Circle類聲明實現Shape接口。在Java中,類通過implements關鍵字來表明遵循某個接口的契約,要實現接口里的抽象方法。
  • (3) new XXCircle():用于在Circle類中實例化XXCircle對象pcx,創建一個XXCircle類的實例供后續使用。
  • (4) Shape:這是Factory類中getShapeInstance方法的返回類型。因為該方法返回的可能是LineSquareCircle等不同形狀類的實例,而這些類都實現了Shape接口,所以返回類型是Shape接口類型,以實現多態。
  • (5) getShapeInstance(type):在Main類中,通過Factory類的實例factory調用getShapeInstance方法,并傳入參數type,以此獲取對應的形狀實例。
#include <iostream>   
using namespace std;class Shape {   
public:virtual void display() = 0;  // (1) 純虛函數聲明   
};class Line : public Shape {   
public:void display() override {cout << "Displaying Line" << endl;}   
};class Square : public Shape {   
public:void display() override {cout << "Displaying Square" << endl;}   
};class XXCircle {   
public:void displayIt() {cout << "Displaying XXCircle" << endl;}   
};class Circle : public Shape {   
private:XXCircle *pxc;   
public:Circle();void display() override;   
};Circle::Circle() {pxc = new XXCircle();  // (2) 創建XXCircle對象   
}void Circle::display() {pxc->displayIt();  // (3) 調用XXCircle的顯示方法   
}class Factory {   
public:Shape* getShapeInstance(int type) {  // (4) 返回Shape指針類型switch(type) {case 1: return new Square();case 2: return new Line();case 3: return new Circle();default: return nullptr;}}   
};int main(int argc, char *argv[]) {if(argc != 2) {cout << "Usage: program <shape_type>" << endl;cout << "Shape types: 1=Square, 2=Line, 3=Circle" << endl;return 1;}int type = atoi(argv[1]);Factory factory;Shape *s = factory.getShapeInstance(type);  // (5) 獲取形狀實例if(s == nullptr) {cout << "Error: Invalid shape type!" << endl;return 1;}s->display();delete s;return 0;   
}
  1. virtual void display() = 0;?- 聲明純虛函數,使Shape成為抽象類
  2. new XXCircle()?- 創建XXCircle對象實例
  3. displayIt()?- 調用XXCircle的顯示方法
  4. Shape*?- 工廠方法返回Shape基類指針
  5. getShapeInstance(type)?- 調用工廠方法獲取形狀實例

閱讀以下函數說明和Java代碼,將應填入(n)處的子句寫在答題紙的對應欄內。


【說明】 很多時候,希望某些類只有一個或有限的幾個實例,典型解決方案是所謂單身(Singleton)模式。但在多線程情況下,Singleton模式有可能出現問題,需要進行同步檢查。如果對“檢查Singleton對象是否已經創建”進行同步,則存在嚴重的瓶頸,所有的線程都必須等待檢查對象是否存在。解決方式是一種稱為Double-Checked-Locking的模式,其意圖是將非必需的鎖定優化掉,同步檢查最多只發生一次,因此不會成為瓶頸。以下是Java語言實現,能夠正確編譯通過。


【Java程序】

public class USTax {private static USTax instance = null;(1) USTax() {}private (2) static void doSync() {if(instance == null) {System.out.println("實例不存在,創建實例...");instance = (3);System.out.println("實例創建成功");}else{System.out.println("實例已被創建");}}public static USTax getInstance() {if(instance == null) {System.out.println("實例暫時不存在");(4); //同步控制}else{System.out.println("實例已經存在");}return (5);}   
}
  • (1):答案為private。因為希望USTax類只有一個實例,將構造函數設為private可防止外部直接實例化。
  • (2):答案是synchronizeddoSync方法用于同步控制,所以要聲明為synchronized
  • (3):應填new USTax()。此處是創建USTax實例。
  • (4):答案是doSync()。進行同步控制需調用同步函數doSync
  • (5):應填instance。此位置是返回實例的引用。

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

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

相關文章

comfyu BiRefNet-General模型下載及存放地方

https://huggingface.co/ZhengPeng7/BiRefNet/tree/main

HunyuanCustom:文生視頻框架論文速讀

《HunyuanCustom: A Multimodal-Driven Architecture for Customized Video Generation》論文講解 一、引言 本文提出了 HunyuanCustom&#xff0c;這是一個基于多模態驅動的定制化視頻生成框架。該框架旨在解決現有視頻生成模型在身份一致性&#xff08;identity consistenc…

tryhackme——Enumerating Active Directory

文章目錄 一、憑據注入1.1 RUNAS1.2 SYSVOL1.3 IP和主機名 二、通過Microsoft Management Console枚舉AD三、通過命令行net命令枚舉四、通過powershell枚舉 一、憑據注入 1.1 RUNAS 當獲得AD憑證<用戶名>:<密碼>但無法登錄域內機器時&#xff0c;runas.exe可幫助…

Web3 學習全流程攻略

目錄 ?? Web3 學習全流程攻略 ?? 第一階段:打好基礎(Web3 入門) ?? 目標: ?? 學習內容: ? 推薦資源: ????? 第二階段:技術棧搭建(成為 Web3 開發者) ?? 目標: ?? 學習內容: ? 推薦資源: ?? 第三階段:構建完整 DApp(去中心化應用)…

Python程序打包為EXE文件的全面指南

Python程序打包為EXE文件的全面指南 Python程序打包為EXE文件是解決程序分發和環境依賴問題的有效方法。通過將Python腳本及其所有依賴項整合為單一可執行文件&#xff0c;用戶無需安裝Python解釋器即可直接運行程序&#xff0c;極大提升了應用的便攜性和用戶體驗。本文將深入…

22、城堡防御工事——React 19 錯誤邊界與監控

一、魔法護盾&#xff1a;錯誤邊界機制 1. 城墻結界&#xff08;Error Boundary&#xff09; // 客戶端錯誤邊界use client function useErrorBoundary() {const [error, setError] useState(null);?const handleError useCallback((error, errorInfo) > {setError(erro…

深入理解 Istio 的工作原理 v1.26.0

解讀最新版本的 Istio 源碼確實是一項龐大的工程&#xff0c;但我可以為你梳理出一個清晰的脈絡&#xff0c;并指出關鍵模塊和代碼路徑&#xff0c;幫助你深入理解 Istio 的工作原理。 我們主要關注 Istio 的核心組件 Istiod 和數據平面的 Envoy Proxy。 前提&#xff1a; Go…

Flask 調試的時候進入main函數兩次

在 Flask 開啟 Debug 模式時&#xff0c;程序會因為自動重載&#xff08;reloader&#xff09;的機制而啟動兩個進程&#xff0c;導致if __name__ __main__底層的程序代碼被執行兩次。以下說明其原理與常見解法。 Flask Debug 模式下自動重載機制 Flask 使用的底層服務器 Wer…

CSS--圖片鏈接垂直居中展示的方法

原文網址&#xff1a;CSS--圖片鏈接垂直居中展示的方法-CSDN博客 簡介 本文介紹CSS圖片鏈接垂直居中展示的方法。 圖片鏈接 問題復現 源碼 <html xml:lang"cn" lang"cn"><head><meta http-equiv"Content-Type" content&quo…

雷賽伺服L7-EC

1電子齒輪比&#xff1a; 0x608F-01 只讀&#xff0c;編碼器圈脈沖【0x20000】【131072】 //Er1B1齒輪比錯誤 ----------------------------------- 0x6092-01 圈脈沖 //重新使能生效【pa008必須是0】值越小&#xff0c;轉的越多 -----------------------…

在js中大量接口調用并發批量請求處理器

并發批量請求處理器 ? 設計目標 該類用于批量異步請求處理&#xff0c;支持&#xff1a; 自定義并發數請求節拍控制&#xff08;延時&#xff09;失敗重試機制進度回調通知 &#x1f527; 構造函數參數 new BulkRequestHandler({dataList, // 要處理的數據列表r…

K8S擴縮容及滾動更新和回滾

目錄&#xff1a; 1、滾動更新1、定義Deployment配置2、應用更新 2、版本回滾1. 使用kubectl rollout undo命令 3、更新暫停與恢復1、暫停更新2、更新鏡像&#xff08;例如&#xff0c;使用kubectl set image命令&#xff09;3、恢復更新 4、彈性擴縮容1、擴容命令2、縮容命令3…

力扣-24.兩兩交換鏈表中的結點

題目描述 給你一個鏈表&#xff0c;兩兩交換其中相鄰的節點&#xff0c;并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題&#xff08;即&#xff0c;只能進行節點交換&#xff09;。 class Solution { public:ListNode* swapPairs(ListNode* head) {i…

對遺傳算法思想的理解與實例詳解

目錄 一、概述 二、實例詳解 1&#xff09;問題描述與分析 2&#xff09;初始化種群 3&#xff09;計算種群適應度 4&#xff09;遺傳操作 5&#xff09;基因交叉操作 6&#xff09;變異操作 三、計算結果 四、總結 一、概述 遺傳算法在求解最優解的問題中最為常用&a…

計算機圖形學編程(使用OpenGL和C++)(第2版) 學習筆記 07.光照

1. 光照 1.1. 光源 光源類型特點優點缺點環境光整個場景均勻受光&#xff0c;無方向和位置。模擬全局光照&#xff0c;避免完全黑暗的區域。缺乏方向性和真實感&#xff0c;無法產生陰影。平行光光線方向平行&#xff0c;無位置&#xff0c;僅有方向。計算簡單&#xff0c;適…

Python在大數據機器學習模型的多模態融合:深入探索與實踐指南

一、多模態融合的全面概述 1.1 多模態融合的核心概念 多模態融合(Multimodal Fusion)是指將來自不同傳感器或數據源(如圖像、文本、音頻、視頻、傳感器數據等)的信息進行有效整合,以提升機器學習模型的性能和魯棒性。在大數據環境下,多模態融合面臨著獨特的挑戰和機遇: 數…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】6.4 時間序列分析(窗口函數處理時間數據)

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 PostgreSQL時間序列分析&#xff1a;窗口函數處理時間數據實戰一、時間序列分析核心場景與窗口函數優勢1.1 業務場景需求1.2 窗口函數核心優勢 二、窗口函數基礎&#xff1a…

window 顯示驅動開發-配置內存段類型

視頻內存管理器&#xff08;VidMm&#xff09;和顯示硬件僅支持某些類型的內存段。 因此&#xff0c;內核模式顯示微型端口驅動程序&#xff08;KMD&#xff09;只能配置這些類型的段。 KMD 可以配置內存空間段和光圈空間段&#xff0c;其中不同&#xff1a; 內存空間段由保存…

筆記,麥克風的靈敏度

麥克風的“靈敏度&#xff08;Sensitivity&#xff09;”決定了它捕捉聲音細節的能力。想象麥克風是一只有耳朵的生物。高靈敏度麥克風像長著“超級順風耳”的精靈&#xff0c;能聽見花瓣飄落的聲音、遠處樹葉的沙沙聲&#xff0c;甚至你心跳的微弱震動。適合錄音棚里捕捉歌手的…

lvm詳細筆記

LVM簡介 邏輯卷管理器&#xff0c;是Linux 系統中用于管理磁盤儲存的關鍵技術。 LVM 則打破了磁盤分區一旦確定&#xff0c;其大小調整往往較為復雜&#xff0c;且難以靈活應對業務變化這種限制&#xff0c;它允許用戶將多個物理分區組合卷組。例如&#xff0c;系統中的多個物…