目錄
一、基礎語法
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);}}
}
- 模式識別:快速判斷題目要求使用的設計模式
- 類圖轉換:能夠將UML類圖轉換為Java代碼
- 模式組合:注意多種設計模式的組合使用
- 代碼規范:
- 類名使用大駝峰
- 方法名使用小駝峰
- 設計原則:
- 單一職責原則
- 接口隔離原則
四、其他核心語法
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:表示接口
Shape
中display
方法的抽象性質。在Java接口里,方法默認是public
和abstract
的,寫abstract
明確該方法需由實現類去具體實現。 - (2) implements:用于
Circle
類聲明實現Shape
接口。在Java中,類通過implements
關鍵字來表明遵循某個接口的契約,要實現接口里的抽象方法。 - (3) new XXCircle():用于在
Circle
類中實例化XXCircle
對象pcx
,創建一個XXCircle
類的實例供后續使用。 - (4) Shape:這是
Factory
類中getShapeInstance
方法的返回類型。因為該方法返回的可能是Line
、Square
或Circle
等不同形狀類的實例,而這些類都實現了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;
}
virtual void display() = 0;
?- 聲明純虛函數,使Shape成為抽象類new XXCircle()
?- 創建XXCircle對象實例displayIt()
?- 調用XXCircle的顯示方法Shape*
?- 工廠方法返回Shape基類指針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):答案是
synchronized
。doSync
方法用于同步控制,所以要聲明為synchronized
。 - (3):應填
new USTax()
。此處是創建USTax
實例。 - (4):答案是
doSync()
。進行同步控制需調用同步函數doSync
。 - (5):應填
instance
。此位置是返回實例的引用。