抽象类和匿名类

时间:2011-03-01 12:30:04

标签: java abstract anonymous-class

abstract class Two {
    Two() {
        System.out.println("Two()");
    }
    Two(String s) {
        System.out.println("Two(String");
    }
    abstract int  display();
}
class One {
    public Two two(String s) {
        return new Two() {          
            public int display() {
                System.out.println("display()");
                return 1;
            }
        };
    }
}
class Ajay {
    public static void main(String ...strings ){
        One one=new One();
        Two two=one.two("ajay");
        System.out.println(two.display());
    }
}

我们无法实例化一个抽象类,那么为什么函数两个二(String s)能够创建一个抽象类的实例两个 ????

2 个答案:

答案 0 :(得分:10)

它不会创建抽象Two的实例。它创建了一个具体的匿名类,扩展了Two并实例化它。

这几乎等同于使用这样的命名内部类:

class One {
    public Two two(String s) {
        return new MyTwo();
    }

    class MyTwo extends Two {
        public int display() {
            System.out.println("display()");
            return 1;
        }
    }
}

答案 1 :(得分:2)

因为它实现了缺失的函数display()。它返回一个匿名子类Two。如果查看编译后的文件,可以看到这个。你将有一个One $ 1.class,它扩展了Two.class!