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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李哲 中级黑马   /  2012-3-27 17:55  /  1909 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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()方法就可以呢?

我觉得应该都不可以啊。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

5 个回复

倒序浏览
编译时,看引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。AbsDemo中没有方法abc(),所以编译失败。
情况2中,不涉及多态(父类引用),所以没有问题。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
为什么情况1中的d.abc();编译不通过?
是因为 AbsDemo d=new AbsDemo()创建一个对象,而你d.abc();调用的abc();方法在AbsDemo中没有此方法,所以编译失败;而情况2使用匿名内部类方式调用的abc();在匿名内部类当中
回复 使用道具 举报
d是AbsDemo类的对象,在AbsDemo中没有abc()方法
  后面那个 匿名内部类  new的对象是AbsDemo类的对象  因此可以
回复 使用道具 举报
...你这个匿名内部类自己造个方法马上调用是可以的 调用完随着分号结束就结束了 那你第二种情况怎么去调用它呢  这个abc方法已经消亡了呀
回复 使用道具 举报
本帖最后由 葛尧 于 2012-3-28 16:40 编辑

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

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

但是没有任何引用指向这个对象,所以这句执行完毕后就被释放了。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马