第三次Blog作業
Java面向對象編程學習全記錄——從基礎到GUI開發的成長之旅
經過一個學期的Java面向對象編程學習,我完成了一系列PTA作業、實驗項目、線上學習和線下課程。整體來看,這門課程的工作量相當充實,每周平均需要投入10-12小時才能完成所有任務。PTA作業從基礎的類與對象設計逐漸過渡到復雜的集合框架應用;實驗項目則從簡單的"大象裝冰箱"模擬逐步升級為帶有圖形界面的完整應用系統。
課程難度呈現明顯的階梯式上升特征:實驗一和實驗二主要考察類與對象的基本概念;實驗三引入集合框架和排序算法;實驗四增加了抽象類和接口的設計;實驗五則綜合應用JavaFX實現圖形界面。這種循序漸進的設計讓我能夠逐步適應面向對象編程的思維方式,而不會一開始就被復雜的系統嚇倒。
一, 面向對象技術深度總結
- 封裝:從數據保護到職責劃分
在實驗二中,我首次真正理解了封裝的意義。通過將大象類的屬性(name, weight, height)設為private并提供公有的getter/setter方法,我學會了如何保護對象內部狀態不被意外修改。隨著實驗的深入,我發現封裝不僅僅是數據隱藏,更是模塊職責的劃分。
// 實驗二中的Elephant類體現了基本封裝思想
public class Elephant {
private String name;
private int weight;
private int height;
public Elephant(String name, int weight, int height) {
this.name = name;
this.weight = weight;
this.height = height;
}
// 公有的getter方法提供受控訪問
public String getName() { return name; }
public int getWeight() { return weight; }
}
- 繼承與多態:構建靈活的對象體系
實驗四讓我深入理解了繼承與多態的價值。通過設計Animal抽象類和Elephant、Lion、Tiger等子類,我學會了如何將共性提取到父類中,而將特性保留在子類中。多態則讓我能夠以統一的方式處理不同類型的動物對象。
// 實驗四中的繼承體系
public abstract class Animal {
protected String name;
protected int weight;
// 公共屬性和方法...
}
public class Lion extends Animal implements HasAggression {
@Override
public void cry() {
System.out.println(name + " 獅子:怒吼一聲!");
}
}
- 抽象類與接口:契約式編程的實踐
實驗四中的抽象類Electric和接口HasAggression讓我理解了"面向接口編程"的意義。抽象類Electric定義了電器類的基本結構和部分實現,而HasAggression接口則標記了具有攻擊性的動物。
// 實驗四中的接口應用
public interface HasAggression {
int getAggression(); // 1表示有攻擊性,0表示無
}
public class Lion extends Animal implements HasAggression {
@Override
public int getAggression() {
return 1;
}
}
4. 集合框架:從數組到動態容器
實驗三到實驗五展示了集合框架的強大能力。從實驗二中使用簡單數組存儲大象,到實驗四中使用ArrayList管理動物列表,再到實驗五中結合JavaFX控件展示集合數據,我深刻體會到了集合框架的靈活性。
// 實驗四中電器類使用ArrayList管理動物
public abstract class Electric {
protected List
public void addAnimal(Animal animal) {
if (animals.size() >= capacity) return;
animals.add(animal);
}
}
5.** JavaFX:面向對象的GUI開發**
實驗五是我第一次接觸JavaFX圖形編程,通過將實驗四的邏輯與圖形界面結合,我理解了事件驅動編程模型和MVC架構的基本思想。PathTransition動畫的實現尤其讓我印象深刻。
// 實驗五中的動畫實現
PathTransition transition = new PathTransition();
transition.setNode(movingMarker);
transition.setPath(path);
transition.setDuration(Duration.seconds(distance/speed));
transition.play();
二, 采坑心得:從挫折中成長
- 類型轉換與接口實現
在實驗四中,我最初對HasAggression接口的實現方式理解有誤,導致在判斷動物攻擊性時頻繁出現ClassCastException。通過反復調試,我學會了使用instanceof進行類型檢查的正確方式:
// 錯誤的方式
int aggression = ((HasAggression)animal).getAggression(); // 可能拋出ClassCastException
// 正確的方式
if (animal instanceof HasAggression) {
int aggression = ((HasAggression)animal).getAggression();
}
- 集合排序的困惑
實驗四要求使用Collections.sort()進行多種排序,我最初混淆了Comparable和Comparator的用法。通過實踐,我理解了:
Comparable:對象自身實現的默認排序規則
Comparator:外部定義的可插拔排序策略
// 實驗四中的兩種排序方式
Collections.sort(animalList); // 使用Animal實現的Comparable
Collections.sort(animalList, new AnimalOrderComparator()); // 使用Comparator
JavaFX坐標系的誤解
- 實驗五中實現動物移動動畫時,我最初錯誤理解了局部坐標和場景坐標的關系,導致動物總是飛到錯誤位置。通過調試,我掌握了坐標轉換的正確方法:
// 獲取精確的場景坐標
Bounds sourceBounds = sourceMarker.localToScene(sourceMarker.getBoundsInLocal());
double targetX = targetBounds.getMinX() - animalContainer.localToScene(0, 0).getX();
三, 改進建議與課程總結
- 課程亮點
(1)漸進式學習路徑:從基礎到高級的內容安排非常合理
(2)理論與實踐結合:每個概念都有對應的實驗驗證
(3)綜合性實驗設計:實驗五整合了前面所有知識點
- 改進建議
(1)JavaFX前置知識:建議在實驗五前增加1-2個基礎GUI實驗
(2)調試指導:可以提供更多常見錯誤的排查指南
(3)代碼評審環節:增加同學間的代碼互評可能更有助于學習
四, 個人收獲總結
代碼之外,是成長的詩與遠方
學習編程,最初或許只是為了完成作業、通過考試,但不知不覺中,它已經改變了我的思維方式。從實驗二的“大象裝冰箱”到實驗五的JavaFX動畫,我不僅學會了如何讓對象在內存中交互,更學會了如何讓邏輯在思維中流動。
記得在實驗四調試排序算法時,深夜的屏幕前,我一遍遍修改compareTo()方法,直到Collections.sort()終于按照我期望的順序排列動物列表。那一刻的成就感,不亞于解開一道困擾已久的數學題。而在實驗五,當我第一次看到自己寫的小獅子從屏幕中央飛入冰箱,并在日志區留下“獅子已裝入”的記錄時,那種“讓代碼活起來”的驚喜,讓我真切地感受到編程的魔力。
編程不僅是邏輯,更是創造。
它像寫詩一樣,需要嚴謹的結構,也需要靈感的迸發。類與對象是詞匯,繼承與多態是修辭,而整個程序,就是一首由代碼寫成的詩。
這門課讓我明白,真正的編程高手,不是記住了多少API,而是能用代碼優雅地描述世界。冰箱、大象、獅子、老虎,它們不僅僅是對象,而是我構建的一個小小世界。而Java的封裝、繼承、多態,就像是這個世界的物理法則,讓一切運行得井然有序。
浙公網安備 33010602011771號