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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 依然AI 中级黑马   /  2012-12-29 21:47  /  2233 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 依然AI 于 2012-12-30 12:57 编辑

接口能被实例化吗  毕老师讲课我记着说的是不能被实例化
但是枚举和匿名内部类都实例化写出来了 只是里面复写了它的全部方法
在20天的课程的分割那个视频的时候 这样的代码
                final Iterator<FileInputStream> it=al.iterator();
                Enumeration<FileInputStream> e=new Enumeration<FileInputStream>() {
                        
                        public FileInputStream nextElement() {
                                // TODO Auto-generated method stub
                                return it.next();
                        }
                        
                        @Override
                        public boolean hasMoreElements() {
                                // TODO Auto-generated method stub
                                return it.hasNext();
                        }
                };
               
接口能否被实例化的问题
还有就是接口里用到的变量为什么都要是final 修饰的  求解答

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

13 个回复

倒序浏览
这是面向接口编程嘛, Enumeration<FileInputStream> e=new Enumeration<FileInputStream>() {...}这个不是实例化接口,
是多态的,父类引用指向子类对象

当内部类定义在局部位置时,访问的局部变量必须是最终类型的。

毕老师说过:其实匿名内部类就是一个匿名子类对象

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。
final的定义,是为了常量更加严禁,更加安全,在实现里面常量时,在后期确保不被修改。
接口是不能直接实例化的,你这里的d必然是某一个实现了IDependency 借口的class传递进来的。
不过也经常这样用到,看上去是直接实例化:
Runnable task = new Runnable() {
  public void run() {
  }
};
这里必然要实现接口的方法。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 依然AI 于 2012-12-29 22:54 编辑

额 我百度了好久找到了答案 其实和2楼的朋友说的意思一样 只不过更详细 下面是复制过来的 参考知道
Enumeration<FileInputStream> e = new Enumeration<FileInputStream>() {};后面还有一个大括号  就相当于是实现了这个类 相当于是子类 这么个大概意思。。 谢谢捧场
那并不是创造接口的实例,接口是不能直接实例化的,就像你说的,得经过实现后才行。
而你列举的java.util.Enumeration arg_names = request.getParameterNames();这个并不是直接实例化,request.getParameterNames();返回的是Enumeration接口被实现后的对象,那是一个向上塑形的过程。可以这么看,实现接口的类可以看作是该接口的子类(这是java实现多重继承的解决方法)。所以那么写是合法的。好比有父类A,B是其子类,那么我们就可以这么写 A a=new B();这里的A就相当于Enumeration ,而new B()就相当于request.getParameterNames();返回的对象。你可以参看下面这个例子:

interface Face{
  String prt();
}

class FaceImpl implements Face{
  public String prt(){
    return "implements Face";
  }
}

class Middle{
  public static Face getFace(){
    return new FaceImpl();
  }

class Last{
  public Last(){
    //下面这句就相当于你的 java.util.Enumeration arg_names = request.getParameterNames();
    Face f = Middle.getFace();
    f.prt();
  }
}






评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
王少雷 发表于 2012-12-29 22:00
接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。
final的定义,是为了常量更加严禁, ...

百度的就别来回复了 会影响思路的 回答的问题和问的问题一点不挂边。。。
回复 使用道具 举报
本帖最后由 依然AI 于 2012-12-29 22:49 编辑

网络问题回复重叠了  删除掉
回复 使用道具 举报
本帖最后由 依然AI 于 2012-12-29 22:49 编辑

网络问题回复重叠了  删除掉
回复 使用道具 举报
心犀香 发表于 2012-12-29 21:57
这是面向接口编程嘛, Enumeration e=new Enumeration() {...}这个不是实例化接口,
是多态的,父类引用指 ...

Enumeration<FileInputStream> e=new Enumeration<FileInputStream>() {...}  怎么是多态呢  ?
回复 使用道具 举报
本帖最后由 依然AI 于 2012-12-29 22:49 编辑

网络问题回复重叠了  删除掉
回复 使用道具 举报
李敬卫 来自手机 中级黑马 2012-12-29 22:26:46
10#
对于楼主接口中的变量为什么要final修饰。我是这样理解的:因为接口本身就是对外提供的一种规则,你要实现这个接口,也就是说要按照他的规则办事,对于接口中的变量,如果不加final,那么实现他的子类就能任意修改他的值,这样下来,显然是违背了人们定义接口的目的。这是我的看法,解释的不好请指出
回复 使用道具 举报
心犀香 发表于 2012-12-29 21:57
这是面向接口编程嘛, Enumeration e=new Enumeration() {...}这个不是实例化接口,
是多态的,父类引用指 ...

谢谢指点
回复 使用道具 举报
李敬卫 发表于 2012-12-29 22:26
对于楼主接口中的变量为什么要final修饰。我是这样理解的:因为接口本身就是对外提供的一种规则,你要实现 ...

谢谢  嗯  接口的定义的变量是这样的
但是我的问题里面的是实现接口的类调用外面的变量也要是finnal
这样就是2楼朋友说的那样
当内部类定义在局部位置时,访问的局部变量必须是最终类型的。
涉及到内部类的知识了
回复 使用道具 举报
依然AI 发表于 2012-12-29 22:24
Enumeration e=new Enumeration() {...}  怎么是多态呢  ?

右边是子类对象啊
回复 使用道具 举报
关于Final :
final修饰基本类型(非引用类型)。这时参数的值在方法体内是不能被修改的,即不能被重新赋值。否则编译就通不过。在方法体内修改了基本数据类型变量的值,在Eclipse中则会提示:“ The final local variable param1 cannot be assigned. It must be blank and not using a compound assignment.“final 修饰引用类型。这时参数变量所引用的对象是不能被改变的。作为引用的拷贝,参数在方法体里面不能再引用新的对象。否则编译通不过。

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