Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)
3.4Object-Oriented Programming(OOP)面向对象的编程
1.object,class,attribute,method的基本概念
1.object
object为现实中的物体,有状态和行为两种特点。
例如:
- 狗的状态有姓名,颜色,饥饿度。
- 狗的行为有叫,摇尾巴,捡东西。
-自行车的状态有车轮子,车蹬子,速度。
-自行车的行为有换轮子,换车蹬子,踩刹车。
Java中将状态称为属性(fields),将行为称为方法(methods)。
2.classes
类定义了属性(fields)和方法(methods)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL5kjN2QjMxUTM5IDNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
Customer为类的名字,下面是属性和方法。
类方法(class methods)和实例方法(instance methods)的区别.
- display()即为类方法,需在前面加static,可直接用类调用。
- show()为实例方法,需要新建一个实例对象,在实例对象中调用。
注意:
- 静态方法无法调用非静态成员(方法和变量),即调用的必须有static。
- 成员方法可以调用静态或成员变量(即非静态变量)。
例如:
MyStatic.staticStr中staticStr必须为静态变量。
而main函数中声明的实例变量可随意使用class中的静态或非静态变量。
- 成员方法在执行时才在栈中分配空间 。
-
而类方法在编译时就已经在栈中分配空间,在执行时可直接调用。
-
软件构造3.4面向对象的编程笔记Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)
2.接口(Interface)
1.接口(interface)
- Interface和Class用来定义和实现ADT。
- 接口之间可以继承和扩展。(同样的方法可以有相同或不同的实现)
- 一个类可以实现多个接口。
- 一个接口可以有多种实现类。
例如:
一个复数的接口。它的方法为以下8条,均没有实现。
它的实现方法如下:
实现方法1:
使用复数的标准表示方法,即实部和虚部来表示。
实现方法2:
使用半径和弧度来表示复数。
客户端的应用:
可以注意到,除了实现方法和输入数据不同以外,不同的实现有着相同的方法和结果。
为什么要有不同的实现:
- 有不同的表现。(有快有慢)
-
有不同的行为。(在同一基础上可以增加不同的行为)
例如:HashSet,TreeSet。
自从java8开始,接口中可以有静态方法
3.枚举(enumerations)
枚举的实现方法
向枚举中的例子中添加数据和方法。
4.封装和信息隐藏(Encapsulation and information hiding)
用接口隐藏信息
- 使用接口类型声明变量。
- 客户端仅使用接口中定义的方法。
- 客户端代码无法直接访问属性。
public,protected,default,private作用域.
private可以在不影响实用的情况下变为public,而public不能变为private。
5.继承和重写(Inheritance and Overriding)
1.Inheritance
严格继承: 子类只能添加新方法,无法重写父类中的方法。
使用关键字 extends 进行继承。
使用关键字 @Override 进行重写。
在父类中final的方法,在子类中无法重写。
当父类重写函数不为空时,对于大多数子类可直接复用,而某些子类有特殊性,需要重写。
当父类重写函数为空时,子类全部需要重写。
2Abstract Class(抽象类)
抽象类的特点:
- 只有定义没有实现。
- 抽象类不能实例化。
- 继承某个抽象类的子类在实例化时,所有父类中的抽象方法必须已经实现。(即子类必须补全父类中的抽象方法)
三者关系:
Abstract Class implements Interface(抽象类实现接口)
Concrete class extends Abstract Class(具体类继承抽象类)
抽象类的例子:通用方法在抽象类中实现,不通用的方法在子类中实现。
6.多态,子类型,重载(Polymorphism subtyping overloading)
1.Three Types of Polumorphism.(三种类型的多态)
- 特殊多态(Ad hoc):一个方法可以有多个同名的实现。(方法重载)
- 参数化多态(Parametric):一个类型名字可以代表多个类型。(泛型编程)
- 子类型多态(Subtyping):一个变量名字可以代表多个类的实例。(子类型)
2.特殊多态(Ad hoc polymorphism and Overloading)
重载:多个方法有同样的名字。但有不同的参数列表或返回值类型。
- 重载是在编译阶段时决定要具体执行哪个方法(static type checking)。
- 而重写是在运行时进行动态检查(dynamic checking)。
- 重写时父类和子类中的方法具有相同的签名。
- 签名不同时则为重载
- 子类重载了父类的方法后,子类仍然继承了被重载的方法。
重载的规则:
- MUST 必须有不同的参数列表
- CAN 相同/不同的返回值类型
- CAN 相同/不同的public/private/protected
- CAN 抛出不同的异常
- CAN 可以在一个类中重载,也可在子类中重载
重载的例子:
另一个重载的例子:证明了重载是在编译阶段进行的。进行的实例化,以前面定义的类为准。
定义Animal类,Horse类继承Animal类。
分别Animal animalobj=new Animal();
Horse horseobj=new Horse();
Animal animalRefToHorse= new Horse();
分别代入ua.doStuff观察使用了重载的哪一个方法。
我们注意到最后一个animalRefToHorse打印出来的是Animal。
另一个例子:
证明了重载是在编译时进行选择,重写是在运行时进行选择。
例如Animal ah=new Horse();ah.eat();编译时会进行判定,判定Animal类中是否有eat()方法,如果有才在运行时使用子类Horse()中的重写用法。如果父类中没有该方法,则直接会编译错误。
3.参数化多态(Parametric polymorphism and Generic programming)
Generics(泛型)
参数多态性是指方法针对多种类型时具有同样的行为,此时可使用统一的类型表达多种类型。
例子:
泛型接口可用非泛型或泛型的实现类。
1.非泛型的实现类
2.泛型的实现类
4.子类型多态(Subtyping Polymorphism)
子类型的规约不能弱化超类型的规约。
子类型多态:不同类型的对象可以统一的处理而无需区分。
10.一些对象的重要方法
- equals()比较的是内容是否相等
- hashCode()
- toString() 打印内容
tostring的重载
hashcode的重载