✌OOP课程第三次总结

1.前言

  PTA

  实验

  课程

  Blog

2.面向对象技术总结

  封装

  继承

  多态

  抽象类

  接口

  类之间关系

  集合框架

  异常

  JavaFx

  面向对象设计原则

  设计模式

3.踩坑心得

4.总结

👍1.前言

不知不觉中,一个学期转瞬即逝,马上就要结束大一的生活,完成一个身份的转变,成为大二的学长了。在这个学期中,学习了面向对象技术,同时也认识到了面向对象与面向过程的区别。

PTA

从整体上来说,面向对象比面向过程稍易,不用考虑令人头痛的指针、链表等。这个学期的PTA作业是先易后难的趋势,难度主要体现在那几次的电梯的迭代和几次题目集的最后一题,挑战逻辑思维,但总该是挺过来了,题目的数量不算多,有时候会卡在某一个测试点过不去。

实验

本学期做的五次实验主要是对大象装入冰箱的五次迭代,对动物的扩展,对电器的扩展以及排序算法,最后用Javafx模拟动物装入电器,循序渐进。真正地体会到了从理论到实践的过程。

线上课程与线下课程

线上课程与线下课程相结合。通过学习线上课程,起到一个预习的作用,再通过线下课程对知识点有了一个更深的理解,这是一个很好的学习方式。在课上与老师的思想进行碰撞。

Blog

Blog作业是一个非常好的形式,总结自己每次的不足,然后加以改进。虽然刚开始写Blog,有点无从下手,不知道写什么,但后面就慢慢找到了自己的节奏。有可能的话,我会将写Blog的这个习惯一直保持一下,受益。

 

👍2.面向对象技术总结

(1)  封装

就是在数据和操作这些数据的方法绑定在一起,通过private修饰属性,并隐藏对象的内部实现细节。在题目集4中的创建圆形类,将半径radius设置为私有属性,通过getter/setter访问,并将计算面积cal封装在这个类的内部。

(2)  继承

就是从已经存在的类中定义新的类,这些类有共同的属性,但要注意的是Java只支持单继承,不支持多继承,对super关键字的使用。继承让代码复用成为可能,在题目集9中的魔方问题中,正方体魔方和正三棱锥魔方都继承于魔方这个类,有共同的求面积和求体积的方法。

 

 

(3)多态

就是使用父类型对象的地方都可以使用子类型对象。在题目集9中的航空货运管理系统中,其中选择支付方式就是使用了多态,先创建父类对象Payment,然后再根据客户需求将子类引用赋值给父类。

(4)抽象类

就是父类定义了相关子类的共同行为(共同特征),但要注意的是抽象类不能实例化对象,用abstract修饰。在实验四,定义了抽象父类动物类,大象、狮子和老虎继承于(abstract)动物类,由于它们都有叫和比较战斗力的行为。于是就在父类中定义抽象方法,让子类去Override。

(5)接口

接口是一种与类相似的构造,用于为对象定义共同的操作。以Comparable接口为例,定义了ComparaTo方法,用于比较对象。在实验四中,就用到了这个接口,用于比较动物的直接战斗力。

(6)类与类之间的关系

它们之间的关系有关联、依赖、组合(生存期一致)、聚合(生存期不一致)和继承。对区分关联关系和依赖关系有所欠缺,有时候会把它们两者搞混。关联可以通过成员变量实现,是长期关系。而依赖通过方法参数实现,关系是临时。

继承

class A extends B

关联

class A { private B b; }

依赖

void foo(B b)

聚合

class A { private B b; }

组合

class A { private B b = new B(); }	

(7)集合框架现在掌握的还不多

解决了数组的局限性。集合框架主要有List,Set,Map等,Set和Map集合框架也是我最不熟悉的点,在后续中还是要多加练习。Set是无序,不可重复的集合,常用实现类有 HashSet、TreeSet、LinkedHashSet 等。Map用于存储键值对(key-value),键唯一,值可重复,常用实现类有 HashMap、TreeMap、LinkedHashMap 等。

(8)异常项目开发的必需品

异常是运行时错误。异常处理使得程序可以处理运行时错误,并且继续正常的执行。在此次的JavaFx的大作业中,在从文件中读取数据的时候就用到了异常处理。如何有异常,就会被catch抓住,并印异常的堆栈跟踪信息(Stack Trace)。如果没有异常就执行try语句块。

