天天看点

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

3.4Object-Oriented Programming(OOP)面向对象的编程

1.object,class,attribute,method的基本概念

1.object

object为现实中的物体,有状态和行为两种特点。

例如:

  • 狗的状态有姓名,颜色,饥饿度。
  • 狗的行为有叫,摇尾巴,捡东西。

-自行车的状态有车轮子,车蹬子,速度。

-自行车的行为有换轮子,换车蹬子,踩刹车。

Java中将状态称为属性(fields),将行为称为方法(methods)。

2.classes

类定义了属性(fields)和方法(methods)

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

Customer为类的名字,下面是属性和方法。

类方法(class methods)和实例方法(instance methods)的区别.

  • display()即为类方法,需在前面加static,可直接用类调用。
  • show()为实例方法,需要新建一个实例对象,在实例对象中调用。
软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

注意:

  • 静态方法无法调用非静态成员(方法和变量),即调用的必须有static。
  • 成员方法可以调用静态或成员变量(即非静态变量)。

例如:

MyStatic.staticStr中staticStr必须为静态变量。

而main函数中声明的实例变量可随意使用class中的静态或非静态变量。

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)
  • 成员方法在执行时才在栈中分配空间 。
  • 而类方法在编译时就已经在栈中分配空间,在执行时可直接调用。

    -

    软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

2.接口(Interface)

1.接口(interface)

  1. Interface和Class用来定义和实现ADT。
  2. 接口之间可以继承和扩展。(同样的方法可以有相同或不同的实现)
  3. 一个类可以实现多个接口。
  4. 一个接口可以有多种实现类。

例如:

一个复数的接口。它的方法为以下8条,均没有实现。

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

它的实现方法如下:

实现方法1:

使用复数的标准表示方法,即实部和虚部来表示。

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

实现方法2:

使用半径和弧度来表示复数。

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

客户端的应用:

可以注意到,除了实现方法和输入数据不同以外,不同的实现有着相同的方法和结果。

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

为什么要有不同的实现:

  1. 有不同的表现。(有快有慢)
  2. 有不同的行为。(在同一基础上可以增加不同的行为)

    例如:HashSet,TreeSet。

自从java8开始,接口中可以有静态方法

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

3.枚举(enumerations)

枚举的实现方法

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)
软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

向枚举中的例子中添加数据和方法。

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

4.封装和信息隐藏(Encapsulation and information hiding)

用接口隐藏信息

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

public,protected,default,private作用域.

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

private可以在不影响实用的情况下变为public,而public不能变为private。

5.继承和重写(Inheritance and Overriding)

1.Inheritance

严格继承: 子类只能添加新方法,无法重写父类中的方法。

使用关键字 extends 进行继承。

使用关键字 @Override 进行重写。

在父类中final的方法,在子类中无法重写。

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

当父类重写函数不为空时,对于大多数子类可直接复用,而某些子类有特殊性,需要重写。

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

当父类重写函数为空时,子类全部需要重写。

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

2Abstract Class(抽象类)

抽象类的特点:

  1. 只有定义没有实现。
  2. 抽象类不能实例化。
  3. 继承某个抽象类的子类在实例化时,所有父类中的抽象方法必须已经实现。(即子类必须补全父类中的抽象方法)

三者关系:

Abstract Class implements Interface(抽象类实现接口)

Concrete class extends Abstract Class(具体类继承抽象类)

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

抽象类的例子:通用方法在抽象类中实现,不通用的方法在子类中实现。

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

6.多态,子类型,重载(Polymorphism subtyping overloading)

1.Three Types of Polumorphism.(三种类型的多态)

  • 特殊多态(Ad hoc):一个方法可以有多个同名的实现。(方法重载)
  • 参数化多态(Parametric):一个类型名字可以代表多个类型。(泛型编程)
  • 子类型多态(Subtyping):一个变量名字可以代表多个类的实例。(子类型)

2.特殊多态(Ad hoc polymorphism and Overloading)

重载:多个方法有同样的名字。但有不同的参数列表或返回值类型。

  • 重载是在编译阶段时决定要具体执行哪个方法(static type checking)。
  • 而重写是在运行时进行动态检查(dynamic checking)。
  • 重写时父类和子类中的方法具有相同的签名。
  • 签名不同时则为重载
  • 子类重载了父类的方法后,子类仍然继承了被重载的方法。

重载的规则:

  1. MUST 必须有不同的参数列表
  2. CAN 相同/不同的返回值类型
  3. CAN 相同/不同的public/private/protected
  4. CAN 抛出不同的异常
  5. CAN 可以在一个类中重载,也可在子类中重载

重载的例子:

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

另一个重载的例子:证明了重载是在编译阶段进行的。进行的实例化,以前面定义的类为准。

定义Animal类,Horse类继承Animal类。

分别Animal animalobj=new Animal();

Horse horseobj=new Horse();

Animal animalRefToHorse= new Horse();

分别代入ua.doStuff观察使用了重载的哪一个方法。

我们注意到最后一个animalRefToHorse打印出来的是Animal。

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

另一个例子:

证明了重载是在编译时进行选择,重写是在运行时进行选择。

例如Animal ah=new Horse();ah.eat();编译时会进行判定,判定Animal类中是否有eat()方法,如果有才在运行时使用子类Horse()中的重写用法。如果父类中没有该方法,则直接会编译错误。

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

3.参数化多态(Parametric polymorphism and Generic programming)

Generics(泛型)

参数多态性是指方法针对多种类型时具有同样的行为,此时可使用统一的类型表达多种类型。

例子:

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

泛型接口可用非泛型或泛型的实现类。

1.非泛型的实现类

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

2.泛型的实现类

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

4.子类型多态(Subtyping Polymorphism)

子类型的规约不能弱化超类型的规约。

子类型多态:不同类型的对象可以统一的处理而无需区分。

10.一些对象的重要方法

  • equals()比较的是内容是否相等
  • hashCode()
  • toString() 打印内容

tostring的重载

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

hashcode的重载

软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)

继续阅读