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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cqdouble 中级黑马   /  2014-5-19 09:44  /  2187 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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创建对象呀,这么怎么可以呢?

点评

认真看视频.毕老师讲的很详细 Ps:{}就是new一个子类  发表于 2014-5-19 13:19

7 个回复

倒序浏览
实际上创建的是AbsDemo的一个子类,他继承了AbsDemo类,并且实现了AbsDemo中的方法:
关于匿名内部类
1,匿名内部类其实就是内部类的简写格式。
2,定义匿名内部类的前提:
        内部类必须是继承一个类或者实现接口。
3,匿名内部类的格式:  new 父类或者接口(){定义子类的内容}
4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。        可以理解为带内容的对象。
5,匿名内部类中定义的方法最好不要超过3个。

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
因为匿名内部类,是创建子类。定义匿名内部类的前提:
内部类必须继承一个类或者实现接口。

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

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

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

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

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马