A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘文飞 中级黑马   /  2012-11-28 21:32  /  2009 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘文飞 于 2012-11-29 18:08 编辑

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

Enumeration en = new Vector().elements();//返回的也是Enumeration类型
en.hasMoreElements();

5 个回复

倒序浏览
首先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();//对比一下

评分

参与人数 1技术分 +1 收起 理由
杨千里 + 1

查看全部评分

回复 使用道具 举报
此处是java多态的体现,实际是在调用子类覆盖的方法。
回复 使用道具 举报
新立 发表于 2012-11-28 23:02
首先Enumeration是个接口,你的疑问是不是接口不能实例化?
这里的en是对象的引用,而废实例化 ,这和接口 ...

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

Vector中的elements方法返回的是Enumeration类型而不是
实现了Enumeration的子类的对象。所以这里应该不存在多态的啊。
回复 使用道具 举报
本帖最后由 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");
            }
        };
    }

点评

正解,看来我的小例子还是有局限性,  发表于 2012-11-29 22:42

评分

参与人数 1黑马币 +10 收起 理由
新立 + 10 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马