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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 侠客梦的懒猫 中级黑马   /  2013-12-15 16:45  /  1159 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对我们学习过程中,遇到很多这样的问题,就是

(new Runnable(){

})

或是
new InvocationHandler(){

}

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

评分

参与人数 2技术分 +1 黑马币 +5 收起 理由
滔哥 + 1
乔兵 + 5

查看全部评分

4 个回复

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

这是匿名内部类,利用多态,用父类来来new的匿名子类对象或者匿名实现类对象,但是必须把接口内的抽象方法复写掉,这样才可以编译通过!
回复 使用道具 举报
本帖最后由 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. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
这是匿名内部类,其实new出来的是接口的实现类的匿名对象。这个实现类和对象都是匿名的。这也是java的多态。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马