检查 Java 中的最佳实践,我们发现避免继承是一个很好的做法。原因之一可能在以下问题中得到说明:
这里我们有一个子类“Stack”扩展了“ArrayList”
class Stack extends ArrayList
{ private int stack_pointer = 0;
public void push( Object article )
{ add( stack_pointer++, article );
}
public Object pop()
{ return remove( --stack_pointer );
}
public void push_many( Object[] articles )
{ for( int i = 0; i < articles.length; ++i )
push( articles[i] );
}
}
假设我们要使用push()
前面代码中定义的方法添加到堆栈中,然后我们要使用clear()
基类 - 即 ArrayList-来清除堆栈
Stack a_stack = new Stack();
a_stack.push("1");
a_stack.push("2");
a_stack.clear();
- 这里的问题是
代码成功编译,但由于基类不知道堆栈指针的任何信息,因此 Stack 对象现在处于未定义状态。对 push() 的下一次调用将新项目放在索引 2 处(stack_pointer 的当前值),因此堆栈实际上包含三个元素 - 底部的两个是垃圾。
所以我的问题是,为什么
基类对堆栈指针一无所知
换句话说,堆栈指针的状态在哪里被保留?
来源:为什么扩展是邪恶的