黑马程序员技术交流社区

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

作者: cqdouble    时间: 2014-5-19 09:44
标题: 匿名内部类问题
  1. abstract class AbsDemo
  2. {
  3.         abstract void show();
  4.        
  5. }
  6. class Outer
  7. {
  8.         int x = 3;
  9.         public void function()
  10.         {
  11.                 AbsDemo d = new AbsDemo()    //AbsDemo是一个抽象类,不可以用new创建对象呀,这么怎么可以呢?
  12.                 {
  13.                         int num = 9;
  14.                         void show()
  15.                         {
  16.                                 System.out.println("num==="+num);
  17.                         }
  18.                         void abc()
  19.                         {
  20.                                 System.out.println("haha");
  21.                         }
  22.                 };

  23.                 d.show();
  24.         }
  25. }
  26. class InnerClassDemo4
  27. {
  28.         public static void main(String[] args)
  29.         {
  30.                 new Outer().function();
  31.         }
  32. }
复制代码


AbsDemo是一个抽象类,不可以用new创建对象呀,这么怎么可以呢?
作者: 李维奥    时间: 2014-5-19 11:02
实际上创建的是AbsDemo的一个子类,他继承了AbsDemo类,并且实现了AbsDemo中的方法:
关于匿名内部类
1,匿名内部类其实就是内部类的简写格式。
2,定义匿名内部类的前提:
        内部类必须是继承一个类或者实现接口。
3,匿名内部类的格式:  new 父类或者接口(){定义子类的内容}
4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。        可以理解为带内容的对象。
5,匿名内部类中定义的方法最好不要超过3个。
作者: heima_xyu    时间: 2014-5-19 11:17
因为匿名内部类,是创建子类。定义匿名内部类的前提:
内部类必须继承一个类或者实现接口。

用new创建的对象并不是该抽象类的对象,而是它子类的对象。定义匿名内部类,是因为临时需要继承实现某些方法,而达到省去重新建立新的类的麻烦。
作者: mayor125    时间: 2014-5-19 11:44
本帖最后由 mayor125 于 2014-5-19 11:45 编辑

AbsDemo d = new AbsDemo()这条语句中的new AbsDemo()表示的是AbsDemo这个类的子类,用父类引用接收子类对象,这是多态的表现形式。

因为匿名内部类没有名字,也就无法调用匿名内部类当中定义的多个方法,但是却可以给匿名内部类起个名字,用父类进行接收,也就是AbsDemo d,这样就可以通过对象的形式调用匿名内部类当中的方法。
作者: 茄子    时间: 2014-5-19 12:11
同意楼上沙发所说!!!
作者: 雨落千木的时节    时间: 2014-5-19 12:25
这里new的不是AbsDemo类,而是AbsDemo类的子类,这个类是匿名类,使用AbsDemo类型的变量d指向这个匿名类(即多态中的父类引用指向子类对象)
作者: 段兆洋    时间: 2014-5-19 15:37
本帖最后由 段兆洋 于 2014-5-19 15:39 编辑

他们说的太罗嗦了,估计楼主应该是没注意一点:AbsDemo d = new AbsDemo()  这句后面没有分号好么?! 有分号才是一句话,就是创建对象,没有分号,后面{}这是匿名内部类好么
也就是
AbsDemo d = new AbsDemo();
AbsDemo d = new AbsDemo(){...}
两者你要区分开





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