第三次Blog作業——對本門課程的總結
前言
在本學期面向對象程序設計的學習過程中,完成許多任務了:
- PTA作業:前三次題目集主要是對程序設計基礎知識的回顧。到第四次題目集,接觸到類的概念并開始了我人生中第一次類設計。從第五次到第七次題目集是對單部電梯調度程序的設計和迭代,第八次和第九次題目集是對航空貨運管理系統的設計和迭代。最后兩次題目集則是到了集合框架和期末復習。
- Blog作業:分別是對PTA作業中的程序設計與迭代的總結,和本次作業對整門課程的總結。
- 實驗:實驗一主要是Java環境的安裝和測試,實驗二到四是對大象裝冰箱程序的不斷迭代和設計,實驗五是使用JavaFX技術為大象裝冰箱程序引入圖形界面。
- 線上課程以及線下課程:對使用Java進行面向對象程序設計的知識進行講解。
面向對象技術總結
一、封裝
核心思想:將數據與操作數據的方法綁定在一起,隱藏內部實現細節,僅暴露必要的接口。
實現方式:
訪問修飾符:
- private:僅當前類可見(最嚴格的封裝)。
- public:全項目可見。
- protected:同包或子類可見。
- 默認(無修飾符):同包可見。
getter/setter 方法:
通過公共方法訪問和修改私有屬性。
點擊查看代碼
class Point
{
private double x;
private double y;
public Point()
{
x = 0;
y = 0;
}
public Point(double x, double y)
{
this.x = x;
this.y = y;
}
public double getX()
{
return x;
}
public void setX(double x)
{
this.x = x;
}
public double getY()
{
return y;
}
public void setY(double y)
{
this.y = y;
}
public void dispaly()
{
System.out.printf("(%.2f,%.2f)\n" , x, y);
}
}
二、繼承
核心思想:子類繼承父類的屬性和方法,實現代碼復用。
關鍵特性:
關鍵字:extends(Java 只支持單繼承)。
構造函數調用:子類構造函數默認調用父類無參構造(super())。
方法重寫(Override):子類可覆蓋父類方法,需滿足:
- 方法名、參數列表、返回類型完全一致。
- 訪問修飾符不能比父類更嚴格。
super 關鍵字:訪問父類的屬性或方法。
點擊查看代碼
class Lion extends Animal
{
public Lion(String name, int weight, int height)
{
super(name, weight, height);
}
@Override
public void cry()
{
System.out.println(getName() + ":怒吼一聲");
}
@Override
public int getAttackPower()
{
return 1;
}
}
繼承是 “is-a” 關系(如 Dog is-a Animal)。
父類的private成員無法被繼承。
三、多態
核心思想:同一操作作用于不同對象,產生不同的執行結果。
兩種形式:
編譯時多態(靜態多態):
通過方法重載(Overload)實現。
- 要求:方法名相同,參數列表不同(類型 / 順序 / 數量)。

