黑马程序员技术交流社区

标题: 内部类的疑问 [打印本页]

作者: Cola    时间: 2013-11-20 12:09
标题: 内部类的疑问
本帖最后由 Cola 于 2013-11-20 21:15 编辑
  1. abstract class AbsDemo
  2. {
  3.         abstract void show();
  4. }

  5. class Outer
  6. {
  7.         int x=3;
  8.         public void function()
  9.         {
  10.                 new AbsDemo()
  11.                 {
  12.                         void show()
  13.                         {
  14.                                 System.out.println("x= "+x);
  15.                         }
  16.                 }.show();
  17.         }
  18. }
复制代码
AbsDemo是一个抽象类,Outer类的匿名内部类里写了new AbsDemo(),请问其中new AbsDemo()的写法是建立AbsDemo类的对象吗?可是抽象类不能建立实例,求解答。

作者: zy888802    时间: 2013-11-20 12:16
new AbsDemo()
           {
                   void show()
                       {
                               System.out.println("x= "+x);
                        }
            }.show();
其实就是创建了AbsDemo匿名子类,然后复写了show方法,并调用
而不是创建AbsDemo的实例对象

作者: 段光宇    时间: 2013-11-20 12:36
new AbsDemo()并不是对抽象类创建对象,其实就相当于对抽象类AbsDemo()建立了子类,并对抽象类中的抽象方法show进行了重写。
作者: Massive    时间: 2013-11-20 14:47
public void function(){...........}这一对大括号里不是要重写show方法吗? 重写完了再调用对吧? 那么如果现在他有名字,我们就可以用他子类名字创建对象然后调用,现在他没名字,我们就只能new他的父类,但这个过程其实是创建子类对象,这样的话就有了子类对象调用show方法了.(个人理解,建议回去看一下匿名内部类,那里讲的很清楚.....子类没名字所以new父类从而创建子类对象,大概就是这样)
作者: 赵许星    时间: 2013-11-20 18:41
        public void function()
        {
                final int x=3;
                new AbsDemo()
                {
                        void show()
                        {
                                System.out.println("x= "+x);
                        }
                }.show();
        }
这是定义并重写匿名类的书写方式,记住就行,定义了AbsDemo的重写后的子类并调用show()方法。
楼主,感觉你的代码中有一个bug。
final int x=3;才可以被局部内部类访问。
作者: Cola    时间: 2013-11-20 21:14
赵许星 发表于 2013-11-20 18:41
public void function()
        {
                final int x=3;

x是Outer类的成员变量时,内部类可以调用的。局部变量确实得用final修饰。




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