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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄陂酷歌 中级黑马   /  2014-3-18 17:23  /  1598 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. abstract class AbsDemo{
  2.         abstract void show();
  3. }
  4. class Outer{
  5.         int x = 3 ;
  6.         public void function(){
  7.                 new AbsDemo(){
  8.                         void show(){
  9.                                 System.out.println("inner"+x);
  10.                         }
  11.                 }.show();//.show()怎么理解,前面一大堆是个对象吗?//是的话有怎么理解
  12.         }
  13. }
  14. class NoNameInnerClassDemo{
  15.         public static void main(String[] args) {
  16.                 new Outer().function();
  17.         }
  18. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

11 个回复

倒序浏览
前面是相当于创建了一个对象,而.show()是调用这个对象中的方法。
回复 使用道具 举报
那一大堆可以理解为一个对象,是说有一个类继承了AbsDemo,复写了show方法并调用。
回复 使用道具 举报
从new 开始到末尾就相当于定义了一个匿名内部类对象,并覆写了抽象类中的抽象方法, 并调用了show()方法。
回复 使用道具 举报 1 0
匿名内部类的定义规则是:使用该类继承的接口或者是父类,new 接口/父类( ){主体程序(包含成员变量与成员方法)};一般情况下成员方法不超过三个。这种方法new出来的整体就可以看做是匿名内部类的实例,花括号后面可以跟上该类所属的方法表示调用(匿名内部类.方法)

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
new Outer().function(),为了调用function方法,而要调用function就得新建个匿名对象new Outer()
而function()方法中有个show()方法,由于show()方法是在抽象类中,所以要调用抽象类中的方法就必须继承它并且复写,可以新建个类名,并继承Abstract,但该函数并未新建类来继承,而是可以直接新建个父类对象,来带代表匿名子类对象而这个方式父类引用指向子类对象,就是属于匿名内部类

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
孟茹 中级黑马 2014-3-18 20:14:56
7#
new AbsDemo(){                         void show(){                                 System.out.println("inner"+x);                         }                 }这个是匿名内部类的格式创建对象的格式,不过这个是复写了父类(抽象类AbsDemo)show方法,毕老师说这就是个格式,记住就好。如果不想那样调用show方法的话,也可以这样:Inter in=new AbsDemo(){viod show();}   in.show;
回复 使用道具 举报
孟茹 中级黑马 2014-3-18 20:19:15
8#
new AbsDemo(){
                        void show(){
                                System.out.println("inner"+x);
                        }
                }
这个是匿名内部类的格式创建对象的格式,不过这个是复写了父类(抽象类AbsDemo)show方法,毕老师说这就是个格式,记住就好。如果不想那样调用show方法的话,也可以这样:
Inter in=new AbsDemo(){
      viod show();  }  
     in.show;

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
  1. new AbsDemo(){
  2.                         void show(){
  3.                                 System.out.println("inner"+x);
  4.                         }
  5.                 }
复制代码

这块相当于创建了一个匿名内部类对象,之后调用其show方法,可以看成
  1. AbsDemo absDemo = new AbsDemo(){
  2.                         void show(){
  3.                                 System.out.println("inner"+x);
  4.                         }
  5.                 };   
  6. absDemo.show();
复制代码
回复 使用道具 举报
  • new AbsDemo(){
  •          void show(){
  •               System.out.println("inner"+x);
  •          }
  • }.show();




首先,AbsDemo是个抽象类,根据Java的定义,抽象类是要被继承并重写里面的抽象方才能实例化的
所以,要实例化AbsDemo不行,就要先定义其一个子类,并重写show方法

通过实例化其子类,来创建对象
于是上面的代码可以分为三部分理解:
1.new AbsDemo():这部分等于是创建了继承AbsDemo的对象,虽然是new的AbsDemo本身,但内部是作为其子类看的
2.void show() {}:上面已经继承了AbsDemo,那么下面就应该实现父类的抽象方法了,要将方法体具体实现
3.{}.show():这是在用新建的AbsDemo的子类对象调用其重写的show()方法,既然子类对象已经创建,就可以调用方法了


通过上面你可以发现,虽然实例化的是AbsDemo的子类,但并没有出现子类的名称,所以也就是为什么叫匿名内部类的原因了



回复 使用道具 举报
其实匿名内部类就相当于一个子类的实例(或者叫做对象),在这个实例中重写了父类的抽象方法,其格式是:  new AbsDemo(){重写接口或者接口的方法}.function。老毕老师也讲过,这只是一种格式,记住就好。但注意:一般重写的方法要少于等于三个才使用内部类的格式,否则会显得格式臃肿,不便于阅读。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
可以理解为 void show().show()
void show(){}  大括号中的内容()   “System.out.println("inner"+x)”
是实现了抽象类 AbsDemo  的show()方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马