運行時多態(動態多態):
- 通過方法重寫和父類引用指向子類對象實現。
點擊查看代碼
Animal animal = new Lion(); // 父類引用指向子類對象
animal.cry(); // 調用Lion的cry()方法(動態綁定)
優勢:
- 提高代碼擴展性(如新增子類無需修改調用方代碼)。
- 實現接口復用,降低耦合度。
四、抽象類
定義:
包含abstract關鍵字的類,不能直接實例化。
特點:
- 可包含抽象方法(無方法體,需子類實現)和普通方法。
- 子類必須實現所有抽象方法(除非子類也是抽象類)。
點擊查看代碼
abstract class Cargo implements Ratable
{
private int id;
private String name;
private double length;
private double width;
private double height;
private double grossWeight;
public Cargo()
{
}
public Cargo(int id, String name, double length, double width, double height, double grossWeight)
{
this.id = id;
this.name = name;
this.length = length;
this.width = width;
this.height = height;
this.grossWeight = grossWeight;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public double getLength()
{
return length;
}
public void setLength(double length)
{
this.length = length;
}
public double getWidth()
{
return width;
}
public void setWidth(double width)
{
this.width = width;
}
public double getHeight()
{
return height;
}
public void setHeight(double height)
{
this.height = height;
}
public double getGrossWeight()
{
return grossWeight;
}
public void setGrossWeight(double grossWeight)
{
this.grossWeight = grossWeight;
}
public double getVolumeWeight()
{
return length * width * height / 6000;
}
public double getFeeWeight()
{
return Math.max(grossWeight, getVolumeWeight());
}
public double getCost()
{
return getFeeWeight() * getRate();
}
}
class NormalCargo extends Cargo
{
public NormalCargo()
{
}
public NormalCargo(int id, String name, double length, double width, double height, double grossWeight)
{
super(id, name, length, width, height, grossWeight);
}
@Override
public double getRate()
{
if (getFeeWeight() < 20)
{
return 35;
}
else if (getFeeWeight() < 50)
{
return 30;
}
else if (getFeeWeight() < 100)
{
return 25;
}
else
{
return 15;
}
}
}
五、接口
定義:
使用interface關鍵字,本質是特殊的抽象類(全是抽象方法)。
特點:
- 接口中的屬性默認是public static final。
- 子類用implements實現接口,需實現所有抽象方法。
點擊查看代碼
interface Ratable
{
double getRate();
}
六、集合框架
核心架構:以java.util包為核心,分為Collection和Map兩大體系。
1. Collection 體系(存儲單個元素)
List 接口:有序、可重復,實現類包括:
- ArrayList:基于數組,隨機訪問快,增刪慢。
- LinkedList:基于鏈表,增刪快,隨機訪問慢。
- Vector:線程安全(已過時,推薦CopyOnWriteArrayList)。
Set 接口:無序、不可重復,實現類包括:
- HashSet:基于哈希表,查詢快,插入順序不保留。
- TreeSet:基于紅黑樹,元素有序(需實現Comparable)。
- LinkedHashSet:保留插入順序,結合哈希表和鏈表。
- Queue 接口:隊列(先進先出),實現類如LinkedList、PriorityQueue。
2. Map 體系(存儲鍵值對)
- HashMap:基于哈希表,查詢和修改效率高(非線程安全)。
- TreeMap:基于紅黑樹,鍵有序(需實現Comparable)。
- ConcurrentHashMap:線程安全的高效 Map(Java 8 后用分段鎖優化)。
- Hashtable:線程安全(已過時,不推薦)。
常用操作:
- 遍歷:for-each、迭代器(Iterator)、Lambda 表達式(Java 8+)。
- 泛型:List
、Map<Integer, Object>,避免類型轉換異常。
七、異常
異常是程序運行時的錯誤,Java 通過try-catch-finally和throws機制處理。
異常分類:
- Checked Exception:必須顯式處理(如IOException)
- Unchecked Exception:繼承自RuntimeException(如NullPointerException)
- Error:系統級錯誤(如OutOfMemoryError)
點擊查看代碼
public static void savePaid(OrderManager orderManager)
{
try (FileWriter writer = new FileWriter("order_manager.txt", true))
{
writer.write(orderManager.toString());
writer.write(System.lineSeparator());
}
catch (IOException e)
{
e.printStackTrace();
}
}
八、JavaFX
核心組件:
- 控件:Button、TextField、TableView、Chart等。
- 布局:BorderPane、HBox、VBox、GridPane。
- 事件處理:Lambda 表達式或匿名內部類(如button.setOnAction(e -> System.out.println("Clicked")))。
點擊查看代碼
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class Main extends Application
{
public static void main(String[] args)
{
launch(args);
}
@Override
public void start(Stage primaryStage)
{
primaryStage.setTitle("JavaFX Slider 功能演示");
BorderPane root = new BorderPane();
root.setPadding(new Insets(20));
// 創建頂部標題
Text title = new Text("JavaFX Slider 功能演示");
title.setFont(Font.font("Arial", 24));
title.setFill(Color.DARKBLUE);
HBox titleBox = new HBox(title);
titleBox.setPadding(new Insets(0, 0, 20, 0));
titleBox.setAlignment(javafx.geometry.Pos.CENTER);
root.setTop(titleBox);
// 創建滑塊演示區域
VBox sliderDemoBox = new VBox(20);
sliderDemoBox.setPadding(new Insets(20));
sliderDemoBox.setBorder(new Border(new BorderStroke(Color.LIGHTGRAY, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.DEFAULT)));
// 水平滑塊
Label basicSliderLabel = new Label("水平滑塊:");
Slider basicSlider = new Slider(0, 100, 50);
// basicSlider.setShowTickLabels(true); // 顯示刻度
// basicSlider.setShowTickMarks(true); // 顯示刻度線
// basicSlider.setMajorTickUnit(20); // 設置主刻度間隔
// basicSlider.setMinorTickCount(4); // 設置每個主刻度間的小刻度數量
Label basicSliderValueLabel = new Label("當前值: " + basicSlider.getValue());
// 觀察者模式獲取Slider的值
// basicSlider.valueProperty().addListener((observable, oldValue, newValue) ->
// {
// basicSliderValueLabel.setText("當前值: " + String.format("%.1f", newValue.doubleValue()));
// });
VBox basicSliderBox = new VBox(10, basicSliderLabel, basicSlider, basicSliderValueLabel);
// 垂直滑塊
Label verticalSliderLabel = new Label("垂直滑塊:");
Slider verticalSlider = new Slider(0, 30, 15);
// verticalSlider.setOrientation(Orientation.VERTICAL); // 設置為垂直滑塊,默認值為HORIZONTAL
// verticalSlider.setShowTickLabels(true); // 顯示刻度
// verticalSlider.setShowTickMarks(true); // 顯示刻度線
// verticalSlider.setMajorTickUnit(10); // 設置主刻度間隔
// verticalSlider.setMinorTickCount(1); // 設置每個主刻度間的小刻度數量
HBox verticalSliderBox = new HBox(20, verticalSliderLabel, verticalSlider);
verticalSliderBox.setAlignment(javafx.geometry.Pos.CENTER_LEFT);
// 添加所有滑塊演示到主區域
sliderDemoBox.getChildren().addAll(basicSliderBox, verticalSliderBox);
root.setCenter(sliderDemoBox);
Scene scene = new Scene(root, 600, 800);
primaryStage.setScene(scene);
primaryStage.show();
}
}
踩坑心得
一、冷靜和耐心
寫PTA熬到深夜,代碼始終跑不通。


這不是我一個人的經歷,許多同學也有共同的體驗。究其原因,不僅僅是審題和題目難度的問題,還有在一次又一次的失敗面前紅溫,最終失去耐心,進行著沒有意義的嘗試。面對難題,清醒的頭腦和百折不撓的耐心是很重要的品質。
二、合理的設計
對于一個需要不斷迭代的項目來說,一個合理的設計非常重要。
在我一開始設計類的時候,這一點就做的非常不好。比如單部電梯調度程序,根本就沒有設計,先寫代碼,然后拿著代碼生成類圖,結果生成了一團蜘蛛網

這對于后續的迭代造成了極大的困難。
改進建議及總結
建議
- 希望提交實驗不要手敲代碼,這真的太折磨了。雖然代碼可以復制上一次的實驗,但是實驗提交系統的用戶體驗實在是太糟糕了,沒有ide的自動補全和錯誤提示也就算了,甚至連顯示空白字符的功能也沒有。不僅如此,在這個實驗提交系統上打字也很不舒服,用起來還不如記事本。
- 希望線上課程的作業部分的答案能夠合理一些,比如答案是"final"和"static",輸入是"static"和"final",還有答案是"super()";,輸入是"super()"。這種情況都能被判錯誤。
- 希望實驗指導書的內容能夠具體一些,有的地方指導書要求實現每個功能,但這個功能應該用在什么地方卻沒有提及,經常搞得人一頭霧水。
總結
本學期的面向對象程序設計學習,是從基礎語法到復雜系統設計的全面進階。從最初通過 PTA 題目集回顧 Java 基礎,到逐步接觸類設計、電梯調度與航空貨運系統的迭代開發,每一次作業和實驗都推動著對封裝、繼承、多態等核心思想的理解從理論走向實踐。印象最深的是在單部電梯調度程序中,因初期類設計不合理導致的代碼混亂,讓我深刻認識到面向對象設計中 “高內聚、低耦合” 的重要性;而 JavaFX 圖形界面的開發,則讓我體會到面向對象思想在跨領域應用中的靈活性。
實驗與 Blog 作業的結合,幫助我將碎片化的知識系統化 —— 從大象裝冰箱程序的迭代到航空貨運系統的架構設計,每一次總結都伴隨著對代碼邏輯的重新審視。盡管在 PTA 作業中多次因細節錯誤熬夜調試,也在實驗提交系統中遇到過操作不便的問題,但這些挑戰反而強化了查錯能力和耐心。如今再回顧最初生成的 “蜘蛛網” 類圖,更能感受到從 “面向過程” 到 “面向對象” 思維轉變的價值。這門課程不僅夯實了 Java 編程基礎,更培養了我用系統化思維解決復雜問題的能力,為后續軟件開發學習奠定了堅實基礎。

浙公網安備 33010602011771號