黑马程序员技术交流社区

标题: 关于接口的疑问 [打印本页]

作者: 依然AI    时间: 2012-12-29 21:47
标题: 关于接口的疑问
本帖最后由 依然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 修饰的  求解答

作者: 冉世友    时间: 2012-12-29 21:57
这是面向接口编程嘛, Enumeration<FileInputStream> e=new Enumeration<FileInputStream>() {...}这个不是实例化接口,
是多态的,父类引用指向子类对象

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

毕老师说过:其实匿名内部类就是一个匿名子类对象
作者: 王少雷    时间: 2012-12-29 22:00
接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。
final的定义,是为了常量更加严禁,更加安全,在实现里面常量时,在后期确保不被修改。
接口是不能直接实例化的,你这里的d必然是某一个实现了IDependency 借口的class传递进来的。
不过也经常这样用到,看上去是直接实例化:
Runnable task = new Runnable() {
  public void run() {
  }
};
这里必然要实现接口的方法。
作者: 依然AI    时间: 2012-12-29 22:22
本帖最后由 依然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();
  }
}







作者: 依然AI    时间: 2012-12-29 22:22
王少雷 发表于 2012-12-29 22:00
接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。
final的定义,是为了常量更加严禁, ...

百度的就别来回复了 会影响思路的 回答的问题和问的问题一点不挂边。。。
作者: 依然AI    时间: 2012-12-29 22:23
本帖最后由 依然AI 于 2012-12-29 22:49 编辑

网络问题回复重叠了  删除掉
作者: 依然AI    时间: 2012-12-29 22:23
本帖最后由 依然AI 于 2012-12-29 22:49 编辑

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

Enumeration<FileInputStream> e=new Enumeration<FileInputStream>() {...}  怎么是多态呢  ?
作者: 依然AI    时间: 2012-12-29 22:25
本帖最后由 依然AI 于 2012-12-29 22:49 编辑

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

谢谢指点
作者: 依然AI    时间: 2012-12-29 22:58
李敬卫 发表于 2012-12-29 22:26
对于楼主接口中的变量为什么要final修饰。我是这样理解的:因为接口本身就是对外提供的一种规则,你要实现 ...

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

右边是子类对象啊

作者: 嘿嘿小学徒    时间: 2012-12-30 14:31
关于Final :
final修饰基本类型(非引用类型)。这时参数的值在方法体内是不能被修改的,即不能被重新赋值。否则编译就通不过。在方法体内修改了基本数据类型变量的值,在Eclipse中则会提示:“ The final local variable param1 cannot be assigned. It must be blank and not using a compound assignment.“final 修饰引用类型。这时参数变量所引用的对象是不能被改变的。作为引用的拷贝,参数在方法体里面不能再引用新的对象。否则编译通不过。






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