第三章--第四节:面向对象的程序设计

时间:2022-09-24 20:28:00

第三章:抽象数据类型(ADT)和面向对象编程(OOP)

第四节:面向对象的程序设计


问题一:一个类的静态方法和实例方法的区别

    用法的区别:静态方法与任何类中的实例都没有联系,实例方法必须需要一个特定的对象来调用(在静态函数中)。

    第三章--第四节:面向对象的程序设计

    内存存储的区别:

第三章--第四节:面向对象的程序设计


问题二:接口(Interface)与封装隐藏

    1.接口的特点:

  •     接口定义抽象数据类型(ADT),类实现ADT;接口确定ADT规约,类实现ADT
  •     接口之间可以继承
  •     一个类可以实现多个接口
  •     一个接口可以有多种实现
  • 打破了抽象边界,接口定义中没有包含constructor,依然无法保证所有实现类中都包含了同样名字的constructor。因此,客户端需要知道该接口的某个具体实现类的名字。
  • 实现实例:

第三章--第四节:面向对象的程序设计

第三章--第四节:面向对象的程序设计

    2.使用静态工厂来替代构造函数
  •    更详细的介绍
  • 通过上面链接最需要了解的是:它与构造函数不同,它可以返回类型的子类型对象。这样可以强迫使用者通过接口来引用被返回的对象,而不是通过实现来引用。
  • 其次是,可以降低类之间的耦合性(理解的不是太好。。。)
  • 静态工厂的实现形式

第三章--第四节:面向对象的程序设计

第三章--第四节:面向对象的程序设计

    3.接口与信息封装隐藏

  •     使用接口类型声明变量
  •     客户端仅使用接口中定义的方法
  •     客户端代码无法直接访问属性

问题三:继承与重写(Inheritance and Overriding)

    1.严格继承:子类只能添加新方法,无法重写超类中的方法(一个方法不能被重写,必须用 final 关键字定义)


    2.final关键字在不同场合的应用

  •     用final定义的一块区域(的表示),再表示初始化之后不能被在赋值(引用不可变)
  •     用final定义的一个方法,该方法不能被重写
  •     用final定义的一个类,该类不能被继承

    3.覆盖/重写(Overriding)

    用法:重写的函数与被重写的函数有(一样的名字,一样的参数和签名和一样的返回类型)

  •     ***实际执行时调用哪个方法,运行时决定(动态检查)
  • 若父类型中的被重写的函数体不为空:意味着该方法可以被直接服用或者被重写
  • 若父类型中的某个函数实现体为空,意味着其所有子类型都需要这个功能,但各有差异,没有共性,在每个子类中均需要重写
  • 重写之后,利用super()复用了父类型中函数的功能。
  • 重写的时候不要改变原方法的本意

问题四:抽象类

    抽象级别排序:具体类→抽象类→接口

  • 如果某些操作是所有子类型都共有,但彼此有差异,可以再父类型中涉及抽象方法,在各个子类型中重写。
  • 所有子类型完全相同的操作,放在父类型中实现,子类型中无需重写。
  • 有些子类型有而其他子类没有的操作,不要在父类型中定义和实现,而应在特定子类型中实现

问题五:多态和重载(Polymorphism and overloading)

    1.多态的分类:特殊多态(Ad hoc polymorphism)对应于功能重载(functionoverloading)、参数化多态(Parametric polymorphism)对应于(genericprogramming)、子类型多态或包含多态(Subtyping)

    2.特殊多态(Ad hoc polymorphism)与重载(Overloading)

    用法:多个方法具有同样的名字,但有不同的参数列表或返回类型(必须具有不同的参数列表,可以具有相同或者不同的标签和返回类型)(可以咋子同一个类内重载,也可以在子类中重载)

    价值:方便client调用,client可用不同的参数列表,调用同样的函数

  • ***重载是一种静态多态,根据参数列表进行最佳匹配
  • ***静态类型检查(static type checking),在编译阶段决定要具体执行哪个方法
  • ***与之相反,重写(override methods)则是在run-time(运行阶段)进行动态检查(dynamic checking)

**:判断调用的是哪个函数

第三章--第四节:面向对象的程序设计

(因为animalRefToHorce前面的类型是Aniaml,实例后的类型是Horce,但因为重载是静态多态,在编译时检查,所以它的类型为前面的Animal,自然调用的是参数类型为Animal的函数)

***:看下列语句的输出是什么?

第三章--第四节:面向对象的程序设计

第三章--第四节:面向对象的程序设计

解:(每一行分别对应1,2,3,4)

第三章--第四节:面向对象的程序设计

(第一个,第二个比较基本无需解释。第三个,因为vocalize()函数为重写,所以是动态检查即在运行时检查,b的类型为Cow,所以调用的是Cow类里的函数。第四个,因为java是静态检查语言即在编译时检查,所以b的类型判定为Animal,无法点用moo()函数)

  •  ***重写(Overriding)与重载(Overloading)的区别

第三章--第四节:面向对象的程序设计

    3.参数化多态(Parametric polymorphism)与泛型(Generic programming)(不太会)

    含义:是一种类型变量

    泛型类:其定义包含了类型变量

    泛型接口的两种表示:泛型接口,非泛型的实现类

                                      泛型接口,泛型的实现类

    4.子类型多态(Subtyping Polymorphism)(不太会...)

问题六:动态分派(Dynamic dispatch)与静态分派(static dispatch)

对比:

****:静态分派

第三章--第四节:面向对象的程序设计

        动态分派:

第三章--第四节:面向对象的程序设计

总结:

第三章--第四节:面向对象的程序设计