黑马程序员技术交流社区

标题: Enumeration的对象调用其抽象方法? [打印本页]

作者: 刘文飞    时间: 2012-11-28 21:32
标题: Enumeration的对象调用其抽象方法?
本帖最后由 刘文飞 于 2012-11-29 18:08 编辑

Enumeration中的两个方法只是两个抽象方法,
en怎么可以直接调用呢。

Enumeration en = new Vector().elements();//返回的也是Enumeration类型
en.hasMoreElements();
作者: 新立    时间: 2012-11-28 23:02
首先Enumeration是个接口,你的疑问是不是接口不能实例化?
这里的en是对象的引用,而废实例化 ,这和接口定义不冲突,接口不允许实例化换句话说就是不能new。应该明白吧。
想想多态,向上和向下转型,接口的引用连接子类的实例化对象,
小例子,帮助理解
interface Animal {
        public void eat();
}

class Cat implements Animal{
        @Override
        public void eat() {
        }
}

Animal a = new Cat();
a.eat(); //这的a是不是和en一样呢?
Enumeration en = new Vector().elements();//对比一下
作者: 冯盼    时间: 2012-11-29 10:16
此处是java多态的体现,实际是在调用子类覆盖的方法。
作者: 刘文飞    时间: 2012-11-29 13:24
新立 发表于 2012-11-28 23:02
首先Enumeration是个接口,你的疑问是不是接口不能实例化?
这里的en是对象的引用,而废实例化 ,这和接口 ...

那个小例子明白,直接往上转型,有多态,
但是Vector中的elements方法返回的是Enumeration类型而不是
实现了Enumeration的子类的对象。所以这里应该不存在多态的啊。
作者: 刘文飞    时间: 2012-11-29 13:25
yunhaitian 发表于 2012-11-29 10:16
此处是java多态的体现,实际是在调用子类覆盖的方法。

Vector中的elements方法返回的是Enumeration类型而不是
实现了Enumeration的子类的对象。所以这里应该不存在多态的啊。
作者: 冯盼    时间: 2012-11-29 15:51
本帖最后由 yunhaitian 于 2012-11-29 15:52 编辑
刘文飞 发表于 2012-11-29 13:25
Vector中的elements方法返回的是Enumeration类型而不是
实现了Enumeration的子类的对象。所以这里应该不 ...


以下是java源码:
public Enumeration<E> elements() {
        return new Enumeration<E>() {//此处其实是一个匿名内部类实现了 Enumeration的部分方法,是多态,只是他的子类是以匿名内部类出现的           
         
             int count = 0;
            public boolean hasMoreElements() {
                return count < elementCount;
            }

            public E nextElement() {
                synchronized (Vector.this) {
                    if (count < elementCount) {
                        return elementData(count++);
                    }
                }
                throw new NoSuchElementException("Vector Enumeration");
            }
        };
    }




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2