//栈遵循后进先出
public class Stack{
//使用数组存储数据
//栈可以存储多个引用类型元素
//创建Object类型数组意味栈可以储存java语言中所有引用数据类型
Object[] elements;
//指向栈顶元素上方的一个帧
int index; //默认值是null 在Stack中还没元素的时候就有一个帧指向stack.
//规定栈默认的初始化容量是5
//Constructor
Stack(){
this(5);
//elements = new Object[5];这样写是this(5);的另一种写法
}
Stack(int max){
elements = new Object[max]; //动态初始化 把max传进Object[max]里面
}
//栈应对外提供一个压栈的方法 压栈返回值是空
public void push(Object element){ //因为它是Object类型数组只能往里面压object element
/*
elements[index] = elements; //给栈中元素赋值
index++
*/
//上面代码的连写 index++在后面意味着先赋值后加1 先是默认值0后加1
elements[index++] = elements;
}
//栈应对外提供一个弹栈的方法 弹栈最终要弹出一个元素 类型是Object类型所以返回值是Object类型
public Object pop(){ //pop方法没参数因为弹的时候一定是栈顶的元素往外弹
/*
index--; //方法栈帧自减1 帧在最上的元素还上一位,弹出一个数组就要减一位
return elements[index];
*/
return elements[--index]; // 先自减1 index=4 index等于4这个位置没元素 减自减1 变成return elements[3]
}
}
public class Test{
public static void main(String[] args){
Stack s = new Stack(); //初始化容量为5
User u1 = new User("Jack",20);
User u2 = new User("SMITH",21);
User u3 = new User("FORD",22);
User u4 = new User("JAMES",24);
User u5 = new User("CURRY",26);
//压栈
s.push(u1);
s.push(u2);
s.push(u3);
s.push(u4);
s.push(u5);
//弹栈 每弹一次s.pop()弹出一个Object 相当于System.out.println(Object);
//程序会调toString 下面已经将toString重写了
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.pop());
}
}class User{
String name;
int age;
User(String name,int age){
this.name = name;
this.age = age;
}
//重写toString方法
public String toString(){
return "User[name="+name+",age="+age+"]";
}
}输出结果为什么是
[Ljava.lang.Object;@15db9742
[Ljava.lang.Object;@15db9742
[Ljava.lang.Object;@15db9742
[Ljava.lang.Object;@15db9742
[Ljava.lang.Object;@15db9742我已经重写toString方法了
Object[]
才是[Ljava.lang.Object;
Object
是java.lang.Object;