封装ArrayBox
描述
数组长度固定,并且不能进行新增,删除
为了对加深对数组与集合的理解,自己用数组封装了一个ArrayBox工具类,一个ArrayList的简单版
public class ArrayBox {
// 属性 长度一旦确定不能被修改
public int[] data = new int[10];
public int size = 0;
// 新增一个添加方法 可以给自己的数组新增值
public boolean add(int element){
//在添加之前,需要确保自己的数组有空间,容量
this.makeSureLength(size + 1);
// 吧数据存入数组中,有效值加一个
data[size++] = element;
return true;
}
// 获取某个元素
public int get(int index){
if(index < 0 || index >= size){
throw new RuntimeException();
}
return data[index];
}
public int remove(int index){
if(index < 0 || index >= size){
throw new RuntimeException();
}
int oldValue = data[index];
// 从index 开始,到size -1 为止,将后面元素依次前移
for(int i = index, i< size -1 ;i++){
data[i] = data[i+1];
}
data[--size] = 0;
return oldValue;
}
// 设计一个方法,确保自己的数组有空间,容量
public void makeSureLength(int min){
if(min > data.length){
// 说明方法需要的空间比数组的数组还大。说明容量不够用
// 则需要扩容
this.graw(min);
}
}
// 对容量不够的进行扩容
public void graw(int min){
// 获取旧的数组的容量
int oldLength = data.length;
// 吧旧的长度右位移动1位 = 长度 除以 2的1次方
// 右位移 除 左位移 乘
int newLength = oldLength + (oldLength >> 1)
// 如果计算的容量还不够,则直接用给的最小的容量
if(newLength - min < 0 ){
newLength = min;
}
data = this.copyOf(data, newLength);
}
// 吧旧数组全部移入到新数组里面
public int[] copyOf(int[] oldArray, int newLength){
int[] newArray = new int[newLength];
for(int i = 0;i<oldArray.length;i++){
newArray[i] = oldArray[i];
}
return newArray;
}
}
多态
简介
多态是同一个行为具有多个不同表现形式或形态的能力
多态就是同一个接口,使用不同的实例而执行不同操作
在不同的场景不同的应用,实际上是同一个方法
优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象
使用总结
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
类与类之间的关系
一、类与类之间的关系
类与类之间的关系
是一种继承关系,比如儿子类和人类,儿子继承人类,子类如何特化父类的所有特征和行为
Class Person {}
Class Son extends Person {}
类与接口的关系
类与接口的关系,类是接口所有特征和行为的实现
interface A {}
class B implement A {}
类与类之间的关联
是一种拥有(has)的关系,一个类的成员变量是另一个类的实例对象,可以双向的也可以是单向
-
聚合关系: 整体与部分的关系,表示聚合在一起,部分可以离开整体而单独存在,车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。
聚合关系是关联关系的一种,是强的关联关系,关联和聚合在语法一样,须考察具体的逻辑关系。 -
组合关系: 是整体与部分的关系,但部分不能离开整体而单独存,比如人的肺和人体,肺不能离开人单独存在,有人肺在人体才能存活
组合关系是关联关系的一种,是比聚合关系还要强的关系
箭头指向:带实心菱形的实线,菱形指向整体
聚合关系是关联关系的一种,是强的关联关系,关联和聚合在语法一样,须考察具体的逻辑关系。
class B {}
class A {
private B b;
类与类之间的依赖
是一种使用(use)的关系,即一个类的实现需要另一个类的协 助,一般不使用双向的互相依赖
二、依赖和关联之间的区别
关联是“HAS”关系,依赖是“USE”关系
A类关联B类,指的是B类对象作为A类的属性存在,称为“has”关系。
A类依赖B类,指的是B的对象作为A类的方法形式参数存在,称为“use”关系。一般也包括函数参数、局部变量、返回值类型和静态方法调用这四种场景。
生命周期不同
如果A类关联B类,那么创建A类的对象时实例化B类的对象,直到A类对象被销毁,所关联的B类对象也被销毁。即只要A类对象存在,B类对象就存在。
如果A类依赖B类,那么只有当A类对象调用到相应方法时,B类对象才被临时创建,方法执行结束,B类对象即被回收,A类和B类之间的依赖关系是一种瞬时的关系。
三、关联和组合和聚合之间的关系
组合和聚合都是关联关系的一种,只不够 组合 > 聚合 > 关联
四、各种关系的强弱顺序
依赖 < 关联 < 聚合 < 组合 < 实现 = 泛化(继承)