在Java编程思想的7.8.4节中,对于final的忠告作者写到,Stack继承自Vector,就是说Stack是个Vector,这从逻辑的观点看是不正确的,请问大家这句话怎么理解呢?

解决方案 »

  1.   

    为啥从逻辑观点上看不正确?源码就是:
    public class Stack<E> extends Vector<E> {
    人类继承自灵长类,就是说:人类是灵长类。
      

  2.   

    哦,估计是说从实际上的语义上觉得很奇怪吧:“Stack extends Vector”从语义上意味着:堆栈是个向量 或者 堆栈属于向量。其实从现实生活中,并不会认为堆栈是从向量衍伸而来的,所以这种继承关系会让人从语义上觉得奇怪。有点像是:某人为了贪图方便,定义猴子的时候,直接从人类继承过来了;结果语义变成了 猴子属于人类。
      

  3.   

    有种继承叫 实现上的继承
    有种继承叫 类型继承比如在java.util.Date与java.sql.Timestamp之间,java.sql.Timestamp的JAVA API就明确说了:
    鉴于 Timestamp 类和上述 java.util.Date 类之间的不同,建议代码一般不要将 Timestamp 值视为 java.util.Date 的实例。Timestamp 和 java.util.Date 之间的继承关系实际上指的是实现继承,而不是类型继承。
      

  4.   

    从逻辑观点上看不正确就是说,Stack本来可用成员函数就是很少的像push,pop等。而直接继承Vector后,该Stack拥有了Vector的所有成员函数。因此从逻辑上看很奇怪。
      

  5.   

    这只不过是共享了Vector的一些属性和方法,但Stack不是Vector他是一个全新的类,他有他自己的特性。
      

  6.   

    Effective java上说继承有自己的一些原则,但是显然栈并不是向量,所以栈不应该扩展向量。同样的,Properties不应该继承HashTable.这样回导致子类拥有一些父类的方法,逻辑奇怪也可能出现歧义。