一、宠物店管理系统的一个优化思路
1.题目
老张在宠物店管理系统中写了一大堆Cat啊、Dog啊这样的宠物类,发现在这些类中有些信息使用的次数很少,甚至是一些字段很多情况下只能有一部分被使用,比如Cat的特征字段feature,有些时候需要用字符串类型,有些时候需要使用数值类型,于是定义了一堆strFeature,intFeature这样的东西,老张看到Java泛型的使用方法后心里琢磨了起来,如果使用泛型能不能简化Cat这样的类的结构呢?于是老张写出了测试程序:
public static void main(String[] args) {
Cat<String> cat = new Cat<>();
cat.setFeature("肥胖");
System.out.println(cat.desc());
Cat<Integer> cat2 = new Cat<>();
cat2.setFeature(13);
System.out.println(cat2.desc());
Cat<Double> cat3 = new Cat<>();
cat3.setFeature(12.1);
System.out.println(cat3.desc());
}
期望的输出为:
此猫猫是一只可爱的肥胖猫咪 | |
此猫猫是一只体重为13的猫猫 | |
此猫猫特征不明,有人认为它的特征为12.1 |
你能帮老张完成这个Cat类吗?
老张还想让所有的宠物都有生育方法,比如猫应该有方法Cat birth()来生一只小猫,狗能使用Dog birth()方法生一只小狗,能不能定义一个接口来完成这个事情,让实现这个接口的类都有适当的birth方法呢?
2.题解
题目要求用泛型实现不同类型的特征,可以定义为
public class Cat<T>{
private T feature;
public T getFeature() {
return feature;
}
public void setFeature(T feature) {
this.feature = feature;
}
}
其次是实现不同特征类型的输出这里可以用instanceof
instanceof//它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型
可以通过一个方法desc()来判断T的类型并实现相应的效果
//判断T的类型
public String desc() {
if (feature instanceof String) {
return "此猫猫是一只体重为" + feature + "的猫猫";
} else if (feature instanceof Integer) {
return "此猫猫特征不明,有人认为它的特征为" + feature;
} else {
return "此猫猫是一只可爱的" + feature + "猫咪";
}
}
实现birth()方法就可以创建一个抽象Birth类里面有一个抽象birth()方法
public abstract interface Birth{
public void birth();
}
同时让Cat类实现这个接口并添加一个birth()方法
public class Cat<T> implements Birth
@Override
public void birth() {
System.out.println("生了一只小猫");
}
2.雄心万丈的老张
1.题目
在开发过程中的顺风顺水让老张自我膨胀了起来,一天老张忽然觉得自己的团队成员应该有能力封装java的任何一个成熟类型,于是找到团队里的你,让你试着做一个团队自己的泛型类ArrayList,主要实现以下几个功能:
1. 必须是泛型类,能装下任何指定类型的数据
2. 必须可以进行空间扩展,空间不足的时候可以通过翻倍内部数据空间的方法得到更多的空间容纳新数据
3. 可以添加数据
4. 可以删除数据
5. 可以取指定位置的数据
6. 可以获得空间中有效数据的个数
7. 可以使用for枚举空间中所有数据
你能帮老张做到吗?、
2.题解
public class ArrayList<T> {
private T[] list;//T类型的数组
private int size;//模拟指针,始终指向链表的尾
private int capacity;//数组的大小,为实现动态数组
//初始化一个数组
public ArrayList() {
capacity = 10;
size = 0;
list = (T[]) new Object[capacity];
}
//添加
public void add(T value) {
//判段是否需要扩展数组
if (size >= capacity) {
expand();
}
list[size] = value;
}
//扩充
private void expand() {
capacity *= 2;
T[] newList = (T[]) new Object[capacity];//new一个数组大小为原数组的二倍
//原数组复制到新数组
for (int i = 0; i < size; i++) {
newList[i] = list[i];
}
list = newList;//新数组覆盖原数组
}
//删除第index个数
public void remove(int index){
for(int i = index;i <= size ;i ++){
list[i] = list[i + 1]; //index后整个数组向前移1位
}
size --;
}
//获取list第index个值(从1开始)
public T get(int index) {
return list[index - 1];
}
//获取空间中有效数据的个数
public int size() {
return size;
}
//for枚举空间中所有数据
public void display() {
for (int i = 0; i < size; i++) {
System.out.println(list[i]);
}
}
}
比较难理解的是删除操作
注:偷偷改错了几点