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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© laoyang 黑马帝   /  2011-11-20 19:38  /  4501 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 laoyang 于 2011-11-21 08:31 编辑

视频中在创建匿名内部类时,直接new 一个抽象类,我很困惑,不是说抽象类和接口不能创建对象只能被继承吗?

4 个回复

倒序浏览
抽象类应该是不能显示创建对象。
如果 new 一个子类对象,那么 JVM 首先就会创建一个抽象类的实例并调用其构造函数的,然后把这个抽象类对象包含在子类对象中,并通过  super关键子引用.

  按 thinking in java 里所说,创建子类对象的时候,首先会递归的创建父类对象,并借助父类构造函数完成对父类对象的初始化。那么当父类为抽象类的时候,JVM 也同样会自动创建抽象父类的对象,然后把它包含在子类对象中。如此一来,我们平时所说的不能创建抽象类的对象并不准确了,只是我们不能在语法上写出  new abstractClass() 而已,但在继承体系中,JVM其实会自动创建的.

点评

学习了!!!  发表于 2011-11-21 00:42
回复 使用道具 举报
java的匿名内部类的语法规则看上去有些古怪,不过如同匿名数组一样,当你只需要创建一个类的对象而且用不上它的名字时,使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的:

  new interfacename(){......}; 或 new superclassname(){......};
我感觉,这个只是个规则,java定义这样写,可以简化代码,所以就这样写了。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
抽象类是不能直接new,因为有未实现的方法,但可以通过new了以后再实现未实现的方法这样就是合理的,这样直接new再实现抽象方法就成了匿名内部类了,其实你也可以在一个类中继承或实现该抽象类,都是一样的,只是一个有名字一个没有名字而且.

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
赵超 黑马帝 2011-11-21 00:35:59
报纸
new一个抽象类运用的匿名内部类,想简单点就是new的是抽象类的子类,只不过子类是没有类名的,所以叫匿名内部类,只有一个实例。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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