0.主题
今天的主题有以下内容
- 初识面向对象
- 顺序表
通过构建一个SequentialList类来熟悉以上知识点。
1.面向对象程序设计(OOP)
面向对象程序设计(Object-oriented programming)是一种主流的程序设计范型,它 将数据放在第
1
1
1位, 然后再考虑操作数据的方法,非常适用
于解决规模较大的问题。
- 类
类(class)是构造对象的模板,通常类中有实例域,构造器和方法三个部分。其中构造器是一种特殊的方法,用于构造并初始化对象。
举个例子,笔就是一个类。笔有各种属性,每个具体的笔的这些属性可能不同,比如笔的颜色、笔的种类等,这就是它的实例域。然后所有笔有一些共同的用途,比如写字,这就是它的方法。
我们在使用"笔"这个类的时候,可以经过以下步骤:
- 构造对象:即构造一支具体的笔出来,凭借构造器,我们可以实现这一步,同时还可以设定某些具体的属性。比如构造一支红色的钢笔,将它保存在一个名为redPen的对象变量中。
- 使用方法:例如笔有一个write()方法,我们就可以调用redPen.write()来用这只笔写字了。
面向对象程序设计就是将数据和数据的操作封装在了一起,先有了数据,再对数据进行操作。
- 对象
对象有三个主要的特性:
- 行为:即可以对对象施加哪些操作
- 状态:即施加方法时,对象如何响应
- 标识:即如何辨别具有相同行为与状态的不同对象
仍然以笔为例,要运用这个对象,我们就要知道笔能够有哪些操作?当我们对笔调用写这一方法时,它应该给出什么样的反馈?我们构造了两支笔,他们都有同样的写操作,那么应该怎样区分它们?
这些问题在程序设计的过程中都应该要考虑清楚。
2.顺序表
- 概念
顾名思义,顺序表就是采用顺序存储的表结构 - 实现
顺序表中,元素在内存中的存放位置是连续的,因此,只要知道了第一个元素的存储位置、每个元素所占内存的大小、元素的个数( 即顺序表表长 )就可以存储一个顺序表。
- 实例域
由上文的叙述可以得知一个顺序表应该有的属性。一个给定类型的数组可以包含单个元素所占内存大小,第一个元素的存储位置这两个信息。一个整型变量可以存储元素个数信息。因此,顺序表就有一个整型变量和一个数组实例域。 - 构造器
构造器用于生成并初始化对象,一个类中可以有多个构造器。对于此处的顺序表我们给出了两种构造器,第一种构造器生成一个空表,第二个构造器接收一个数组参数,根据这个参数生成对应的顺序表。 - 方法
表结构可以有很多操作,比如查找、插入、删除等等。今天主要设计toString方法和reset方法,前者用于将顺序表转换为对应的字符串形式,后者将顺序表重置为空表。
3.程序
程序代码如下:
package datastructure.list;
public class SequentialList {
/**
* The maximal length of the list. It is a constant.
*/
public static final int MAX_LENGTH = 10;
/**
* The real length of the list.
*/
int length;
/**
* The data stored in an array.
*/
int[ ] data;
/**
*****************
* Construct an empty sequential list.
*****************
*/
public SequentialList( ) {
length = 0;
data = new int[ MAX_LENGTH ];
} // Of the first constructor
/**
*****************
* Construct a sequential list using an array.
*
* @param paraArray The given array. Its length should not exceed MAX_LENGTH. For simplicity now we do not check it.
*****************
*/
public SequentialList( int[ ] paraArray ) {
length = paraArray.length;
data = new int[ MAX_LENGTH ];
// Copy data.
for( int i = 0; i < length; i++ ) {
data[ i ] = paraArray[ i ];
} // Of for i
} // Of the second constructor
/**
*****************
* Overrides the method claimed in Object, the superclass of any class.
*****************
*/
public String toString( ) {
if( length == 0 ) {
return "empty";
} // Of if
String resultString = "";
for( int i = 0; i < length - 1; i++ ) {
resultString += data[ i ] + ", ";
} // Of for i
resultString += data[ length - 1 ];
return resultString;
} // Of toString
/**
*****************
* Reset to empty.
*****************
*/
public void reset( ) {
length = 0;
} // Of reset
/**
*****************
* The entrance of the program.
*
* @param args Not used now.
*****************
*/
public static void main( String args[ ] ) {
int[ ] tempArray = { 1, 4, 6, 9 };
SequentialList tempFirstList = new SequentialList( tempArray );
System.out.println("Initialized, the list is: " + tempFirstList.toString( ) );
System.out.println("Again, the list is: " + tempFirstList);
tempFirstList.reset( );
System.out.println("After reset, the list is: " + tempFirstList);
} // Of main
} // Of class SequentialList
执行结果如下:
4.其他
- 程序中设置了一个MAX_LENGTH,用于标记能构造的最大顺序表表长,但为了简化程序,构造器中没有检查它
- 将实例域定义为final,则要确保构造器执行后,这个域被设置一个值。通常final 修饰符用于基本类型域,或不可变类的域。
- 在 println 里面使用 tempFirstList 里, 由于是用另一个字符串与其相加, 系统会自动调用 tempFirstList.toString()。