日撸 Java 三百行: DAY11 顺序表1

0.主题

今天的主题有以下内容

  • 初识面向对象
  • 顺序表

通过构建一个SequentialList类来熟悉以上知识点。

1.面向对象程序设计(OOP)

面向对象程序设计(Object-oriented programming)是一种主流的程序设计范型,它 将数据放在第 1 1 1位, 然后再考虑操作数据的方法,非常适用
于解决规模较大的问题。


  • 类(class)是构造对象的模板,通常类中有实例域构造器方法三个部分。其中构造器是一种特殊的方法,用于构造并初始化对象。
    举个例子,就是一个类。笔有各种属性,每个具体的笔的这些属性可能不同,比如笔的颜色、笔的种类等,这就是它的实例域。然后所有笔有一些共同的用途,比如写字,这就是它的方法。
    我们在使用"笔"这个类的时候,可以经过以下步骤:
  1. 构造对象:即构造一支具体的笔出来,凭借构造器,我们可以实现这一步,同时还可以设定某些具体的属性。比如构造一支红色的钢笔,将它保存在一个名为redPen的对象变量中。
  2. 使用方法:例如笔有一个write()方法,我们就可以调用redPen.write()来用这只笔写字了。
    面向对象程序设计就是将数据数据的操作封装在了一起,先有了数据,再对数据进行操作。
  • 对象
    对象有三个主要的特性:
  1. 行为:即可以对对象施加哪些操作
  2. 状态:即施加方法时,对象如何响应
  3. 标识:即如何辨别具有相同行为与状态的不同对象
    仍然以笔为例,要运用这个对象,我们就要知道笔能够有哪些操作?当我们对笔调用写这一方法时,它应该给出什么样的反馈?我们构造了两支笔,他们都有同样的写操作,那么应该怎样区分它们?
    这些问题在程序设计的过程中都应该要考虑清楚。

2.顺序表

  • 概念
    顾名思义,顺序表就是采用顺序存储的表结构
  • 实现
    顺序表中,元素在内存中的存放位置是连续的,因此,只要知道了第一个元素的存储位置、每个元素所占内存的大小、元素的个数( 即顺序表表长 )就可以存储一个顺序表。
  1. 实例域
    由上文的叙述可以得知一个顺序表应该有的属性。一个给定类型的数组可以包含单个元素所占内存大小,第一个元素的存储位置这两个信息。一个整型变量可以存储元素个数信息。因此,顺序表就有一个整型变量和一个数组实例域。
  2. 构造器
    构造器用于生成并初始化对象,一个类中可以有多个构造器。对于此处的顺序表我们给出了两种构造器,第一种构造器生成一个空表,第二个构造器接收一个数组参数,根据这个参数生成对应的顺序表。
  3. 方法
    表结构可以有很多操作,比如查找、插入、删除等等。今天主要设计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.其他

  1. 程序中设置了一个MAX_LENGTH,用于标记能构造的最大顺序表表长,但为了简化程序,构造器中没有检查它
  2. 将实例域定义为final,则要确保构造器执行后,这个域被设置一个值。通常final 修饰符用于基本类型域,或不可变类的域。
  3. 在 println 里面使用 tempFirstList 里, 由于是用另一个字符串与其相加, 系统会自动调用 tempFirstList.toString()。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值