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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sunalong 中级黑马   /  2013-7-16 09:49  /  1543 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-17 21:15 编辑

看到这样一道java题:匿名内部类是否可以继承其他类?是否可以实现接口?
  我知道匿名的内部类是没有名字的内部类,无法继承其他类,但一个内部类
  是否能作为一接口,由另一个类实现呢?能给出代码示例吗?

评分

参与人数 1黑马币 +3 收起 理由
杨兴庭 + 3

查看全部评分

8 个回复

倒序浏览
我觉得可以继承也可以实现。因为匿名内部类就是通过一个已经存在的类或者接口来的。比如
new Thread()
{
    pubilc void run(){}
}
这个就是一个Thread类的子类对象。继承自Thread类
new Runnable()
{
      public void run(){}   
}
这个是一个实现了Runnable接口的子类对象。所以可以实现接口。
楼主说   “但一个内部类是否能作为一接口,由另一个类实现呢?能给出代码示例吗?“  是不可以的。因为一般匿名内部类都是一个已经存在的对象了,而且没有名字的。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
匿名内部类实际上已经extends了一个父类了,
一个类只能extends一个父类,
例:private void test(){
//匿名内部类,OutClass实例
new OutClass(){
//override something
}
}
等价于:
class InnerClass extends OutClass{
//override something
}
OutClass oc = new InnerClass();

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报

首先是内部类可以继承其他类的,  也可以实现接口, 跟外部类在多态上的表现方式没有什么区别吧
一个内部类作为一个接口让其他类实现的话, 其实。  自我感觉的话 理论上可行,。  但实际上没有任何需求吧?
设想如果一个类想继承或者是实现 一个内部类, 那么前提就是需要让这个内部类所在的外部类先加载。 这个道理 你应该会懂吧?
首先会不会太麻烦, ? 作为开发者的角度, 如果这个类需要共有的话。 为什么不抽取出来作为接口或者抽象类 之类的,非要作为内部类而纯在呢

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
我觉得匿名类就无法进行继承和实现操作,。
回复 使用道具 举报
我在网上找到了答案  不是本人的,希望能对你有帮助



可以继承其他类,也可以实现接口。看下边的例子,摘自Think in Java,The 2nd Edition.

先定义一个接口:
interface Contents {
  int value();
}

再定义一个类(构造函数不是默认的):
public class Wrapping {
  private int i;
  public Wrapping(int x) { i = x; }
  public int value() { return i; }
}

先实现接口:
public class Parcel6 {
  public Contents cont() {
    return new Contents() {
      private int i = 11;
      public int value() { return i; }
    }; // Semicolon required in this case
  }
  public static void main(String[] args) {
    Parcel6 p = new Parcel6();
    Contents c = p.cont();
  }
}

再继承类:
public class Parcel7 {
  public Wrapping wrap(int x) {
    // Base constructor call:
    return new Wrapping(x) {
      public int value() {
        return super.value() * 47;
      }
    }; // Semicolon required
  }
  public static void main(String[] args) {
    Parcel7 p = new Parcel7();
    Wrapping w = p.wrap(10);
  }
}

更详细请看Think in Java,现在是The 3rd Edition.

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
masterV 来自手机 中级黑马 2013-7-17 04:50:00
7#
可以实现接口和继承父类,毕老师视频中有,关于匿名内部类作为接口,首先匿名内部类实际上是“匿名内部类对象”,一个对象怎么能作为接口呢?
回复 使用道具 举报
本帖最后由 清心玉质 于 2013-7-17 14:06 编辑

毕老师有讲过定义匿名类的前提就是内部类必须是继承一个类或者实现接口。
下面是两个匿名类继承类和实现接口的简单应用例子:
abstract class AbsDemo{abstract void show();}
class Outer
{int x =3;

  void function()
  {
   new AbsDemo()//这里就是匿名类继承了AbsDemo类
   {

    void show()
    {
    System.out.println("show"+x);
    }.show();
   }
  }
}
new Inner().function();

}
class InnerClassDemo3
{
   public static void main(String[] args)
     {
          new Outer().method(7);
          System.out.println("Hello World!");
     }
}

实现接口的:
interface Inter
{
void method();
}
class Test
{
static inter function()//补足代码,通过匿名内部类
    {
             return new Inter()
   
                    {
                             public void method()
                                          {
                                                  System.out.println("method run");
                                         }
                       };
      }
}

class InnerClassTest
{
    public static void main(String[] args)
      {
         Test.function().method;
      }
}

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
李江 中级黑马 2013-7-17 21:24:21
9#
这个是可以的,你可看看java提供的源文件:AbstractList.java,这是典型的内部类,其内部类头是:class SubList<E> extends AbstractList<E> {}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马