黑马程序员技术交流社区

标题: new 接口 [打印本页]

作者: 侠客梦的懒猫    时间: 2013-12-15 16:45
标题: new 接口
对我们学习过程中,遇到很多这样的问题,就是

(new Runnable(){

})

或是
new InvocationHandler(){

}

这些接口都可以直接new吗?还是其实new的就是一个实例!!


作者: 侠客梦的懒猫    时间: 2013-12-15 23:41
专走泥泞路,谢谢你,你说的很好,但经过自己查阅,我补充一下,相互学习,接口与抽象类是不能直接new的,如果我们new Runnable(),这是通过不了编译的,但是注意如果加{},也就是这样new Runnable(){},他表示的并不是接口创建对象,而是接口实现的实例去创建的对象,但是这个实例并没有名字。希望多多交流,Thank哦
作者: 潘际昌    时间: 2013-12-15 23:48
本帖最后由 潘际昌 于 2013-12-15 23:49 编辑

这是匿名内部类,利用多态,用父类来来new的匿名子类对象或者匿名实现类对象,但是必须把接口内的抽象方法复写掉,这样才可以编译通过!
作者: litaojisuanji    时间: 2013-12-16 00:16
本帖最后由 litaojisuanji 于 2013-12-16 00:19 编辑

这个是匿名内部类,利用到了多态的技术,和Animal a = new Dog();一样的道理,
接口是不能直接new的,因为接口中都是抽象的方法,
而匿名内部类可以直接new,因为匿名内部类实现的接口中的方法。
如下:
  1. //创建一个接口
  2. interface Inter
  3. {
  4.         public abstract void show();
  5. }

  6. class Outer
  7. {
  8.         public void method()
  9.         {
  10.                  //匿名内部类:new 接口{实现接口的方法}.方法名
  11.                  new Inter()
  12.                 {
  13.                         public void show()
  14.                         {
  15.                                 System.out.println("show");
  16.                         }
  17.                 }.show();

  18.         }
  19. }

  20. class Demo
  21. {
  22.         public static void main(String[] args)
  23.         {
  24.                 Outer o = new Outer();
  25.                 o.method();
  26.         }
  27. }
复制代码




作者: 雨的印记yp    时间: 2013-12-16 00:53
这是匿名内部类,其实new出来的是接口的实现类的匿名对象。这个实现类和对象都是匿名的。这也是java的多态。




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