Generics 通用型 a stack class
写这篇目的:因为是一个Stack,用来放东西的
1》想了解放的东西:计算机是如何保存着些数据的。
2》保存时间的长短:即一个对象的生命周期
3》保存的数据和包含它的类之间的关系。
1、我们自己写一个 stack :先进后出,像往货车上放(取)东西一样。
一、对象是一辆车:LinkedStack<T> ,编译后LinkedStack.class
1>放东西 push 方法
2>取东西 pop 方法
3>放的内容:<T>,表示通用,什么都可以放。
4>LinkedStack:表示一辆货车。
二、 对象是车上货物(用内部类Node<T> )T:可以随便按需要定义。 编译后LinkedStack$Node.class
正在(取,放)货物时的位置和货物:
1>下一个货物位置:next
2>上一个货物位置:top;
3>当前正在取(放)的货物:item;
4>东西(取,放)完的标志:end 方法
三、开始放东西
1、比如全部是衣服,这就是具体货物,但是我们的LinkedStack放的字符串。
LinkedStack<String> lss = new LinkedStack<String>();
准备放东西了,应该设置放东西的上一个货物位置,即全部空值。
这一步需要启动内部类:private Node<T> top = new Node<T>(); // End sentinel
2、开始放
for (String s : "phasers on stun!".split(" ")) //表示按空格分开的数组。
lss.push(s); //开始放东西
1》首先应该定义
四、看看对象保存图
the object pool
五、看看常量池javap -c -verbose LinkedStack.class,
类成员 topchushi:这是一个实例变量(即需要和一个对象连接),默认方法
Instance initialization (<init) methods may only use flags ACC_PUBLIC, ACC_PRIVATE, and ACC_PROTECTED.
private Node<T> top = new Node<T>(); 默认<init>":()V 如下:
Constant pool: #1 = Class #2 // generics/LinkedStack #2 = Utf8 generics/LinkedStack #3 = Class #4 // java/lang/Object #4 = Utf8 java/lang/Object #5 = Utf8 top #6 = Utf8 Lgenerics/LinkedStack$Node; #7 = Utf8 Signature #8 = Utf8 Lgenerics/LinkedStack$Node<TT;>; #9 = Utf8 <init> #10 = Utf8 ()V #11 = Utf8 Code #12 = Methodref #3.#13 // java/lang/Object."<init>":()V #13 = NameAndType #9:#10 // "<init>":()V #14 = Class #15 // generics/LinkedStack$Node #15 = Utf8 generics/LinkedStack$Node #16 = Methodref #14.#13 // generics/LinkedStack$Node."<init>":()V #17 = Fieldref #1.#18 // generics/LinkedStack.top:Lgenerics/LinkedStack$Node; #18 = NameAndType #5:#6 // top:Lgenerics/ public generics.LinkedStack(); descriptor: ()V flags: ACC_PUBLIC Code: stack=3, locals=1, args_size=1 0: aload_0 1: invokespecial #12 // Method java/lang/Object."<init>":()V 4: aload_0 5: new #14 // class generics/LinkedStack$Node 8: dup 9: invokespecial #16 // Method generics/LinkedStack$Node."<init>":()V 12: putfield #17 // Field top:Lgenerics/LinkedStack$Node; 15: return LineNumberTable: line 3: 0 line 23: 4 line 3: 15 LocalVariableTable: Start Length Slot Name Signature 0 16 0 this Lgenerics/LinkedStack; LocalVariableTypeTable: Start Length Slot Name Signature 0 16 0 this Lgenerics/LinkedStack<TT;>; public void push(T); descriptor: (Ljava/lang/Object;)V flags: ACC_PUBLIC Signature: #27 // (TT;)V Code: stack=5, locals=2, args_size=2 0: aload_0 1: new #14 // class generics/LinkedStack$Node 4: dup 5: aload_1 6: aload_0 7: getfield #17 // Field top:Lgenerics/LinkedStack$Node; 10: invokespecial #28 // Method generics/LinkedStack$Node."<init>"(Ljava/lang/Object;Lgenerics/LinkedStack$Node;)V 13: putfield #17 // Field top:Lgenerics/LinkedStack$Node; 16: return LineNumberTable: line 26: 0 line 27: 16 LocalVariableTable: Start Length Slot Name Signature 0 17 0 this Lgenerics/LinkedStack; 0 17 1 item Ljava/lang/Object; LocalVariableTypeTable: Start Length Slot Name Signature 0 17 0 this Lgenerics/LinkedStack<TT;>; 0 17 1 item TT; |
package generics;
public class LinkedStack<T> {
private static class Node<T> {
T item;
Node<T> next;
Node() {
item = null;
next = null;
}
Node(T item, Node<T> next) {
this.item = item;
this.next = next;
}
boolean end() {
return item == null && next == null;
}
}
private Node<T> top = new Node<T>(); // End sentinel
public void push(T item) {
top = new Node<T>(item, top);
}
public T pop() {
T result = top.item;
if (!top.end())
top = top.next;
return result;
}
public static void main(String[] args) {
LinkedStack<String> lss = new LinkedStack<String>();
for (String s : "phasers on stun!".split(" "))
lss.push(s);
String s;
while ((s = lss.pop()) != null)
System.out.println(s);
}
}