黑马程序员技术交流社区

标题: 关于匿名内部类的问题,涉及多态。 [打印本页]

作者: 李哲    时间: 2012-3-27 17:55
标题: 关于匿名内部类的问题,涉及多态。
abstract class AbsDemo
{
        abstract void show();
}
class Outer
{
        int x=3;       
       
        public void function()
        {               
                //情况1
                AbsDemo d=new AbsDemo()
                {
                        int num=3;
                        void show()
                        {
                                System.out.println("num="+num);
                        }
                        void abc()
                        {
                                System.out.println("hello");
                        }
                };
                d.show();
                d.abc();//编译失败
               
                //情况2
                new AbsDemo()
                {
                        int num=3;
                        void show()
                        {
                                System.out.println("num="+num);
                        }
                        void abc()
                        {
                                System.out.println("hello");
                        }
                }.abc();               
        }       
}

class InnerClassDemo4
{
        public static void main(String[] args)
        {
                new Outer().function();
        }       
}

为什么情况1中的d.abc();不可以通过编译,情况2中的abc()方法就可以呢?

我觉得应该都不可以啊。
作者: izwj    时间: 2012-3-27 18:10
编译时,看引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。AbsDemo中没有方法abc(),所以编译失败。
情况2中,不涉及多态(父类引用),所以没有问题。
作者: 许飞翔    时间: 2012-3-27 18:33
为什么情况1中的d.abc();编译不通过?
是因为 AbsDemo d=new AbsDemo()创建一个对象,而你d.abc();调用的abc();方法在AbsDemo中没有此方法,所以编译失败;而情况2使用匿名内部类方式调用的abc();在匿名内部类当中
作者: 和心愿    时间: 2012-3-27 23:48
d是AbsDemo类的对象,在AbsDemo中没有abc()方法
  后面那个 匿名内部类  new的对象是AbsDemo类的对象  因此可以

作者: 抓哇    时间: 2012-3-28 10:22
...你这个匿名内部类自己造个方法马上调用是可以的 调用完随着分号结束就结束了 那你第二种情况怎么去调用它呢  这个abc方法已经消亡了呀
作者: 葛尧    时间: 2012-3-28 16:32
本帖最后由 葛尧 于 2012-3-28 16:40 编辑

这不就是匿名内部类的局限性吗。
AbsDemo d=new AbsDemo(){};
d 是父类对象指向子类引用 多态。。
所以d.abc()会编译失败,父类中没这个方法

而new AbsDemo(){}.abc();
这是新建了一个子类对象,子类中有这个特有方法,所以后面可以调用abc()的方法

但是没有任何引用指向这个对象,所以这句执行完毕后就被释放了。。





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