类别 检查型异常 (Checked) 非检查型异常 (Unchecked)                                错误 (Error)
继承关系              Exception            RuntimeException                     Throwable
处理要求              必须捕获或声明throws            可忽略                      不应捕获
示例     IOException            NullPointerException                      OutOfMemoryError

(9)JavaFx

JavaFx可以用来开发GUI程序。由于现在在做飞机仪表盘项目,使用的是C语言ege,跟它比较起来,JavaFx真是对用户太好了。下面我想向大家推荐一款软件,它叫SceneBuilder,是专为 JavaFX 应用程序开发 打造的 图形化布局工具 ,无需手动编写大量 UI 代码。借助直观的拖放操作,把按钮、文本框、表格等 UI 组件放到设计面板,还可自动生成对应的 FXML 代码。比如现在做的JavaFx的大作业(航空货运管理系统),就可以使用SceneBuilder来提高我们的工作效率。

10)面向对象设计原则重要

在进行类与类设计的时候,我们要遵守以下原则:开闭原则(OCP)、里氏代换原则(LSP)、依赖倒转原则(DIP)、合成复用原则(ARP)、接口隔离原则(ISP)、迪米特法则(LOD)等。

(11)设计模式

1)工厂模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

模式 特点 适用场景
简单工厂 一个工厂类,通过参数创建不同产品 产品较少且不经常变化
工厂方法 每个产品对应一个工厂类 需要灵活、可扩展的系统
抽象工厂 一个工厂创建一系列相关产品 需要保证产品兼容性的系统

2)单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

饿汉式

public class EagerSingleton {
    // 类加载时就初始化
    private static final EagerSingleton instance = new EagerSingleton();
    
    // 私有构造方法
    private EagerSingleton() {}
    
    // 全局访问点
    public static EagerSingleton getInstance() {
        return instance;
    }
}

懒汉式

双重检查锁

public class DCLSingleton {
    // volatile保证可见性和禁止指令重排序
    private static volatile DCLSingleton instance;
    
    private DCLSingleton() {}
    
    public static DCLSingleton getInstance() {
        if (instance == null) { // 第一次检查
            synchronized (DCLSingleton.class) {
                if (instance == null) { // 第二次检查
                    instance = new DCLSingleton();
                }
            }
        }
        return instance;
    }
}

3)适配器模式

将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。主要是有类适配器和对象适配器。

应用场景:

  • 系统需要使用现有类,但这些类的接口不符合系统需求
  • 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的类一起工作
  • 统一多个类的接口(如不同第三方库的相似功能)

 

4)策略模式

定义一系列算法,将每个算法封装起来,并使它们可以互相替换。策略模式让算法独立于使用它的客户而变化。

优点:

  • 算法自由切换:可以灵活地在运行时切换算法
  • 避免多重条件判断:替代大量的if-else语句
  • 扩展性好:增加新策略无需修改现有代码
  • 符合开闭原则:对扩展开放,对修改关闭

 

👍 3.踩坑心得

(1)在给变量命名的时候要注意命名规则,遵守驼峰命名法,不要随便给变量起名字。

(2)在前几次的题目集中,出现了把有些类写在Main方法中的情况,复用性极差。就是不要把什么东西都往Main里面塞。

(3)不管写哪个类时,最好要加一个空参的构造方法,以免后续出现错误。

(4)要及时转换思维,不要用面向过程的思维去考虑面向对象的问题,避免重复造轮子。

(5)类与类之间的关系设置不当,导致逻辑混乱。

(6)不要只是为了通过测试点,拿到分,而追求代码能跑就行,我们应该提高代码的质量。

👍4.总结

通过对面向对象Java的学习,了解和掌握到了许多面向对象的技术,也让我对编程语言有了新的认识,同时编程能力也得到了一定的提高,为将来深入学习打下了一定的基础,非常感谢各位老师的教导。同时JavaFx的翻转课堂,也锻炼了我们的表达能力和自主学习能力。在此学习过程中,只能说痛苦与快乐并存,当点提交时,屏幕出现全部正确时,那种快乐是不言而喻的,当总卡在一个测试点没有通过时,那种痛苦也是不言而喻的,只能说道阻且长吧,同志还需努力。Java课程组有一个非常好的优点就是题目的迭代升级,每一次做题都对知识点的理解与深化,同时也能发现自己的不足,及时改正。虽然Java课程结束了,但是对面向对象的学习没有结束,将对Java的设计模式做进一步的了解,充实自己。
System.out.println("感谢老师和同学们!");