这两天在学习java泛型(博主参考的是疯狂java讲义,真的是一本不错的java学习参考书哦)的时候无意中看到一个栈内存溢出的例子,先将自己的学习笔记写下来,希望刚入门的朋友能有所收货,高手请主动跳过。
class StrList
{
private List strList = new ArrayList();
public boolean add(String ele)
{
return strList.add(ele);//1:return add(ele);
}
// 重写get方法,将get方法的返回值类型改为String类型
public String get(int index)
{
return (String)strList.get(index);//2:return get(index);
}
public int size()
{
return strList.size();//3:return size();
}
}
public class CheckType
{
public static void main(String[] args)
{
// 创建一个只想保存字符串的List集合
StrList strList = new StrList();
strList.add("疯狂Java讲义");
strList.add("疯狂Android讲义");
strList.add("轻量级Java EE企业应用实战");
// 下面语句不能把Integer对象“丢进”集合中,将引起编译错误
//strList.add(5); // ①
System.out.println(strList);
for (int i = 0; i < strList.size() ; i++ )
{
// 因为StrList里元素的类型就是String类型,
// 所以无须强制类型转换
String str = strList.get(i);
}
}
}
可以发现,当改成代码中1,2,3处的任意一处的语句的时候,编译不会出错,但是运行时会提示 Exception in thread "main" java.lang.StackOverflowError说明发生了栈内存溢出问题。通过自己查阅资料跟经验发现,不加strList以限制内存大小当然会导致内存溢出,这个问题想必大部分编程爱好者都能理解,博主在这有点多此一举了 ,既然到了河边哪有不湿鞋,那就再来一波毒奶:这些代码其实本意是想判断 ①处的类型是否在编译的时候能检查出来,这样做当然是可以的,但是代码太过庞大,所以如果改成泛型就更好了,更多资料可以参考李阳的疯狂Java讲义哦!