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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘 佳 中级黑马   /  2012-9-26 11:42  /  2117 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘 佳 于 2012-9-26 11:44 编辑

练习四第十九题,毕老师讲的有点不懂,大侠帮我仔细分析一下。。为什么里面是show()。。搞不懂

interface Test
{
        void func();
}
class Demo
{
        public static void main(String[] args)
        {
                //补足代码;(匿名内部类)

               
                new Demo().show(new Test())
                {
                        public void func(){}
                };

               
        }
        void show(Test t)
        {
                t.func();
        }
}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
红字部分用到了匿名内部类,但是楼主写的不对。
new Demo().show(new Test(){
     public void func(){}
});

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上说的对,你也可以持有其引用,Test t = new Test(){  public void func(){}};  t.func();匿名内部类,就是实现抽象方法。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
杜佳瑞 发表于 2012-9-26 11:54
红字部分用到了匿名内部类,但是楼主写的不对。
new Demo().show(new Test(){
     public void func(){}

能不能把具体的思路告诉我?就是这个类是怎么想到怎么写出来的。。我不理解
回复 使用道具 举报
interface Test
{
        void func();
}
class Demo
{
        public static void main(String[] args)
        {
                //补足代码;(匿名内部类)
                               new Demo().show(new Test()        //解释:第一个show方法调用的是自己的show,第二个show调用的是实现接口后的show
                                                                               //你的代码稍微有点不对,可以参考修改后的代码
                {
                        public void func(){
       System.out.println("运行正常");
      }
                });
               
        }
        void show(Test t)
        {
                t.func();
        }
}
运行结果:

1jpg.jpg (3.64 KB, 下载次数: 42)

1jpg.jpg

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
刘 佳 发表于 2012-9-26 12:06
能不能把具体的思路告诉我?就是这个类是怎么想到怎么写出来的。。我不理解 ...

首先,你是要调用Demo这个对象的show()方法。这个show()方法中要传入一个Test类型的对象,但是Test是一个接口,不能直接创建对象,所以只能创建实现这个接口的子类对象,常规方法再写一个Test接口的子类,也许这一个子类对象只用一次,所以就没必要那么麻烦,于是引出了匿名内部类的概念。
形式呢就是你程序中写的那样:
new Demo()创建一个匿名Demo类对象,并调用show()方法。
其中show()中传入一个Test引用对象。
new Test(){复写Test接口的抽象方法};
我记得视频中讲的很清楚,再仔细看看
回复 使用道具 举报
杜佳瑞 发表于 2012-9-26 12:23
首先,你是要调用Demo这个对象的show()方法。这个show()方法中要传入一个Test类型的对象,但是Test是一个 ...

我不明白的地方是  为什么要调用Demo的show()方法。。。
回复 使用道具 举报
刘 佳 发表于 2012-9-26 13:17
我不明白的地方是  为什么要调用Demo的show()方法。。。

这就没法解释了,程序是这样设计的。其实最终调用的也是func(),你也可以直接调用
new Test(){
    public void func(){}
}.func();
回复 使用道具 举报
本帖最后由 王得新 于 2012-9-26 13:45 编辑

interface Test
{
        void func();
}
class Demo
{
        public static void main(String[] args)
        {
                //补足代码;(匿名内部类)
             /* Demo     demo=new Demo();//在这里创建一个对象,这个对象就是Demo这个类的一个实例,用这个对象干啥?(楼主想问的是为什么调show()
方法),当然是对Demo这个类进行操作了,怎么操作就是用对象调用show()方法啊,demo.show();
               demo.show(new Test(){   public void func();    });
             */
                new Demo().show(new Test())
                {
                        public void func(){}
                };

               
        }
        void show(Test t)
        {
                t.func();
        }
}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我不明白的地方是  为什么要调用Demo的show()方法。。。


因为要实现Test接口里面的抽象方法func(),所以必须要调用;这样回答是不是够简单了




回复 使用道具 举报
谢谢大家,我自己再斟酌下,有点笨,死脑筋,呵呵~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马