接口可以被new吗

biangege87v5 2012-07-13 11:46:27
为什么new ActionListener(){} 可以这样,接口可以被new吗?
...全文
11672 87 打赏 收藏 转发到动态 举报
写回复
用AI写文章
87 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
后面加花括号的写法 实际上声明了一个匿名类来实现你那个接口 常见于传递函数作为参数的情况 当然花括号里面要把接口的所有方法也实现 不然还是new不成
software_gemeng 2014-05-04
  • 打赏
  • 举报
回复
引用 3 楼 haiercs 的回复:
1 接口不能new 2 new ActionListener(){} 这种形式是匿名类的形式,省略了写一个具体类实现ActionListener接口的开销
3楼正解
yuhouqingchen_2648 2014-05-04
  • 打赏
  • 举报
回复
接口不能被new,但是可以new实现该接口方法的匿名类
iwordword 2014-05-04
  • 打赏
  • 举报
回复
引用 4 楼 netsgo 的回复:
楼主你可以这么理解,new ActionListener(){} 相当于动态的实现了接口,在内存中建立了一个ActionListener对象,区别就是这个对象的实现类就直接在另一个代码中定义了,而不是独立的文件。 我们一般称这种类为匿名类,当然,匿名类不止实现接口这一种。 比如 一个接口 A ,里面有一个方法fun1(),一般我们是先定义它的实现再引用它,比如 public class ImpA implements A{ public void fun1(){ //do some thing... } } 然后在另一个类调用 public class Class1 { public void method1(){ A a = new ImpA(); } } 但有时我想对这个接口做另一个实现不想使用ImpA,但由于是临时的又不想去做定义,则你就可以这样 public class Class1 { public void method1(){ A a = new A(){ //相当于在内存中直接产生了一个接口的实现并引用这个内存对象。动态的代码 public void fun1(){ //do some thing... } }; } } 匿名类的其它作用你可以百度或谷歌一下,这里就不赘述了。
这个解答很详细,这也是最负责任的解答。 接口确实不能 new,但如果只是这样笼统的说不能 new,但在匿名类当中,有些接口名又确实跟在 new 的后面,会让人产生疑惑的。
小童鞋_成er 2014-04-29
  • 打赏
  • 举报
回复
概述: 1、接口中定义的方法都是abstract public 的,如果我们不写abstract public 编译成class文件会自动添加。 2、接口中定义的变量都是public final static的,关于final也就是必须赋初始值。 3、接口中的方法既然是abstract,那么也就是说这个接口也是abstract的。

//定义一个接口
interface A{
   String name = "AAA";//这里的name必须赋值,建议接口里面的变量都大写
   void add(); //没有修饰符
   public void update();//有public公共修饰符
}
//首先编译javac A.java
//这里我们可以使用javap A   可以看到里面的方法都是abstract public的,变量是public final static的。

//接口是不能被new的,这里给大家解释一下,拿A接口来讲
public class TestDemo{
    public static void main(String[] args){
         new A(){//关于这里,是一种匿名内部类的写法,一会下面有对应 有名内部类的复杂格式,这也可看成一种简写格式
             //实现接口中的所有方法,不多说
            public void add(){} //这里说一下,重新接口里面的方法,必须都是public修饰,负责报错
            public void update(){};
         }.add(); //这里我们可以用调用一个方法

         //复杂的写法,也称有名内部类
         class B implements A{
              //累了,我就实现一个方法得了
              public void add(){}
         }
         public static void main(String[] args){
                 B b = new B();
                  b.add(); 
         }
    }
}
lliiqiang 2014-04-29
  • 打赏
  • 举报
回复
这是一个匿名类的写法.
Edward_Van 2014-04-27
  • 打赏
  • 举报
回复
接口是肯定不可以new的、
ly907635649 2014-04-25
  • 打赏
  • 举报
回复 1
接口不能被实例,只能通过类去实现接口,重写抽象方法,可以生成实现接口类的实例,然后在操作!!
高傲的苹果 2014-04-25
  • 打赏
  • 举报
回复
不行。。。。
alan19931103 2014-04-25
  • 打赏
  • 举报
回复
不可以,这个写法表示匿名类。意思是new 一个新类,这个新类实现了这样的接口。
sbbtcsdbn 2014-04-24
  • 打赏
  • 举报
回复
接口不能NEW的。同样。抽象类也不可以new
xuebichongkafei 2014-04-23
  • 打赏
  • 举报
回复
接口不能被new的,你描述的是在后面实现了接口的匿名类,所以可以用interface XXXX = new XXXX(){ 重写方法 }
levelnini 2014-04-22
  • 打赏
  • 举报
回复
new ActionListener(){} 你可以这么理解:我需要的是一个实现了ActionListener接口的对象,只不过这个对象没有具体的类型。而实现接口是需要实现接口里面的方法的。所以这个时候就需要在{}中去实现对应的方法。 就好比,我要一个苹果,至于这个苹果是什么品种的都行,只要是苹果就行了。
u013330547 2014-04-22
  • 打赏
  • 举报
回复
想说了都被说了,打个酱油,混个助攻,那是匿名类,不是new接口,你可以把它当做一个类
張Eason- 2014-04-15
  • 打赏
  • 举报
回复
接口是抽象类,,,不能实例化对象。。
meiproject 2014-04-12
  • 打赏
  • 举报
回复
都是正解,我是来凑人数的
zpwd63 2014-04-12
  • 打赏
  • 举报
回复
个人觉得如果是新手完全可以理解为 接口没有构造方法,没法实例化。因为new一个对象实际上是在调用类里面的构造函数。
蓝调_Z 2014-04-12
  • 打赏
  • 举报
回复
引用 楼主 biangege87v5 的回复:
为什么new ActionListener(){} 可以这样,接口可以被new吗?
接口被实现,不能new
小白-彬 2014-04-12
  • 打赏
  • 举报
回复
引用 13 楼 cong_zhou_a 的回复:
首先要搞清楚接口是用来干嘛的,接口就是一个标准; 这个标准里面有一些方法,没有方法体,要覆写; 既然没有方法体,当然不能被new啦; Java不能同时继承多个类,但是可以继承多个接口; 接口可以用来变相的继承多个类;
弱弱的问一句,既然没有方法体,当然不能被new啦。为什么呢?
灰太狼A代 2014-04-12
  • 打赏
  • 举报
回复
这个相当于 定义一个接口的引用指向其实现类的对象。。。。。
加载更多回复(66)

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