黑马程序员技术交流社区

标题: 关于匿名内部类的问题 [打印本页]

作者: 施家雄    时间: 2013-3-3 12:01
标题: 关于匿名内部类的问题
abstract class AbsDemo
{
        abstract void show();
}
class Outer
{
        int x=3;
        public void function()
        {
                new AbsDemo()
                {
                        void show()
                        {
                                System.out.println("x=="+x);
                        }
                }.show();      //这里不是很理解。
        }        
}

class InnerClassDemo
{
        public static void main(String[] args)
        {
                new Outer().function();
        }
}
/*
上面注释的地方不是很明白。觉得不加.show()也行的,可以就是出错了,说那行要分号(;)哪位大能给我详细讲下,谢谢了。

*/
作者: 陈圳    时间: 2013-3-3 12:06
public void function()
        {
                new AbsDemo()
                {
                        void show()
                        {
                                System.out.println("x=="+x);
                        }
                }.show();      //这里不是很理解。你写这个函数的意思很明确啊,就是在function里添加了一个匿名内部类对象,然后在对象里复写了抽象类的接口里的抽象方法,然后.show()调用啊.
其实与正常的实现接口中方法,再调用是一样的,只不过这是用于匿名对象一次性使用.因为只使用一次,所以弄一个匿名对象,而要实现接口,就必须复写接口中方法.所以采用这种方式,如果你不调用show()方法,那这个function方法岂不是完全没有意义.
        }        
作者: Gaara    时间: 2013-3-3 12:11
其实下面这句这就是重写了父类的show()方法

new AbsDemo()
                 {
                         void show()
                         {
                                 System.out.println("x=="+x);
                         }
                 }.show();

.show之前的内容就是一个对象,(有点胖的带内容的对象)
是抽象父类的子类的对象。


也可以写成new 内部类名.show()  

就跟你新建个对象   在调用方法一样
只不过这么写简化书写
作者: 闵华勇    时间: 2013-3-5 14:59
此处是AbsDemo 的匿名对象。相当于AbsDemo abs=new AbsDemo(); 然后调用abs.show();
  1. new AbsDemo()
  2.                 {
  3.                void show()
  4.                    {
  5.                      System.out.println("x=="+x);
  6.                         }
  7.                 }.show().
复制代码

作者: 施家雄    时间: 2013-3-11 12:30
陈圳 发表于 2013-3-3 12:06
public void function()
        {
                new AbsDemo()

嗯。。。谢谢了,现在明白了。之前就是模糊。
作者: 猫腻    时间: 2013-3-13 10:07
如果仍有问题,可以继续追问;若没有问题了,请及时将帖子分类改成【已解决】~

http://bbs.itheima.com/thread-37643-1-1.html





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