阿里云【名师课堂】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) ;
······
}
目前还是不适应博客园的界面,等学成了再回归吧,对我来说当下还是csdn比较方便快捷:https://blog.csdn.net/weixin_43624945