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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘源 中级黑马   /  2012-8-5 17:41  /  2372 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘源 于 2012-8-5 23:11 编辑

匿名内部类也是一个类,是否可以extends(继承)其他类?
是否可以实现interface接口?
如果可以的话,什么情况下一般用得比较多啊?

问题已经解决”。

5 个回复

倒序浏览
本帖最后由 张雪磊 于 2012-8-5 17:57 编辑

匿名内部类不是可以继承一个类或实现一个接口,而是必须继承一个类或实现一个接口。
匿名内部类:
1,匿名内部类其实就是内部类的简写格式。
2,定义匿名内部类的前提:
        内部类必须是继承一个类或者实现接口。
3,匿名内部类的格式:  new 父类或者接口(){定义子类的内容}
4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。        可以理解为带内容的对象。
5,匿名内部类中定义的方法最好不要超过3个。

其实你写一个匿名内部类比如下面这个匿名内部类:

                 new AbsDemo()
                {
                        int num = 9;
                        void show()
                        {
                                System.out.println("num==="+num);
                        }
                        void abc()
                        {
                                System.out.println("haha");
                        }
                };
上面这段代码表达的就是:用new表示这是一个对象,而这个对象他的父类就是AbsDemo,也就是说这个匿名内部类是AbsDemo的子类,而具体这个子类的名字叫什么,不知道,匿名嘛!大括号里面的内容实际上是这个没有名字的类覆盖父类的方法。别以为AbsDemo是这个类的名字,他是这个对象父类的名字。

评分

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

查看全部评分

回复 使用道具 举报
这个是必须的!
匿名内部类必须继承一个父类或实现一个借口,但最多只能继承一个父类或实现一个接口
这是和匿名内部类定义息息相关的。
要想实现匿名内部类 就必须继承一个父类或实现一个借口

楼主应该对匿名内部类的概念很模糊吧

使用匿名内部类就是为了更好的封装代码 匿名内部类不能重复使用
因此匿名内部类适合创建那种只需要一次使用的类

匿名内部类在我们学习java初期用到得很少
一般到后面的设计层面上会用到 但用到的也很少。

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 很给力!

查看全部评分

回复 使用道具 举报
匿名内部类就是内部类的简写格式。
定义匿名内部类的前提就是其必须是继承一个类或者实现接口
匿名内部类的格式:  new 父类或者接口(){定义子类的内容}
匿名内部类就是一个匿名子类对象。而且这个对象内容较多。可以理解为带内容的对象。
当方法不超过3个时可以考虑使用匿名内部类。
  1. abstract class AbsDemo
  2. {
  3.         abstract void show();
  4. }

  5. class Outer
  6. {
  7.         int x = 3;
  8.         /*
  9.         class Inner extends AbsDemo
  10.         {
  11.                 void show()
  12.                 {
  13.                         System.out.println("method :"+x);
  14.                 }
  15.         }
  16.         */
  17.         public void function()
  18.         {
  19.                 //new Inner().show();
  20.                
  21.                 new AbsDemo()
  22.                 {
  23.                         void show()
  24.                         {
  25.                                 System.out.println("x==="+x);
  26.                         }
  27.                 }.show();
  28.         }
  29. }

  30. class InnerClassDemo2
  31. {
  32.         public static void main(String[] args)
  33.         {
  34.                 new Outer().function();
  35.         }
  36. }
复制代码
此例就是内部类跟匿名内部类的写法,注释部分为内部类写法,未注释的地方是匿名内部类写法。
回复 使用道具 举报
先说下什么是匿名内部类:匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。这就要采用另一种形式的new语句,如下所示: new <类或接口> <类的主体> 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。如果匿名类实现了一个接口,它的主体必须实现接口的方法。
  所以是可以继承其他类和实现接口的,顺便赠送匿名内部类注意事项都是老师讲课的时候自己的笔记,希望可以帮楼主更好的理解
  注意匿名类的声明是在编译时进行的,实例化在运行时进行。这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。
在使用匿名内部类时,要记住以下几个原则:
 匿名内部类不能有构造方法。  
 匿名内部类不能定义任何静态成员、方法和类。  
 匿名内部类不能是public,protected,private,static。  
 只能创建匿名内部类的一个实例。
  一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。  
 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
  内部类只能访问外部类的静态变量或静态方法。

  
回复 使用道具 举报
楼主的意思是匿名内部类定义后再继承或实现接口吧。匿名内部类本身已经相当于是继承或实现接口了。如:
new Father()
{}
以上代码相当与定义了一个继承了Father类的类,或者实现了一个Father接口。
如果是Father类,那么再写一个extends就是多继承了,这是不行的。
如果是Father接口,
new Father()
{}implements A
Java是支持多实现的,但是这时你怎么使用你的内部类?因为内部类是只能使用一次的。
所以说匿名内部类是不能再继承或实现的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马