《面向对象程序设计课程总结》
前言
在本门面向对象程序设计课程的学习过程中,涉及了多个教学环节,包括Blog作业、PTA作业、实验、线上课程以及线下课程。整体课程的工作量较大,需要投入较多的时间和精力。
Blog作业
Blog作业主要是对课程学习过程中的阶段性总结和反思。通过撰写Blog,有助于我们系统地整理所学知识,加深对知识点的理解。虽然每次的Blog作业量不大,但要求我们对课程内容有较为深入的思考和总结,这对我们的归纳和表达能力有一定的锻炼。
例如,在完成了PTA上老师布置的航空货运管理系统作业后,布置了一篇针对这次作业总结的Blog任务。为了完成这篇Blog,需要梳理两次系统迭代中的变化,例如从面向对象的三大特性(封装、继承、多态)的角度来看,在封装方面,将货物的属性和操作封装在Good类中,避免了外部代码对货物内部数据的随意修改;在继承方面,Customer、Sender、Receiver类继承自Person类,共享了Person类的通用属性,减少了代码的重复;而多态则体现在不同类型的订单在计算费用时表现出不同的行为。通过撰写这篇Blog,我对这些知识点的理解更加深刻,同时也提高了自己的归纳和表达能力。
PTA作业
PTA作业是本课程的重要组成部分,其题量较多,难度逐步递增。从基础的语法练习到复杂的面向对象设计,每个阶段的作业都紧密围绕课程内容展开。前期的作业主要是巩固课堂所学的基础知识,如类的定义、方法的使用等;后期的作业则更加注重综合应用,要求我们运用封装、继承、多态等面向对象的技术,以及遵从面向对象六大设计原则来解决实际问题。这些作业对我们的编程能力和思维能力提出了较高的要求,需要花费大量的时间去分析问题、设计解决方案并编写代码。
实验
实验环节是理论知识与实践相结合的重要途径。通过实验,我们可以更加深入地理解和掌握所学的知识。实验内容通常与课程的重点和难点紧密相关,如设计模式的应用、异常处理等。每个实验都有明确的目标和要求,需要我们在规定的时间内完成。实验过程中,我们不仅要完成代码的编写,还要对实验结果进行分析和总结,这有助于提高我们的实践能力和问题解决能力。
线上课程
线上课程为我们提供了丰富的学习资源,我们可以根据自己的学习进度和需求随时进行学习。线上课程的内容涵盖了课程的各个知识点,通过视频讲解、案例分析等方式,帮助我们更好地理解和掌握课程内容。同时,线上课程还提供了在线测试和讨论区,方便我们进行自我检测和交流学习。
有一次,在学习继承和多态的相关知识时,由于线下课程的时间有限,一时间没有深刻理解继承和多态。为了深入学习继承和多态,我利用线上课程进行了系统的学习。线上课程中的视频讲解详细地介绍了继承与多态,通过实际的案例分析,让我更加直观地了解了如何使用继承与多态让程序更加规范。此外,线上课程的在线测试功能让我能够及时检验自己的学习成果,发现自己的不足之处。在讨论区,我还可以与其他同学交流学习经验和心得,解决遇到的问题。
线下课程
线下课程是我们与教师和同学进行面对面交流的重要平台。在课堂上,教师会对重点和难点知识进行详细讲解,并通过实例演示和互动讨论的方式帮助我们加深理解。线下课程还为我们提供了实践操作的机会,让我们在教师的指导下进行代码编写和调试,及时发现和解决问题。
在学习异常处理这一章节时,老师在课堂上详细讲解了try-catch-finally语句的使用方法和自定义异常类的创建。为了让我们更好地理解,老师通过一个实际的案例进行了演示。在案例中,程序需要检测输入是否符合要求。老师在代码中使用try-catch-finally语句来捕获和处理这些异常,生动形象。
面向对象技术总结
封装
封装是面向对象编程的重要特性之一,它将数据和操作数据的方法绑定在一起,隐藏对象的内部实现细节,只对外提供必要的接口。在PTA作业和实验中,我深刻体会到了封装的重要性。通过封装,我们可以提高代码的安全性和可维护性,避免外部代码直接访问和修改对象的内部数据。例如,在航空货运管理系统中,我们将货物、航班、订单等信息封装在不同的类中,通过提供公共的方法来访问和修改这些信息,从而保证了数据的一致性和安全性。
在Good类中,我们将货物的属性(如货物编号、货物名称、货物宽度、货物长度、货物高度、货物重量等)封装在类的内部,使用private修饰符进行修饰。然后,我们提供了公共的getter和setter方法来访问和修改这些属性。这样,外部代码只能通过这些公共方法来操作货物的属性,避免了直接访问和修改对象的内部数据,提高了代码的安全性。例如:
class Good {
private String id;
private String name;
private double width;
private double length;
private double height;
private double weight;
public Good(String id, String name, double width, double length, double height, double weight) {
this.id = id;
this.name = name;
this.width = width;
this.length = length;
this.height = height;
this.weight = weight;
}
}
继承
继承是指一个类可以继承另一个类的属性和方法,从而实现代码的复用和扩展。在学习过程中,我学会了如何使用继承来创建子类,并在子类中重写父类的方法以实现不同的行为。例如,在航空货运管理系统中,我们将客户、发件人、收件人等类继承自抽象父类Person,共享通用属性,遵循了依赖倒置原则。通过继承,我们可以减少代码的重复,提高代码的可维护性和扩展性。
Person类作为抽象父类,包含了一些通用的属性(如姓名、电话、地址等)和方法。Customer、Sender、Receiver类继承自Person类,继承了这些通用属性和方法,同时可以根据自身的需求添加额外的属性和方法。例如:
abstract class Person {
protected String name;
protected String phone;
protected String address;
public Person(String name, String phone, String address) {
this.name = name;
this.phone = phone;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
class Customer extends Person {
private String customerType;
public Customer(String name, String phone, String address, String customerType) {
super(name, phone, address);
this.customerType = customerType;
}
public String getCustomerType() {
return customerType;
}
public void setCustomerType(String customerType) {
this.customerType = customerType;
}
}
多态
多态是指同一个方法可以根据对象的不同类型而表现出不同的行为。在PTA作业和实验中,要求通过接口和抽象类实现多态。例如,在航空货运管理系统中,我们定义了Weightable接口和calculatable接口,不同的类实现这些接口后,可以根据具体的对象类型调用不同的方法,从而实现了多态。多态的应用可以提高代码的灵活性和可扩展性,使我们的程序更加易于维护和扩展。
在航空货运管理系统中,我们定义了Weightable接口,用于获取对象的计费重量。Good类和Ordercategory类都实现了Weightable接口,但它们的getWeight()方法的实现方式不同。这样,在调用getWeight()方法时,根据对象的实际类型调用不同的实现方法,实现了多态。例如:
interface Weightable {
double getWeight();
}
class Good implements Weightable {
private double length;
private double width;
private double height;
private double weight;
public Good(double length, double width, double height, double weight) {
this.length = length;
this.width = width;
this.height = height;
this.weight = weight;
}
@Override
public double getWeight() {
double volweight = length * width * height / 6000;
return Math.max(volweight, weight);
}
}
class Ordercategory implements Weightable {
private Good good;
public Ordercategory(Good good) {
this.good = good;
}
@Override
public double getWeight() {
return good.getWeight();
}
}
抽象类和接口
抽象类和接口是Java中实现多态的重要手段。抽象类是一种不能实例化的类,它可以包含抽象方法和具体方法。接口是一种特殊的抽象类,它只包含抽象方法。在学习过程中,我学会了如何使用抽象类和接口来定义规范和约束,提高代码的可维护性和扩展性。例如,在航空货运管理系统中,除了上述的Weightable接口,我们还定义了calculatable接口,用于计算费用。不同的订单类型(如普通订单、加急订单、危险品订单)实现了calculatable接口,根据自身的特点实现了不同的费用计算方法。例如:
interface calculatable {
double calculateFee();
}
class NormalOrder implements calculatable {
private double weight;
public NormalOrder(double weight) {
this.weight = weight;
}
@Override
public double calculateFee() {
if (weight < 20) {
return weight * 35;
} else if (weight < 50) {
return weight * 30;
} else if (weight < 100) {
return weight * 25;
} else {
return weight * 15;
}
}
}
class ExpediteOrder implements calculatable {
private double weight;
public ExpediteOrder(double weight) {
this.weight = weight;
}
@Override
public double calculateFee() {
if (weight < 20) {
return weight * 40;
} else if (weight < 50) {
return weight * 35;
} else if (weight < 100) {
return weight * 30;
} else {
return weight * 20;
}
}
}
集合框架
集合框架是Java中用于存储和操作数据的一组类和接口。在PTA作业和实验中,我学会了如何使用集合框架来存储和管理数据。例如,在电梯调度程序中,我们使用数组来存储电梯的请求队列,通过对数组的操作来实现电梯的运行逻辑。集合框架的应用可以提高代码的效率和可维护性,使我们的程序更加易于开发和扩展。
在电梯调度程序中,我们可以使用ArrayList来存储电梯的请求队列,这样可以动态地添加和删除请求,提高了代码的灵活性。例如:
import java.util.ArrayList;
class Elevator {
private ArrayList<Integer> innerQueue;
private ArrayList<Integer> outQueue;
private ArrayList<String> outDirection;
public Elevator() {
innerQueue = new ArrayList<>();
outQueue = new ArrayList<>();
outDirection = new ArrayList<>();
}
public void addInnerRequest(int floor) {
innerQueue.add(floor);
}
public void addOutRequest(int floor, String direction) {
outQueue.add(floor);
outDirection.add(direction);
}
// 其他方法...
}
异常处理
异常处理是Java中用于处理程序运行过程中出现的错误和异常的机制。在学习过程中,我学习了如何使用try-catch-finally语句来捕获和处理异常,以及如何自定义异常类。例如,在电梯调度程序中,我们对输入的请求进行校验,当输入的请求楼层超出范围或出现重复请求时,程序会自动忽略这些请求,避免出现异常。异常处理的应用可以提高程序的健壮性和可靠性,使我们的程序更加稳定和安全。
在电梯调度程序中,我们可以自定义一个InvalidRequestException类,用于处理无效的请求。当输入的请求楼层超出最大或最小楼层范围时,抛出该异常并进行处理。例如:
class InvalidRequestException extends Exception {
public InvalidRequestException(String message) {
super(message);
}
}
class Elevator {
private int minFloor;
private int maxFloor;
public Elevator(int minFloor, int maxFloor) {
this.minFloor = minFloor;
this.maxFloor = maxFloor;
}
public void addInnerRequest(int floor) throws InvalidRequestException {
if (floor < minFloor || floor > maxFloor) {
throw new InvalidRequestException("Invalid floor request: " + floor);
}
// 处理请求...
}
// 其他方法...
}
JavaFX
JavaFX是Java中用于创建富客户端应用程序的框架。在课程中,我们对JavaFX进行了初步的学习,了解了JavaFX的基本概念和使用方法。通过学习,我对JavaFX有了一定的了解,为今后的学习和开发打下了基础,但是面对最后一次的航空货运管理系统的UI化设计,我发现自己的知识储备还不够,需要继续学习和实践。
在学习JavaFX时,我们通过一个简单的示例程序了解了如何使用JavaFX创建一个窗口,并在窗口中添加按钮和文本框等组件。例如:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class JavaFXExample extends Application {
@Override
public void start(Stage primaryStage) {
Button button = new Button("Click me!");
TextField textField = new TextField();
VBox vbox = new VBox(button, textField);
Scene scene = new Scene(vbox, 300, 200);
primaryStage.setTitle("JavaFX Example");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
掌握情况总结
通过本门课程的学习,我对封装、继承、多态、抽象类、接口、集合框架、异常处理等面向对象技术有了较为深入的理解和掌握。在PTA作业和实验中,我能够运用这些技术来解决实际问题,提高了自己的编程能力和思维能力。然而,我也意识到自己在某些方面还存在欠缺,例如对设计模式的理解和应用还不够深入,对JavaFX的掌握还不够熟练等。在今后的学习中,我将继续加强对这些方面的学习和实践,不断提高自己的技术水平。
采坑心得
输入输出问题
在处理输入输出时,经常会遇到各种问题。例如,在航空货运管理系统中,连续使用nextInt()和nextLine()时,会出现输入错位的问题,需要用in.nextLine()手动清空换行符。在电梯调度程序中,对输入的end不区分大小写,需要使用equalsIgnoreCase方法来进行匹配。这些问题提醒我在处理输入输出时要仔细考虑各种情况,避免出现错误。
在航空货运管理系统中,当我们使用Scanner类读取输入时,如果先使用nextInt()读取一个整数,然后再使用nextLine()读取一行字符串,会发现nextLine()读取的是空字符串。这是因为nextInt()只读取整数,不会读取换行符,而nextLine()会读取换行符作为输入。因此,我们需要在nextInt()之后使用in.nextLine()手动清空换行符。例如:
import java.util.Scanner;
public class InputOutputExample {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = in.nextInt();
in.nextLine(); // 手动清空换行符
String str = in.nextLine();
System.out.println("Number: " + num);
System.out.println("String: " + str);
in.close();
}
}
逻辑设计问题
在设计程序逻辑时,有时会考虑不周全,导致程序出现漏洞或运行超时的问题。例如,在电梯调度程序中,一开始没有考虑完全所有的情况,只根据输入样例编写逻辑,导致程序在某些情况下出现无限循环的问题。经过与同学交流和仔细思考,我发现通过判断电梯当前楼层与内外队列队头的大小关系能够保证所有的情况都能被考虑到,从而解决了问题。这让我认识到在编写代码前要对问题进行全面的分析和思考,设计出合理的逻辑结构。
在电梯调度程序中,一开始我只考虑了输入样例中的几种情况,没有考虑到所有可能的情况。例如,当电梯内部请求队列为空,而外部请求队列不为空时,没有正确处理这种情况,导致程序出现无限循环。后来,我通过仔细分析电梯的运行规则,发现可以通过判断电梯当前楼层与内外队列队头的大小关系来确定电梯的运行方向和目标楼层。这样,就可以保证所有的情况都能被考虑到,避免了无限循环的问题。
类设计问题
在进行类设计时,有时会出现类之间的关系混乱、职责不清的问题。例如,在电梯调度程序的迭代过程中,从单类设计到多类设计,一开始没有合理规划类之间的关系,导致代码结构混乱,无法正常运行。后来通过参考类图和仔细分析,我对类进行了合理的拆分和调整,保证了类之间的关系合理,提高了代码的可维护性和扩展性。这让我认识到在进行类设计时要遵循面向对象的设计原则,如单一职责原则、开闭原则等,合理规划类之间的关系。
在电梯调度程序的第一次迭代中,我将所有的功能都放在了一个Elevator类中,导致该类的职责过多,代码结构混乱。后来,根据单一职责原则,我将电梯的属性和方法拆分成多个类,如Elevator类负责电梯的运行状态和操作,PassengerRequest类负责存储乘客的请求信息,Queue类负责管理请求队列,Controller类负责协调电梯和请求队列的工作。通过这样的拆分,每个类的职责更加明确,代码结构更加清晰,提高了代码的可维护性和扩展性。
异常处理问题
在处理异常时,有时会忽略一些异常情况,导致程序出现崩溃或错误的结果。例如,在电梯调度程序中,没有对输入的请求楼层进行校验,当输入的请求楼层超出范围时,程序会出现异常。后来通过添加异常处理代码,对输入的请求进行校验,避免了异常的发生。这让我认识到在编写代码时要考虑到各种可能出现的异常情况,及时进行处理,提高程序的健壮性和可靠性。
在电梯调度程序中,一开始没有对输入的请求楼层进行校验,当用户输入的请求楼层超出最大或最小楼层范围时,程序会抛出ArrayIndexOutOfBoundsException异常。为了解决这个问题,我在接收请求的代码中添加了异常处理逻辑,当输入的请求楼层超出范围时,程序会输出错误信息并忽略该请求。例如:
import java.util.Scanner;
public class Elevator {
private int minFloor;
private int maxFloor;
public Elevator(int minFloor, int maxFloor) {
this.minFloor = minFloor;
this.maxFloor = maxFloor;
}
public void addRequest(int floor) {
if (floor < minFloor || floor > maxFloor) {
System.out.println("Invalid floor request: " + floor);
return;
}
// 处理请求...
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int minFloor = in.nextInt();
int maxFloor = in.nextInt();
Elevator elevator = new Elevator(minFloor, maxFloor);
while (in.hasNext()) {
String input = in.next();
if ("end".equalsIgnoreCase(input)) {
break;
}
try {
int floor = Integer.parseInt(input.replaceAll("[<>]", ""));
elevator.addRequest(floor);
} catch (NumberFormatException e) {
System.out.println("Invalid input: " + input);
}
}
in.close();
}
}
改进建议及总结
综合性总结
通过本门课程的学习,我对面向对象编程有了更深入的理解和掌握,提高了自己的编程能力和思维能力。在课程学习过程中,我不仅学到了知识,还培养了自己的问题解决能力。然而,我也意识到自己在某些方面还存在欠缺,需要在今后的学习中不断加强。
改进建议
对教师的建议
- 讲的很好,知识很全面,希望能幽默一点
对课程的建议
- 增加课程的趣味性和实用性,结合实际项目进行教学,让学生更好地理解和应用所学知识。例如,可以引入一些实际的项目案例,让学生在项目中运用所学的面向对象技术进行开发,提高学生的实践能力和解决问题的能力。
对作业和实验的建议
- 合理安排作业和实验的难度和数量,避免作业和实验难度过大或数量过多,给学生造成过大的压力。可以根据学生的学习进度和能力水平,逐步增加作业和实验的难度和数量,确保学生能够在掌握基础知识的前提下,逐步提高自己的编程能力。
对课上及课下组织方式的建议
- 优化课上的教学方式,采用更加互动和多样化的教学方法,如小组讨论、案例分析等,提高学生的学习积极性和参与度。可以将学生分成小组,让小组内的成员共同讨论和解决问题,然后每个小组派代表进行汇报和交流。
- 加强课下的辅导和答疑,为学生提供更多的学习支持和帮助,及时解决学生在学习过程中遇到的问题。可以安排专门的辅导时间,让教师在课下为学生提供一对一的辅导和答疑服务,也可以建立在线答疑平台,方便学生随时提问和交流。
通过以上的总结和建议,我希望能够为今后的课程学习和教学提供一些参考和借鉴,同时也希望自己在今后的学习中能够不断提高自己的技术水平和综合素质。

浙公网安备 33010602011771号