阿里云【名师课堂】Java面向对象开发60 ~ 62:【第3.5个代码模型】综合案例:数组操作(定义Array父类)

阿里云【名师课堂】Java面向对象开发60 ~ 62:【第3.5个代码模型】综合案例:数组操作


现在要求定义一个整型数据数组操作类,有如下要求:

  • 该数组大小由类创建对象的时候动态决定;
  • 可以通过类向数组中进行数据的保存,保存时需要考虑空间问题;
  • 如果发现数组空间不足,则可以进行数组长度的动态扩充。
  • 可以取得数组的全部数据

而后在这一基础上,要求继续扩展两个派生类,功能要求:

  • 可以进行数组的排序处理;
  • 可以进行数组的反转处理。

60:定义Array父类

回顾:数组的声明、创建、初始化

  • 声明并开辟数组:
    • 数组类型 数组名称 [] = new 数据类型 [长度] ;
  • 分布进行数组空间开辟:
    • 声明数组:数组类型 数组名称 [] = null ;
    • 开辟数组空间(创建数组):数组名称 = new 数据类型 [长度] ;
  • 当数组采用动态初始化开辟空间之后,数组里的每一个元素都是该数组对应数据类型的默认值
    • 数组元素的赋值:数组名称 [索引号] = 数据 ;
    • 动态初始化有一个明显特点:数组先开辟内存空间,而后再使用索引进行内容的设置。
  • 而如果希望数组在定义的时候可以同时设置内容,可以使用静态初始化。语法有以下两种:
    • 简化格式:数据类型 数组名称 [] = {值,值,······} ;
    • 完整格式:数据类型 数组名称 [] = new 数据类型 [] {值,值,······} ;
class Array { // 定义一个专门进行数组操作的类
	private int[] data ; // 定义一个整型数组,大小由外部决定
	private int index = 0; // 进行数组角标控制
	
	// 如果想要使用Array类必须先调用这个构造方法设置数组大小
	public Array(int len) {
		if (len > 0){ // 数组大小必须为正
			this.data = new int[len]; // 创建(开辟)data数组,注意此时还没有初始化
		} else {
			this.data = new int[1] ;
		}
	}
	
	// 该方法的主要功能是向数组里保存数据
	public boolean add(int num){
		if (this.index >= this.data.length){ // 数组没空间了
			return false ;
		}
		this.data[this.index++] = num ;
		return true ;
	}
	// 动态扩展,传入多少则在已有基础上扩展多少
	public void expand(int num){ // 难点:怎么进行扩充
		int[] newData = new int[this.data.length + num] ;
		System.arraycopy(this.data,0,newData,0,this.data.length) ;
		// `System.arraycopy(原数组名称,原数组开始点,目标数组名称,目标数组开始点,拷贝长度) ;`
		this.data = newData ; // 改变原始数组指向
	}
	// 输出数组所有数据
	public int[] getData() {
		return this.data ;
	}
}

public class ArrayDemo {
	public static void main(String args[]) {
		Array arr = new Array(4) ;
		
		System.out.println(arr.add(1)) ; // 数组初始化,注意数组长度为4
		System.out.println(arr.add(6)) ;
		System.out.println(arr.add(9)) ;
		System.out.println(arr.add(3)) ;
		System.out.println(arr.add(10)) ; //这条超出长度了,会输出返回值:false
		arr.expand(3) ; // 长度扩充
		System.out.println(arr.add(10)) ; //扩充后不会超出长度,成功保存
		System.out.println(arr.add(16)) ;
		System.out.println(arr.add(17)) ;
		
		int[] result = arr.getData() ; // 取得初始化后数组的数据
		for (int i = 0; i < result.length; i++){
			System.out.print(result[i] + "、") ;
		}
	}
}

观察数组保存操作、数组扩充操作的内存分析图
在这里插入图片描述
在这里插入图片描述
至此,基本要求全部实现。
在这里插入图片描述

61:SortArray排序子类

按照扩展要求,取得数据时应该是排序好的。但是该方法还要具备:数据追加、数组扩充、取得全部数据功能(父类中的getData方法作为一个获取数据的标准,即这个方法应该继续保留)。
所以可以想到,这时应该用到继承操作。

class Array {······}

class SortArray extends Array {
	// 父类中没有定义无参构造,在这里子类必须明确调用父类中的构造:super
	public SortArray (int num) {
		super(num) ;
	}
	public int[] getData() { // 方法覆写,对getData进行功能扩充
		java.util.Arrays.sort(super.getData()) ;
		return super.getData() ;
	}
}

public class ArrayDemo {
	public static void main(String args[]) {
		SortArray arr = new SortArray(4) ;
		······
}

在这里插入图片描述

62:ReverseArray反转子类

和SortArray排序子类一样,反转子类ReverseArray按照要求输出是应该是反转的。

class Array {······}

class SortArray {······}

class ReverseArray extends Array {
	public ReverseArray(int len) { // 同SortArray,明确调用父类
		super(len) ;
	}
	public int[] getData() {
		int axis = super.getData().length / 2 ;
		int head = 0 ;
		int tail = super.getData().length - 1 ;
		for (int i = 0 ; i < axis ; i++){
			int temp = super.getData()[tail - i] ;
			super.getData()[tail - i] = super.getData()[head + i] ;
			super.getData()[head + i] = temp ;
		}
		return super.getData() ;
	}
}

public class ArrayDemo {
	public static void main(String args[]) {
		ReverseArray arr = new ReverseArray(4) ;
		······
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值