黑马程序员技术交流社区

标题: 匿名内部类 [打印本页]

作者: 冯敏    时间: 2011-11-25 12:58
标题: 匿名内部类
本帖最后由 xiaoyu_min 于 2011-11-25 15:14 编辑

匿名内部类可以继承其他类或实现接口吗?
作者: 侯伟浩    时间: 2011-11-25 13:04
可以继承其他类或实现其他接口。不仅是可以,而是必须!
如:
  1. public class My2 extends JFrame{
  2.        
  3.         public My2()
  4.         {
  5.                 JButton bu=new JButton();
  6.                 bu.addActionListener(new ActionListener(){

  7.                         public void actionPerformed(ActionEvent e) {
  8.                                
  9.                         }
  10.                        
  11.                 });
  12.         }
  13.         public static void main(String args[])
  14.         {
  15.         }
复制代码
上边的代码就是一个典型的匿名内部类,它是实现了ActionListener接口的类。
匿名内部类必须要实现一个接口。
作者: 刘永昌    时间: 2011-11-25 13:08
刚开始我也有点糊涂,后来认真的看了别人的知识整理,明朗了许多,看看吧!

匿名内部类。
顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。

A、继承式的匿名内部类。
    class Car {
        public void drive(){
            System.out.println("Driving a car!");
        }
    }
   
    class Test{
        public static void main(String[] args) {
            Car car = new Car(){
                public void drive(){
                    System.out.println("Driving another car!");
                }
            };
            car.drive();
        }
    }
结果输出了:Driving another car! Car引用变量不是引用Car对象,而是Car匿名子类的对象。
建立匿名内部类的关键点是重写父类的一个或多个方法。再强调一下,是重写父类的方法,而不是创建新的方法。因为用父类的引用不可能调用父类本身没有的方法!创建新的方法是多余的。简言之,参考多态。

B、接口式的匿名内部类。
    interface  Vehicle {
        public void drive();
    }
   
    class Test{
        public static void main(String[] args) {
            Vehicle v = new Vehicle(){
                public void drive(){
                    System.out.println("Driving a car!");
                }
            };
            v.drive();
        }
    }
上面的代码很怪,好像是在实例化一个接口。事实并非如此,接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。

C、参数式的匿名内部类。
class Bar{
    void doStuff(Foo f){}
}

interface Foo{
    void foo();
}

class Test{
    static void go(){
        Bar b = new Bar();
        b.doStuff(new Foo(){
            public void foo(){
                System.out.println("foofy");
            }
        });
    }
}


作者: 刘涛    时间: 2011-11-25 13:16
匿名的内部类是没有名字的内部类。
不能继承其它类,但一个内部类可以作为一个接口,由另一个内部类实现.
作者: 颜小飞    时间: 2011-11-25 13:35
名内部类本身是一个实现了某个接口或者继承了某个存在类的子类。如果它是一个子类。那么它就不能在继承其它的类了。而如果它是一个实现接口的类,那么接口后面是不能再跟implements 来实现其它接口的。我测试了的,不能跟其它的类或者实现其它接口。
作者: 冯敏    时间: 2011-11-25 15:14
我明白了,谢谢楼上各位~~
作者: 王丰盛568    时间: 2011-11-25 21:06
匿名内部类
如果一个类只使用一次,那么可以定义为匿名内部类。
使用 new 父类名(){类定义} 形式声明,先创建一个指定类的子类,然后根据这个类创建一个对象。
匿名内部类的class文件名为:外部类名$编号.class
通常使用匿名内部类来实现一个接口
class AnonymousInnerClass {
       
        public static void main(String[] args){
               
                A a = new A(){                                // 写了一个A类的子类, 并且用这个类创建了一个对象
                        public void fun(){
                                System.out.println("匿名内部类的fun");       
                        }
                };
               
                test(a);
               
        }       
       
        public static void test(A a){
                a.fun();
        }
}

abstract class A {
        abstract public void fun();
}






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