概览
使用抽象数据类型主要经过以下几个步骤
* 创建对象(创造抽象数据的标识)
* 通过对象调用对应的实例方法(操作对象中的值,改变对象状态等)
* 我们还可以像使用原始数据一样来使用抽象数据类型
另外还有一些概念:
* 关于抽象数据类型的API
* 对象的一些概念以及特征
抽象数据类型的API
所谓的API,其实就是应用程序编程接口。它将列出所有构造函数以及实例方法,并简述它们的作用
这是上一节的例子(计数器):
public class Count {
private String name; //这个计数器的名字
private int counter; //记录这个计数器使用的次数
//这是构造函数,构造此计数器的名字
public Count(String name) {
this.name = name;
}
//该操作将计数器增加1
public void increment() {
this.counter++;
}
//该操作将返回计数器使用的次数
public int tally() {
return this.counter;
}
//该操作返回计数器名字
public String toString() {
return this.name;
}
}
然后我们将以API的形式来对这个抽象数据类型进行概括:
对象一些概念
- 定义: 对象是能够承载数据类型的值的实体
- 特征:状态; 标识; 行为
状态即数据类型中的值; 标识可以认为是对象在内存中的位置, 使其能够区别于另一个对象; 行为就是对数据的操作
创建对象
我们可以通过关键字“new”来创建对象。
以Count类为例,创建Count类的两个实例对象如下
Count heads = new Count("heads");
Count tails = new Count("tails");
每次调用new关键字,系统所要执行的步骤如下:
- 为对象分配新的内存空间。
- 调用构造函数初始化对象中的值。
- 返回该对象的一个引用。
调用对象实例方法
方法每一次触发都跟对象有关(静态方法除外),因此可以通过如下的方式来调用实例方法:
heads.increment();
其中括号中如有需要参数,则可以传入相对应的值。
使用对象
可以像使用原始数据类型一样使用对象。
- 在赋值语句中使用对象
- 可以向方法中传入对象或者返回。
- 创建并使用对象的数组
下面是一个使用对象的例子(使用了上面所提到的“计数器”的抽象数据),模拟抛硬币情形:
import java.util.Scanner;
import edu.princeton.cs.algs4.StdRandom;
public class Test {
static Scanner in = new Scanner(System.in);
public static void main(String args[]) {
System.out.println("请输入总共要投掷硬币的次数:");
int t = in.nextInt();
Count heads = new Count("heads");
Count tials = new Count("tials");
for(int i = 0; i < t; i++)
if(StdRandom.bernoulli(0.5))
heads.increment();
else
tials.increment();
System.out.println(heads.toString() + " " + heads.tally());
System.out.println(tials.toString() + " " + tials.tally());
int d = heads.tally() - tials.tally();
System.out.println("delta: " + Math.abs(d));
}
}
运行结果: