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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Cola 中级黑马   /  2013-11-20 12:09  /  1023 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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类的对象吗?可是抽象类不能建立实例,求解答。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

5 个回复

倒序浏览
new AbsDemo()
           {
                   void show()
                       {
                               System.out.println("x= "+x);
                        }
            }.show();
其实就是创建了AbsDemo匿名子类,然后复写了show方法,并调用
而不是创建AbsDemo的实例对象
回复 使用道具 举报
new AbsDemo()并不是对抽象类创建对象,其实就相当于对抽象类AbsDemo()建立了子类,并对抽象类中的抽象方法show进行了重写。
回复 使用道具 举报
public void function(){...........}这一对大括号里不是要重写show方法吗? 重写完了再调用对吧? 那么如果现在他有名字,我们就可以用他子类名字创建对象然后调用,现在他没名字,我们就只能new他的父类,但这个过程其实是创建子类对象,这样的话就有了子类对象调用show方法了.(个人理解,建议回去看一下匿名内部类,那里讲的很清楚.....子类没名字所以new父类从而创建子类对象,大概就是这样)

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
        public void function()
        {
                final int x=3;
                new AbsDemo()
                {
                        void show()
                        {
                                System.out.println("x= "+x);
                        }
                }.show();
        }
这是定义并重写匿名类的书写方式,记住就行,定义了AbsDemo的重写后的子类并调用show()方法。
楼主,感觉你的代码中有一个bug。
final int x=3;才可以被局部内部类访问。
回复 使用道具 举报
赵许星 发表于 2013-11-20 18:41
public void function()
        {
                final int x=3;

x是Outer类的成员变量时,内部类可以调用的。局部变量确实得用final修饰。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马