黑马程序员技术交流社区

标题: 匿名内部类到底可不可以继承其他类? [打印本页]

作者: 罗旭维    时间: 2012-4-27 10:21
标题: 匿名内部类到底可不可以继承其他类?
网上搜也是有说可以有说不可以的。
作者: 施俊    时间: 2012-4-27 10:35
匿名内部类本身不就是一个类的子类或者一个接口的实现类么?既然继承是单向的,怎么会继承其他类呢?也没法写呀。
作者: 邓斌    时间: 2012-4-27 10:37
继承Object
作者: 光sail    时间: 2012-4-27 10:37
可以的,
匿名内部类(Anonymous Inner Class ):匿名内部类会隐式地继承一个父类或实现一个接口。
使用匿名内部类时,new +类名/接口名
  1. import java.util.Date;

  2. public class AnonymousInnerClassTest
  3. {
  4. @SuppressWarnings("deprecation")
  5. public String get(Date date)
  6. {
  7. return date.toLocaleString();
  8. }

  9. public static void main(String[] args)
  10. {
  11. AnonymousInnerClassTest test = new AnonymousInnerClassTest();



  12. String str = test.get(new Date()  <FONT color=red<FONT color=red>>//这个就是继承Date类并实现Date类中的 toLocaleString()方法</FONT>
  13. </FONT>{
  14. public String toLocaleString()
  15. {
  16. return "hello world";
  17. }
  18. });

  19. System.out.println(str);
复制代码

作者: 张卯    时间: 2012-4-27 10:42
我也查了查,个人理解是这样的
说可以的意思是说:匿名内部类定义时就已经继承了某个类的,建立的是匿名子类对象
说不可以的意思是说:因为本来已经继承了某个类所以不可以再继承其他类,所以不能再写extends语句

作者: 孙天    时间: 2012-4-27 10:46
内部类必须继承了一个外部类,或者实现了外部的接口
new 父类名or接口名(){子类的具体内容}
其实匿名内部类就是一个子类匿名对象
内部类的访问规则:
1,内部类可以直接访问外部类中的成员
2,外部类需要创建内部类对象才可以访问内部类中的成员
在描述事物时,事物中还有具体的事物,而且这个内部事务在访问着外部事物的内容,这时对这内部事务的描述,就可以用内部类来完成
内部类处于外部类的成员位置上是可以被成员修饰符所修饰的
作者: 丁佼    时间: 2012-4-27 10:47
匿名内部类本身就是一个对父类或者接口的简短继承和直接实现,再继承一个类,应该是不能吧。
new Runnable extend ArrayList(){}
这样的代码,怎么看也不舒服嘿,

再实现几个接口的话应该是可以的,
new ArrayList implement Runnable (){}
至少看着不是很怪异。

============================
不过最直接的验证还是把代码拿去编译,java说,我上面两种都不可以。。。。
判断:
1、java不可以在匿名内部类上再继承或实现接口
2、从实际工作需要判断一下,这种继承和接口实现是否需要。显然普通类有这种需求,匿名内部类也是类,不会没有,有需要,在实现上那就肯定是可以的,只是洒家不知道怎么写。
3、跪求高手出现。。。。工作做了,要是不发出来我就抑闷了。。。

作者: 施俊    时间: 2012-4-27 10:48
问的是其他类而不是自己已经继承的那个类吧?要是是的话就不能继承其他类。原因见沙发
作者: 韩新凯    时间: 2012-4-27 10:52
匿名内部类继承接口,还有Object是所有类的父类,所以应该是可以继承的。
作者: 常万    时间: 2012-4-27 10:56
在Swing开发时,大家应该经常用到下面的代码:
JButton btnTest = new JButton();
btnTest.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// do something here
}};

通过匿名内部类的使用,我们可以方便地建立一个只能在此按钮中起作用的一个ActionListener接口的实现,这个实现只在该位置可用。

那么,能不能将这里的接口改为一个抽象类,甚至一个普通的类呢?看一下下面代码:

public class Test {
public static void main(String[] args)
{
  Demo d = new Demo()
  {
   protected void showMessage()
   {
    System.out.println("Printed by inner class");
   }
  };
  d.showMessage();
}
}
class Demo
{
protected void showMessage()
{
  System.out.println("Printed by demo");
}
}


代码运行结果为:

Printed by inner class

同样,如果我们只需要一次性地重写某类的一个方法,同样也可以使用这种方式,在定义一个对象时对这个类进行匿名地继承,产生一个需要的特殊的类。





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